Dient / usr / sbin / nologin als Anmeldeshell einem Sicherheitszweck?

77

In meiner /etc/passwdDatei kann ich sehen, dass der www-datavon Apache verwendete Benutzer sowie alle Arten von Systembenutzern entweder /usr/sbin/nologinoder /bin/falseals Anmeldeshell haben. Hier zum Beispiel eine Auswahl von Zeilen:

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

Wenn ich versuche, zu einem dieser Benutzer zu wechseln (was ich manchmal tun möchte, um mein Verständnis ihrer Berechtigungen zu überprüfen, und wofür es wahrscheinlich andere, zumindest halbwegs vernünftige Gründe gibt), scheitere ich:

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

Das ist natürlich kein großer Nachteil, da ich mit einer Methode wie der folgenden immer noch eine Shell für sie starten kann:

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

Ich frage mich jedoch, welchen Zweck es hat, diesen Benutzern eine Anmeldeshell zu verweigern. Wenn man sich im Internet nach Erklärungen umsieht, behaupten viele, dass dies etwas mit Sicherheit zu tun hat, und alle sind sich einig, dass es in irgendeiner Weise eine schlechte Idee wäre, die Login-Shells dieser Benutzer zu ändern. Hier ist eine Sammlung von Zitaten:

Das Einstellen der Apache-Benutzer-Shell auf etwas Nicht-Interaktives ist im Allgemeinen eine gute Sicherheitspraxis (wirklich sollten alle Dienstbenutzer, die sich nicht interaktiv anmelden müssen, ihre Shell auf etwas setzen, das nicht interaktiv ist).

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

Die Shell für den Benutzer www-data ist auf / usr / sbin / nologin gesetzt, und dies hat einen sehr guten Grund.

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

[Systemkonten] können Sicherheitslücken sein , insbesondere wenn eine Shell aktiviert ist:

  • Schlecht

    bin:x:1:1:bin:/bin:/bin/sh
  • Gut

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

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

Aus Sicherheitsgründen habe ich ein Benutzerkonto ohne Anmeldeshell zum Ausführen des Tomcat-Servers erstellt:

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

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

Obwohl diese Posts einstimmig der Meinung sind, dass es der Sicherheit zuträglich ist, Systembenutzern keine echten Login-Shells zu geben, rechtfertigt keiner von ihnen diese Behauptung, und ich kann nirgendwo eine Erklärung dafür finden.

Gegen welche Angriffe versuchen wir uns zu schützen, indem wir diesen Benutzern keine echten Login-Shells geben?

Mark Amery
quelle

Antworten:

51

Wenn Sie sich die nologinManpage ansehen, sehen Sie die folgende Beschreibung.

Auszug

nologin zeigt eine Meldung an, dass ein Konto nicht verfügbar ist, und beendet es ungleich Null. Es ist als Ersatz-Shell-Feld gedacht, um den Login-Zugriff auf ein Konto zu verweigern.

Wenn die Datei /etc/nologin.txtvorhanden ist, nologinzeigt sie dem Benutzer anstelle der Standardnachricht den Inhalt an.

Der von zurückgegebene Exit-Code nologinist immer 1.

Die eigentliche Absicht von nologinist also, dass, wenn ein Benutzer versucht, sich mit einem Konto anzumelden, das es in der verwendet /etc/passwd, eine benutzerfreundliche Meldung angezeigt wird, und dass alle Skripte / Befehle, die dies versuchen, verwendet werden Dieses Login erhält den Exit-Code 1.

Sicherheit

In Bezug auf die Sicherheit sehen Sie in der Regel entweder /sbin/nologinoder manchmal /bin/falseunter anderem in diesem Bereich. Sie dienen beide demselben Zweck, sind aber /sbin/nologinwahrscheinlich die bevorzugte Methode. In jedem Fall beschränken sie den direkten Zugriff auf eine Shell als dieses bestimmte Benutzerkonto.

Warum wird dies in Bezug auf die Sicherheit als wertvoll angesehen?

Das "Warum" ist schwer vollständig zu beschreiben, aber der Wert der Einschränkung eines Benutzerkontos auf diese Weise besteht darin, dass der direkte Zugriff über die loginAnwendung verhindert wird, wenn Sie versuchen, über dieses Benutzerkonto Zugriff zu erhalten.

