Est-ce que / usr / sbin / nologin en tant que shell de connection sert à des fins de security?

Dans mon file /etc/passwd , je peux voir que l'user www-data utilisé par Apache, ainsi que toutes sortes d'users du système, ont /usr/sbin/nologin ou /bin/false comme shell de connection. Par exemple, voici une sélection de lignes:

 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin games:x:5:60:games:/usr/games:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin syslog:x:101:104::/home/syslog:/bin/false whoopsie:x:109:116::/nonexistent:/bin/false mark:x:1000:1000:mark,,,:/home/mark:/bin/bash 

Par conséquent, si j'essaie de permuter à l'un de ces users (ce que je voudrais parfois faire pour vérifier ma compréhension de leurs permissions et pour laquelle il y a probablement d'autres raisons, au less à mi-path), j'échoue:

 mark@lunchbox:~$ sudo su www-data This account is currently not available. mark@lunchbox:~$ sudo su syslog mark@lunchbox:~$ 

Bien sûr, ce n'est pas très gênant, car je peux toujours lancer un shell pour eux via une méthode comme celle-ci:

 mark@lunchbox:~$ sudo -u www-data /bin/bash www-data@lunchbox:~$ 

Mais cela me laisse juste me requestr quel but est servi en refusant à ces users un shell de connection. Si l'on se réfère à Internet pour get des explications, de nombreuses personnes affirment que cela a un lien avec la security et tout le monde semble s'accorder sur le fait qu'il serait en quelque sorte une mauvaise idée de changer les coquilles de connection de ces users. Voici une collection de citations:

Définir le shell de l'user Apache sur quelque chose qui n'est pas interactif est généralement une bonne pratique de security (en fait, tous les users de services qui n'ont pas à se connecter de manière interactive doivent avoir un shell non interactif).

– https://serverfault.com/a/559315/147556

le shell de l'user www-data est mis à / usr / sbin / nologin, et il est configuré pour une très bonne raison.

– https://askubuntu.com/a/486661/119754

[counts système] peuvent être des failles de security , en particulier si un shell est activé:

  • Mal

     bin:x:1:1:bin:/bin:/bin/sh 
  • Bien

     bin:x:1:1:bin:/bin:/sbin/nologin 

– https://unix.stackexchange.com/a/78996/29001

Pour des raisons de security, j'ai créé un count d'user sans shell de connection pour l'exécution du server Tomcat:

 # groupadd tomcat # useradd -g tomcat -s /usr/sbin/nologin -m -d /home/tomcat tomcat 

– http://www.puschitz.com/InstallingTomcat.html

Bien que ces messages soient unanimes à l'effet que le fait de ne pas donner aux users du système de véritables shells de connection est bon pour la security, aucun d'entre eux ne justifie cette affirmation et je ne trouve aucune explication là-dessus.

À quelle attaque essayons-nous de nous protéger en ne donnant pas à ces users de véritables coquilles de connection?

Si vous jetez un oeil à la page de manuel de nologin , vous verrez la description suivante.

extrait

nologin affiche un message indiquant qu'un count n'est pas disponible et sort non-zéro. Il est conçu comme un champ de shell de rlocation pour refuser l'access à un count.

Si le file /etc/nologin.txt existe, nologin affiche son contenu à l'user au lieu du message par défaut.

Le code de sortie renvoyé par nologin est toujours 1.

Donc, l'intention réelle de nologin est juste de sorte que lorsqu'un user tente de se connecter avec un count qui l'utilise dans le /etc/passwd , il se présente avec un message convivial et que tout script / tenter de faire usage de cette connection recevoir le code de sortie de 1.

Sécurité

En ce qui concerne la security, vous verrez généralement /sbin/nologin ou parfois /bin/false , entre autres dans ce champ. Ils servent tous les deux le même but, mais /sbin/nologin est probablement la méthode préférée. En tout cas, ils limitent l'access direct à un shell comme ce count d'user particulier.

Pourquoi est-ce considéré comme précieux en matière de security?

Le «pourquoi» est difficile à décrire complètement, mais la limitation du count d'un user de cette manière est qu'elle empêche l'access direct via l'application de login lorsque vous tentez d'accéder à ce count d'user.

Utiliser nologin ou /bin/false accomplit ceci. Limiter la surface d'attaque de votre système est une technique courante dans le monde de la security, qu'il s'agisse de désactiver des services sur des ports spécifiques ou de limiter la nature des connections sur ses systèmes.

Il y a encore d'autres rationalisations pour utiliser nologin . Par exemple, scp ne fonctionnera plus avec un count d'user qui ne désigne pas un shell réel, comme décrit dans cette FAQ sur ServerFault intitulée: Quelle est la différence entre / sbin / nologin et / bin / false? .

Définitivement, il sert un but de security. Par exemple, regardez le bug ci-dessous déposé pour un user du système qui avait un shell.

Mon server debian a été compromis en raison du count démon ayant un shell de connection valide et ayant samba ouvert pour l'access internet. La pause a été faite en définissant un mot de passe à distance via samba pour le count du démon et la connection via ssh. Un exploit root local a ensuite été utilisé pour PROPRE mon server.

Je vous recommand de lire cette merveilleuse réponse de Gilles où il a également fourni des liens vers certains des bugs.

Il y a des bogues déposés sur ce problème dans Debian (274229, 330882, 581899), actuellement ouvert et classé comme "list de souhaits". J'ai tendance à convenir que ce sont des bugs et que les users du système devraient avoir / bin / false comme shell, à less qu'il ne semble nécessaire de faire autrement.

Pour append aux excellentes réponses de @slm et @ramesh:

Oui, comme vous l'avez souligné, vous pouvez toujours passer aux users avec nologin comme shell par défaut en exécutant sudo avec un shell défini, mais dans ce cas, vous devez:

  1. Connectez-vous en tant qu'user possédant un shell valide
  2. Avoir sudo permissions configurées pour que cet user exécute la command su , et
  3. Si votre tentative su a été enregistrée dans le journal sudoers (en supposant bien sûr que la consignation sudo est activée).

Les users qui ont défini nologin comme leur shell par défaut ont souvent des privilèges plus élevés / sont capables de faire plus de dégâts au système qu'un user régulier, les empêchant ainsi de se connecter directement tente de limiter les dommages qu'une violation de votre système pourrait subir .

À côté des grandes réponses déjà données, je peux penser au scénario suivant.

Un bogue de security dans un service s'exécutant en tant qu'user restreint permet d'écrire un file en tant qu'user. Ce file peut être ~ / .ssh / authorized_keys.

Cela permet à l'attaquant de se connecter directement dans un shell ce qui faciliterait l'exécution d'une escalade de privilèges.

Refuser un shell de connection rendrait cette option beaucoup plus difficile.

En plus des excellentes réponses qui ont été données, cela a un autre but.

Si vous exécutez un démon FTP sur votre server, il vérifie le shell de connection des users qui tentent de se connecter. Si le shell n'est pas répertorié dans /etc/shells , il ne leur permet pas de se connecter. Donc, donner des counts démons un shell spécial empêche quelqu'un de modifier le count via FTP.

En général, je dirais / bin / false et / sbin / nologin sont les mêmes – mais je suppose que cela dépend du server SSH que vous utilisez.

Il serait prudent pour moi de souligner que cet exploit récent sur OpenSSH semble affecter / bin / false les connections mais PAS / sbin / nologin. Cependant, il indique que Dropbear est différent de cette manière (aussi l'exploit s'applique spécifiquement à OpenSSH).

Exploit affecte la plupart des versions:

7.2p1 et inférieur (toutes les versions datant de ~ 20 ans) Avec le transfert X11 activé

https://www.exploit-db.com/exploits/39569/

Donc, sur la base de cela – personnellement je ferais / sbin / nologin cependant je ne suis pas sûr si cela pourrait affecter les services qui créent l'input / bin / false dans / etc / passwd. Vous pouvez expérimenter et voir vos résultats, mais veuillez le faire à vos risques et périls! Je suppose que dans le pire des cas, vous pouvez simplement le changer et redémarrer tout service (s). J'ai personnellement quelques inputs en utilisant / bin / false – Je ne sais pas si je veux m'embêter avec cela car le transfert X11 n'est pas quelque chose que j'ai activé;)

Si vous utilisez OpenSSH (beaucoup de gens estiment que …) et que le transfert X11 est activé, vous pouvez envisager / sbin / nologin (ou passer à Dropbear).

Il est généralement recommandé de définir des counts de service et d'application pour une connection non interactive. Un user autorisé peut toujours avoir access à ces counts en utilisant SU ou SUDO, mais toutes leurs actions sont suivies dans les files journaux Sudoers et peuvent être retracées à l'user qui a exécuté des commands sous les privilèges de count de service. C'est pourquoi il est important de stocker les files journaux dans un système de gestion des journaux centralisé afin que les administrateurs système n'aient pas access à la modification des files journaux. L'user exécutant des commands sous SU ou SUDO est déjà autorisé à accéder au système.

D'autre part, un user externe ou non autorisé du système n'aura pas access à la connection en utilisant ces counts et c'est une mesure de security.