In meiner /etc/passwd
Datei kann ich sehen, dass der www-data
von Apache verwendete Benutzer sowie alle Arten von Systembenutzern entweder /usr/sbin/nologin
oder /bin/false
als 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?
Antworten:
Wenn Sie sich die
nologin
Manpage ansehen, sehen Sie die folgende Beschreibung.Auszug
Die eigentliche Absicht von
nologin
ist 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/nologin
oder manchmal/bin/false
unter anderem in diesem Bereich. Sie dienen beide demselben Zweck, sind aber/sbin/nologin
wahrscheinlich 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
login
Anwendung verhindert wird, wenn Sie versuchen, über dieses Benutzerkonto Zugriff zu erhalten.Verwenden Sie dazu entweder
nologin
oder/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 beispielsweisescp
nicht 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? .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.nologin
vor, aus UX-Gründen die bevorzugte Methode zu verwenden, nicht aus Sicherheitsgründen. Es ist verwirrendsudo su someuser
, nichts zu tun und nichts zu haben, da die Anmeldeshellfalse
verwirrend 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.Auf jeden Fall dient es einem Sicherheitszweck. Sehen Sie sich beispielsweise den folgenden Fehler an , der für einen Systembenutzer mit einer Shell vorliegt.
Ich würde Ihnen empfehlen, diese wunderbare Antwort von Gilles zu lesen, wo er auch Links zu einigen der Bugs bereitgestellt hat.
quelle
ssh user@site
und das funktionierte, würden sie es nicht weiter versuchenssh user@site /bin/bash
, aber ich bin mir ziemlich sicher, dass das immer noch funktioniert, unabhängig von der deklarierten Shell.ssh user@site /bin/bash
eine einfacheThis account is currently not available.
Nachricht zurück. Diese Antwort besagtSo 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
sudo
eine definierte Shell ausführen. In diesem Fall mussten Sie jedoch Folgendes tun :su
Befehl auszuführen , undBenutzer, 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 .
quelle
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.quelle
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.
quelle
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).
quelle
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.
quelle
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:
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/nologin
Anmeldeshell hat, ist dies für ihn auch dannauthorized_keys
nicht hilfreich , wenn der Angreifer den öffentlichen Schlüssel erfolgreich darauf geschrieben hat. Allesnologin
, 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 desredis-server
Apt-Pakets (mit dem ich Redis installiert hatte) die Weisheit hatten, es als Redis auszuführenredis
Benutzer, 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.
quelle