Verwenden Sie dazu entweder nologinoder /bin/false. Das Einschränken der Angriffsfläche Ihres Systems ist eine in der Sicherheitswelt weit verbreitete Technik, sei es das Deaktivieren von Diensten an bestimmten Ports oder das Einschränken der Art der Anmeldungen auf den eigenen Systemen.

Es gibt noch andere Rationalisierungen für die Verwendung nologin. Funktioniert beispielsweise scpnicht mehr mit einem Benutzerkonto, das keine tatsächliche Shell definiert, wie in den folgenden Fragen und Antworten zu ServerFault beschrieben: Was ist der Unterschied zwischen / sbin / nologin und / bin / false? .

slm
quelle
They both serve the same purpose, but /sbin/nologin is probably the preferred method.Aus Sicherheitsgründen ist `/ sbin / nologin`` nicht die bevorzugte Methode. Es verschwendet Zeit und Zyklen, um eine Antwort zu geben. Obwohl beide keine besonders gute Sicherheit bieten; Es handelt sich um tiefgreifende Verteidigungsmaßnahmen, die jedoch niemanden davon abhalten, als bestimmter Benutzer einen Befehl auszuführen.
Parthian Shot
4
@ParthianDie Zeit und die Zyklen, die zum Echo einer einzelnen fest codierten Zeichenfolge erforderlich sind, im Verhältnis zu der Arbeit, die das Betriebssystem ohnehin leistet, um herauszufinden, welche Shell für den Benutzer auszuführen ist, scheinen für jeden, der einen Denial-of-Service erstellt, unwahrscheinlich von entscheidender Bedeutung zu sein Attacke. slm schlägt nologinvor, aus UX-Gründen die bevorzugte Methode zu verwenden, nicht aus Sicherheitsgründen. Es ist verwirrend sudo su someuser, nichts zu tun und nichts zu haben, da die Anmeldeshell falseverwirrend ist. Diese beide auch noch verhindern , dass jemand aus einem Befehl als einen bestimmten Benutzer unter bestimmten Umständen ausgeführt wird , hier in Antworten beschrieben.
Mark Amery
28

Auf jeden Fall dient es einem Sicherheitszweck. Sehen Sie sich beispielsweise den folgenden Fehler an , der für einen Systembenutzer mit einer Shell vorliegt.

Mein Debian-Server wurde kompromittiert, weil der Daemon-Account eine gültige Login-Shell und Samba für den Internetzugang geöffnet hat. Der Einbruch erfolgte, indem über Samba ein Passwort für das Daemon-Konto festgelegt und die Anmeldung über ssh durchgeführt wurde. Ein lokaler Root-Exploit wurde verwendet, um meinen Server zu EIGEN.

Ich würde Ihnen empfehlen, diese wunderbare Antwort von Gilles zu lesen, wo er auch Links zu einigen der Bugs bereitgestellt hat.

Es gibt Fehler, die in Debian (274229, 330882, 581899) bezüglich dieses Problems eingereicht wurden und derzeit offen und als "Wunschliste" klassifiziert sind. Ich stimme eher zu, dass dies Fehler sind und Systembenutzer / bin / false als Shell haben sollten, es sei denn, es erscheint notwendig, etwas anderes zu tun.

Ramesh
quelle
... Ich verstehe nicht, wie das konkret von der deklarierten Shell für den Benutzer abhängt. Wenn der Angreifer nur lief ssh user@siteund das funktionierte, würden sie es nicht weiter versuchen ssh user@site /bin/bash, aber ich bin mir ziemlich sicher, dass das immer noch funktioniert, unabhängig von der deklarierten Shell.
Parthian Shot
2
@ParthianShot, anekdotischer Beweis: Auf meinem CentOS-Server gibt die Shell eines Kontos, die auf / sbin / nologin festgelegt ist, ssh user@site /bin/basheine einfache This account is currently not available.Nachricht zurück. Diese Antwort besagt
metavida
@ParthianShot basierend auf der Beschreibung, das ist nicht was passiert ist. Was passiert ist: Samba wurde falsch konfiguriert; Der Angreifer hat den SSH-Zugriff über Samba konfiguriert. Der Angreifer hat sich über ssh angemeldet. Obwohl dieser Fall offensichtlich die Schuld des Systemadministrators ist, ist es sinnvoll, den Login-Zugriff zu verhindern, wenn Sie "falsch konfiguriertes Samba" durch "ausnutzbaren Service" ersetzen, da dies die Angriffsfläche verringert. Wenn der Exploit die lokale Ausführung erlaubt, macht es natürlich keinen großen Unterschied, ob man über ssh-Zugriff verfügt oder nicht.
Marcus
18

So ergänzen Sie die hervorragenden Antworten von @slm und @ramesh:

Ja, Sie haben darauf hingewiesen, dass Sie weiterhin zu Benutzern mit nologin als Standardshell wechseln können, indem Sie sudoeine definierte Shell ausführen. In diesem Fall mussten Sie jedoch Folgendes tun :

  1. Melden Sie sich als ein anderer Benutzer mit einer gültigen Shell an
  2. Haben Sie Sudo-Berechtigungen für diesen Benutzer konfiguriert, um den suBefehl auszuführen , und
  3. Habe deinen su-Versuch im sudoers-Protokoll protokolliert (vorausgesetzt natürlich, dass die sudo-Protokollierung aktiviert ist).

Benutzer, für die nologin als Standardshell definiert ist, haben häufig höhere Berechtigungen / können dem System mehr Schaden zufügen als ein normaler Benutzer. Sie können sich daher nicht direkt anmelden, um den Schaden zu begrenzen, der bei einem Verstoß gegen Ihr System entstehen kann .

Warwick
quelle
7

Zusätzlich zu den ausgezeichneten Antworten, die gegeben wurden, dient es einem anderen Zweck.

Wenn Sie auf Ihrem Server einen FTP-Daemon ausführen, überprüft dieser die Anmeldeshell der Benutzer, die sich anmelden möchten. Wenn die Shell nicht in aufgeführt ist /etc/shells, können sie sich nicht anmelden. Wenn Sie Daemon-Konten eine spezielle Shell zuweisen, kann niemand das Konto über FTP ändern.

Barmar
quelle
7

Neben den bereits gegebenen tollen Antworten kann ich mir das folgende Szenario vorstellen.

Ein Sicherheitsfehler in einem Dienst, der als eingeschränkter Benutzer ausgeführt wird, ermöglicht das Schreiben einer Datei als dieser Benutzer. Diese Datei kann ~ / .ssh / authorized_keys sein.

Auf diese Weise kann sich der Angreifer direkt in einer Shell anmelden, was die Ausführung einer Eskalation von Berechtigungen erheblich vereinfacht.

Das Deaktivieren einer Login-Shell würde diese Option erheblich erschweren.

Eric Seynaeve
quelle
1

Im Allgemeinen würde ich sagen, dass / bin / false und / sbin / nologin dasselbe sind - aber ich nehme an, dass es davon abhängt, welchen SSH-Server Sie verwenden.

Es wäre für mich ratsam, darauf hinzuweisen, dass der jüngste Exploit von OpenSSH offenbar / bin / falsche Anmeldungen betrifft, NICHT jedoch / sbin / nologin. Es heißt jedoch, dass Dropbear in dieser Hinsicht anders ist (auch der Exploit gilt speziell für OpenSSH).

Exploit betrifft die meisten Versionen:

7.2p1 und niedriger (alle Versionen; seit ~ 20 Jahren) Mit aktivierter X11-Weiterleitung

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

Ich persönlich würde / sbin / nologin ausführen, bin mir jedoch nicht sicher, ob dies Auswirkungen auf Dienste haben könnte, die den / bin / false-Eintrag in / etc / passwd erstellen. Sie können experimentieren und Ihre Ergebnisse sehen, aber bitte tun Sie dies auf Ihr eigenes Risiko! Ich nehme an, im schlimmsten Fall können Sie es einfach zurücksetzen und alle betroffenen Dienste neu starten. Ich persönlich habe eine ganze Reihe von Einträgen mit / bin / false - Ich bin mir nicht sicher, ob ich mich darum kümmern möchte, da die X11-Weiterleitung nicht von mir aktiviert wurde.

Wenn Sie OpenSSH verwenden (glaube ich, viele Leute) UND die X11-Weiterleitung aktiviert haben, möchten Sie möglicherweise / sbin / nologin in Betracht ziehen (oder vielleicht zu Dropbear wechseln).

Gr33k
quelle
0

Es ist im Allgemeinen eine gute Sicherheitspraxis, Dienst- und Anwendungskonten auf nicht interaktive Anmeldung festzulegen. Ein autorisierter Benutzer kann weiterhin mit SU oder SUDO auf diese Konten zugreifen. Alle Aktionen werden jedoch in den Sudoers-Protokolldateien nachverfolgt und können auf den Benutzer zurückgeführt werden, der Befehle mit Dienstkontoberechtigungen ausgeführt hat. Aus diesem Grund ist es wichtig, Protokolldateien in einem zentralen Protokollverwaltungssystem zu speichern, damit Systemadministratoren keinen Zugriff auf Änderungsprotokolldateien haben. Der Benutzer, der Befehle unter SU oder SUDO ausführt, ist bereits berechtigt, auf das System zuzugreifen.

Andererseits hat ein externer oder nicht autorisierter Benutzer des Systems überhaupt keinen Zugriff auf die Anmeldung mit diesen Konten. Dies ist eine Sicherheitsmaßnahme.

John
quelle
0

Ja, es dient einem Sicherheitszweck. Es ist eine Tiefenverteidigungsmaßnahme.

Der Hauptgrund dafür ist, dass es verschiedene Software-Komponenten gibt, die Anmeldeinformationen für einen bestimmten Benutzer validieren und dann die Anmeldeshell dieses Benutzers verwenden, um einen Befehl auszuführen. Das vielleicht bemerkenswerteste Beispiel ist SSH. Wenn Sie sich erfolgreich über SSH als Benutzer authentifizieren, startet SSH die Anmeldeshell des Benutzers (oder verwendet sie, wenn Sie die ssh [email protected] 'command to run'Syntax verwenden, um den von Ihnen angegebenen Befehl auszuführen ).

Natürlich kann sich ein Angreifer im Idealfall überhaupt nicht als Benutzer authentifizieren. Angenommen, die folgende Situation tritt ein:

  • Ein Server, den Sie steuern, führt einen Webdienst als Benutzer mit einem Basisverzeichnis und einer Anmeldeshell aus
  • Ein Angreifer entdeckt eine Sicherheitsanfälligkeit in diesem Dienst, die es dem Angreifer ermöglicht, Dateien in das Basisverzeichnis des Benutzers zu schreiben

Jetzt kann Ihr Angreifer einen öffentlichen SSH-Schlüssel für schreiben ~/.ssh/authorized_keys, dann SSH einspielen und - boom! - Sie haben Shell-Zugriff auf Ihren Server.

Wenn der Benutzer stattdessen die /usr/sbin/nologinAnmeldeshell hat, ist dies für ihn auch dann authorized_keysnicht hilfreich , wenn der Angreifer den öffentlichen Schlüssel erfolgreich darauf geschrieben hat. Alles nologin, was sie damit tun können, ist die Remote-Ausführung , was nicht sehr nützlich ist. Sie können keine Granate bekommen und ihr Angriff wurde gemildert.

Für den Fall, dass dieses Szenario sehr hypothetisch erscheint, möchte ich darauf hinweisen, dass ich im Jahr 2015, etwa ein Jahr nachdem ich diese Frage gestellt hatte, genau von diesem Angriff betroffen war. Wie ein verdammter Idiot hatte ich eine Redis-Instanz ohne Passwort für die Welt offen gelassen. Es wurde vom Redis- Crackit- Angriff angegriffen, bei dem der Angreifer einen öffentlichen SSH-Schlüssel in Ihre Redis-Datenbank einfügt, dann einen Befehl sendet, der Redis anweist , den Inhalt der Datenbank zu schreiben .ssh/authorized_keys, und dann versucht, SSH einzuschalten. Ich wurde vor den Konsequenzen bewahrt meiner eigenen Inkompetenz nur durch die Tatsache, dass die Betreuer des redis-serverApt-Pakets (mit dem ich Redis installiert hatte) die Weisheit hatten, es als Redis auszuführenredisBenutzer, der kein Basisverzeichnis oder keine Anmeldeshell hat; Wären sie nicht gewesen, wäre mein Server wahrscheinlich losgelöst worden oder Teil eines Hacker-Botnets geworden.

Diese Erfahrung gab mir ein gewisses Maß an Demut und brachte mich dazu, die Bedeutung der Tiefenverteidigung zu würdigen und insbesondere Konten, auf denen Webserver, Datenbanken und andere Hintergrunddienste ausgeführt werden, keine Login-Shells zu gewähren.

Mark Amery
quelle