Ein konsistenter und sicherer Ansatz für kennwortlose Konten mit SSH

12

Ich muss zugeben, dass ich in einigen Fällen Server ohne Passwörter mag. Ein typischer Server ist für jeden anfällig, der physischen Zugriff darauf hat. In einigen Fällen ist es daher sinnvoll, das Kennwort physisch zu sperren und seitdem jedem physischen Zugriff zu vertrauen .

Grundlegendes Konzept

Wenn ich einen solchen Server physisch erreiche, sollte ich theoretisch in der Lage sein, Verwaltungsaufgaben ohne Passwort auszuführen, indem ich einfach rootals Login eingebe und nicht nach einem Passwort gefragt werde. Das gleiche kann für Benutzerkonten gelten, auf die jedoch physisch nicht wirklich zugegriffen werden kann. Daher werden für den (gelegentlichen) lokalen Zugriff keine Systemkennwörter benötigt.

Beim Remotezugriff auf den Server, entweder für die Verwaltung oder für das Benutzerkonto, wird voraussichtlich immer ein privater SSH-Schlüssel verwendet. Es ist sehr einfach, einen SSH-Schlüssel für ein gerade erstelltes Konto einzurichten, sodass für den (regulären) Remotezugriff keine Systemkennwörter erforderlich sind.

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

Die Schlussfolgerung ist, dass wir für solche Anwendungsfälle theoretisch keine Systemkennwörter benötigen . Die Frage ist also, wie wir die System- und Benutzerkonten so konfigurieren, dass dies auf konsistente und sichere Weise geschieht.

Details zum lokalen Zugriff

Wie stellen wir sicher, dass auf das Root-Konto lokal ohne Passwort zugegriffen werden kann? Ich glaube nicht , können wir verwenden , passwd -dwie das wird Root - Zugriff zu freizügig und ein unpriviliged Benutzer machen könnte schalten kostenlos Wurzel, die falsch ist. Wir können es nicht verwenden, passwd -lda es uns daran hindert, uns einzuloggen.

Beachten Sie, dass beim lokalen Zugriff ausschließlich die lokale Tastatur verwendet wird. Daher darf eine gültige Lösung keinen Benutzerwechsel (ob mit suoder sudo) zulassen .

Details zum Fernzugriff

Bis vor kurzem funktionierte die obige Lösung, jetzt begann SSH, nach gesperrten Benutzerkonten zu suchen. Wir können wahrscheinlich nicht passwd -daus den gleichen Gründen verwenden. Wir können es nicht verwenden, passwd -uda es sich nur darüber beschwert, dass es zu dem führen würde, was es passwd -dtut.

Für diesen Teil gibt es eine Problemumgehung mit einem Scheinkennwort.

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

Es könnte auch möglich sein, die Überprüfung gesperrter Konten in SSH vollständig zu deaktivieren, aber es wäre besser, die Unterstützung gesperrter Konten beizubehalten und sie nur zu entsperren.

Schlussnoten

Was mich interessiert, ist eine Lösung, mit der Sie sich lokal und alle Konten, einschließlich Root-Konten, aus der Ferne anmelden können, ohne Kennwörter. Andererseits darf eine Lösung die Sicherheit nur auf ausdrücklich beschriebene Weise beeinträchtigen, insbesondere nicht, indem Remotebenutzern der Zugriff auf das Root-Konto oder das Konto anderer Benutzer gewährt wird. Die Lösung sollte ausreichend robust sein, damit sie indirekt keine Sicherheitsprobleme verursacht.

Eine akzeptierte und prämierte Antwort kann die detaillierte Konfiguration einzelner Tools beschreiben oder nicht, muss jedoch die wichtigsten Punkte enthalten, um die angegebenen Ziele zu erreichen. Beachten Sie, dass dies wahrscheinlich nicht durch herkömmliche Verwendung von Tools wie gelöst werden passwd, ssh, su, sudound dergleichen.

Weitere Ideen nach dem Lesen der ersten Antworten

Nur eine Idee - der lokale Root-Zugriff könnte durch Starten von Root-Shells anstelle von Anmeldeprozessen erfolgen. Es ist jedoch weiterhin erforderlich, nur die Kennwortauthentifizierung und nicht die Authentifizierung mit öffentlichem Schlüssel zu sperren.

Pavel Šimerda
quelle
Verwenden Sie eine angepasste PAM-Konfiguration für den lokalen Zugriff ohne Kennwort und machen Sie dasselbe für Sudo- und SSH-Anmeldungen.
0xC0000022L

Antworten:

5

Anforderungen, für die ich Lösungen anbieten werde, als Stichpunkte:

  1. Anmeldung an der Root-Konsole ohne Passwort
  2. Passwortloses Root-Remote-Login von vorautorisierten Benutzern
  3. Passwortlose Remote-Anmeldung für bestimmte Konten von vorautorisierten Benutzern
  4. Passwortlose Remote-Anmeldung für jedes Konto von vorautorisierten Benutzern

Die folgenden Beispiele basieren auf Debian, da ich das hier zum Testen habe. Ich sehe jedoch keinen Grund, warum die Prinzipien nicht auf einen Vertrieb (oder ein PAM-basiertes * ix-Derivat) angewendet werden können.

Anmeldung an der Root-Konsole ohne Passwort

Ich denke, die Art und Weise, wie ich das angehen würde, wäre, PAM und die /etc/securettyKonfigurationsdatei zu nutzen.

Voraussetzung ist ein "ausreichend sicheres" Root-Passwort. Dies ist für die Konsolenanmeldung nicht erforderlich, ist jedoch vorhanden, um Brute-Force-Cracking-Versuche unrealistisch zu machen. Das Konto ist ansonsten ein ganz normales Root-Konto.

In habe /etc/pam.d/loginich die folgenden Standardzeilen für die Authentifizierung (die mit dem Schlüsselwort beginnen auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

Die referenzierte common-authInclude-Datei enthält die folgenden relevanten Zeilen:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

Die common-authDatei weist PAM an, eine Regel (die Verweigerung) zu überspringen, wenn eine "UNIX-Anmeldung" erfolgreich ist. In der Regel bedeutet dies eine Übereinstimmung in /etc/shadow.

Die auth ... pam_securetty.soLeitung ist so konfiguriert, dass Root-Anmeldungen mit Ausnahme der in angegebenen tty-Geräte verhindert werden /etc/securetty. (Diese Datei enthält bereits alle Konsolengeräte.)

Durch authleichtes Ändern dieser Zeile ist es möglich, eine Regel zu definieren, die ein Root-Login ohne Passwort von einem in angegebenen tty-Gerät erlaubt /etc/securetty. Der success=okParameter muss so geändert werden, dass er bei einer erfolgreichen Übereinstimmung okdurch die Anzahl der authzu überspringenden Zeilen ersetzt wird . In der hier gezeigten Situation ist diese Nummer 3, die zur auth ... pam_permit.soZeile springt :

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

Passwortloses Root-Remote-Login von vorautorisierten Benutzern

Dies ist ein einfaches Hinzufügen von SSH-Schlüsseln für die berechtigten Benutzer, die der Stammdatei hinzugefügt authorized_keyswerden.

Passwortlose Remote-Anmeldung für bestimmte Konten von vorautorisierten Benutzern

Dies ist auch eine einfache Aufnahme von SSH-Schlüsseln für autorisierte Benutzer, die der entsprechenden Benutzerdatei hinzugefügt .ssh/authorized_keyswerden. (Der typische Remote-Benutzer chris möchte sich passwortfrei beim lokalen Benutzer chris anmelden .)

Beachten Sie, dass Konten nach der Erstellung im standardmäßig gesperrten Zustand bleiben können (dh nur !im Kennwortfeld für /etc/shadow), aber eine Anmeldung mit SSH-Schlüssel zulassen können. Dazu muss der Benutzer root den Schlüssel in der .ssh/authorized_keysDatei des neuen Benutzers ablegen. Was nicht so offensichtlich ist, ist, dass dieser Ansatz nur verfügbar ist, wenn eingestellt UsePAM Yesist /etc/ssh/sshd_config. PAM unterscheidet zwischen !"Konto für Kennwort gesperrt, aber andere Zugriffsmethoden sind möglicherweise zulässig" und !..."Konto gesperrt. Zeitraum". (Wenn UsePAM Nogesetzt, berücksichtigt OpenSSH das Vorhandensein des !Starts des Kennwortfelds, um ein gesperrtes Konto darzustellen.)

Passwortlose Remote-Anmeldung für jedes Konto von vorautorisierten Benutzern

Mir war nicht ganz klar, ob Sie diese Einrichtung wollten oder nicht. Bestimmte autorisierte Benutzer könnten sich ohne Passwort bei jedem lokalen Konto anmelden.

Ich kann dieses Szenario nicht testen, glaube aber, dass dies mit OpenSSH 5.9 oder höher erreicht werden kann, mit dem mehrere authorized_keysDateien definiert werden können /etc/ssh/sshd_config. Bearbeiten Sie die Konfigurationsdatei, um eine zweite Datei mit dem Namen aufzunehmen /etc/ssh/authorized_keys. Fügen Sie die öffentlichen Schlüssel Ihrer ausgewählten autorisierten Benutzer zu dieser Datei hinzu, und stellen Sie sicher, dass die Berechtigungen im Besitz von root sind und nur root Schreibzugriff gewähren (0644).

Roaima
quelle
Ich muss # 1 genauer untersuchen und testen. Es sieht sehr interessant aus, obwohl immer noch ein (starkes) Passwort konfiguriert sein muss. Die # 3 ist nicht vollständig, da ein neu angelegter Benutzer heutzutage standardmäßig auch vom SSH-Login gesperrt ist. Ich habe nicht wirklich nach Punkt 4 gefragt, aber es sieht trotzdem sehr interessant aus und ich könnte tatsächlich eine Verwendung für eine solche Methode finden.
Pavel Šimerda
Das sichere Passwort für root ist erforderlich, wird jedoch nie verwendet. Ich nahm an, Sie wussten, wie man # 3 implementiert. Lassen Sie mich wissen, wenn Sie mehr Details benötigen. Auf (Debian-) Systemen ist es möglich, sich in ein neues Konto einzuspielen, für das noch kein Passwort definiert wurde, vorausgesetzt, die .ssh/authorized_keysDatei enthält den relevanten öffentlichen Schlüssel. Hilft das?
Roaima
Ich denke, ich brauche eine nette und standardmäßige Methode, um das Verhalten, das Sie unter Debian sehen, wiederherzustellen, dh, dass ein neu erstelltes Konto nur für die Kennwortauthentifizierung und nicht für einen öffentlichen Schlüssel gesperrt ist.
Pavel Šimerda
Für das Testbenutzerkonto, das ich erstellt habe, um die ssh-Anweisung in meinem vorherigen Kommentar zu bestätigen, wird !im Kennwortfeld in eine einzige angezeigt /etc/shadow. Laut Manpage zeigt dies ein gültiges Konto an, für das kein Passwort passen kann.
Roaima
1
Das ist interessant, das ist zumindest nicht so offensichtlich , danke.
Pavel Šimerda
1

Es hört sich so an, als ob Sie echte (Nicht-Root-) Benutzerkonten mit SSH-Schlüsseln und uneingeschränktem NOPASSWDZugriff über möchten sudo(was heutzutage in den meisten Linux-Distributionen standardmäßig verfügbar ist und es auch trivial ist, manuell zu installieren). Sie können für jedes Benutzerkonto leere Kennwörter festlegen (was nicht remote funktioniert). Anschließend wird der Benutzer entweder ausgeführt sudo -soder der Benutzer ~/.bash_profileenthält lediglich diesen Befehl.

Sudo

Fügen Sie jeden Benutzer zur sudoUNIX-Gruppe hinzu (z. B. usermod -a -G sudo USERNAMEhaben ältere Systeme dafür weniger intuitive Möglichkeiten; im schlimmsten Fall bearbeiten Sie sie /etc/groupsdirekt).

In /etc/sudoersoder /etc/sudoers.d/localmöchten Sie eine Zeile wie diese:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Wenn Sie einen automatischen Root-Zugriff wünschen, fügen Sie diesen dem Benutzerprofil hinzu. Denn bashdas wäre ~/.bash_profile:

sudo -s

Auf diese Weise können Sie sehen, wer angemeldet ist (versuchen whooder last), und Sie können sich anmelden /var/log/auth.log.

Passwortloses Login

Auf viel älteren Systemen können Sie den Hash einfach bearbeiten /etc/passwd(oder auf etwas älteren Systemen /etc/shadow) und entfernen, so dass z . B. bob:$1$salt$hash:12345:0:99999:7:::gerecht wird bob::12345:0:99999:7:::. Das war alles was du brauchst. Moderne Systeme mögen das nicht. Es gibt wahrscheinlich auch andere Möglichkeiten, dies zu tun, aber die Art und Weise, wie ich es gerade überprüft habe, ist wie folgt (Quelle: Leo's Random Stuff ) :

Eröffnen /etc/shadowund beobachten Sie ein Konto mit echten Informationen. Dies umfasst drei Elemente, die durch Dollarzeichen ( $) getrennt sind. Diese repräsentieren den Hash-Mechanismus, dann das Salz , dann den Hash. Beachte das Salz und führe Folgendes aus:

openssl passwd -1 -salt SALT

(Dies verwendet MD5 als Hashing-Mechanismus. Es ist ein leeres Passwort, daher sollte es Ihnen nichts ausmachen.) Wenn Sie zur Eingabe eines Passworts aufgefordert werden, drücken Sie die Eingabetaste. Speichern Sie diese Zeichenfolge, einschließlich aller nachfolgenden Punkte, und fügen Sie sie nach dem ersten Doppelpunkt in die Zeile des Benutzers ein /etc/shadow(dies sollte den vorhandenen Inhalt zwischen dem ersten und dem zweiten Doppelpunkt ersetzen). (Bitte nicht SALTals Salz verwenden!)

SSH

Ihre sshDaemon-Konfiguration befindet sich entweder in /etc/sshd_configoder /etc/ssh/sshd_config. Aus Sicherheitsgründen empfehle ich die folgenden Zeilen:

PermitRootLogin no
PermitEmptyPasswords no

Siehe die sichere Secure Shell writeup für zusätzliche Sicherheitsmaßnahmen , die Sie zu Ihrer ssh - Konfiguration hinzufügen können , um besser aushärten es gegen anspruchsvolle Angreifer.

Jetzt können sich Ihre Benutzer aufgrund leerer Passwörter nicht mehr über einloggen ssh(dies ist eine notwendige Sicherheitsmaßnahme). Dies bedeutet, dass sie sich nur mit SSH-Schlüsseln anmelden können.

Jeder Benutzer sollte für jedes seiner Client-Systeme ein SSH-Schlüsselpaar erstellen, z

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Dies erzeugt einen privaten Schlüssel bei $HOME/.ssh/id_rsaund einen öffentlichen Schlüssel bei $HOME/.ssh/id_rsa.pub. Lassen Sie sich von diesem Benutzer die öffentlichen Schlüssel senden und an die des Servers anhängen $HOME/.ssh/authorized_keys(beachten Sie, dass sich jeder Benutzer $HOME/.sshbeispielsweise im Modus 700 befinden muss mkdir -p ~user/.ssh && chmod 700 ~user/.ssh).

Benutzer, die keine SSH-Schlüssel möchten, können zum physischen System weitergeleitet werden. Dort werden sie mit ihrem leeren Kennwort angemeldet. Anschließend können sie über passwddie Shell ein Kennwort eingeben und so den Remotezugriff zulassen.

(Ich habe diese Technik tatsächlich verwendet, um den Leuten den Zugriff auf eine Sammlung von Systemen zu ermöglichen, als ich eine IT-Abteilung leitete. Sie zwang die Benutzer, SSH-Schlüssel zu verwenden, und ich musste ihnen keine Passwörter geben. Ihre Initiale ~/.bash_profilehatte unten zwei Zeilen: passwdund dann, mv ~/.bash_profile.real ~/.bash_profiledamit sie beim ersten Login ein neues Passwort setzen.)

Risiken

Sie setzen volles Vertrauen in Ihre Benutzer. Es gibt nichts, was einen Benutzer daran hindert, mit der ~/.ssh/authorized_keysDatei eines anderen Benutzers in Konflikt zu geraten und somit Ihre Fähigkeit zu ändern, den Zugriff zu widerrufen und zu überwachen. Dies ist jedoch unvermeidbar, wenn Sie den vollständigen Root-Zugriff gewähren.

Fazit

Jeder Benutzer ist jetzt Mitglied der sudo- Gruppe und hat vollständigen kennwortlosen Zugriff auf eine Root-Shell. Diese Benutzer haben keine Passwörter für ihre Konten und können sich remote mit ssh-Schlüsseln anmelden.

Wenn Sie einen Ihrer Mitarbeiter verlieren, können Sie sein Konto entfernen. Wenn einer der Laptops Ihrer Mitarbeiter gestohlen wird, können Sie den SSH-Schlüssel dieses Laptops aus der authorized_keysDatei dieses Benutzers entfernen . Wenn Sie eine Sicherheitsverletzung haben, haben Sie Protokolle, die anzeigen, wer angemeldet ist.

Adam Katz
quelle
Der Teil über sudo übersieht die Frage, da es sich ausschließlich um neue Anmeldungen und nicht um Benutzerwechsel handelte. Die Frage wurde geändert, um sie klarer zu machen. Der Teil über die passwortlose Anmeldung zeigt genau dasselbe falsche Verhalten wie passwd -din der Frage, sodass suauf diesen Benutzer ohne Passwort gewechselt werden kann. Der Abschnitt zu Risiken beschreibt zwei Dinge (das Durcheinander mit den Daten anderer Benutzer und das Erhalten von Root-Zugriff), deren Entfernung der eigentliche Punkt der Frage ist. Daher ist dies keine Antwort auf die Frage, obwohl die einzelnen Abschnitte gut geschrieben sind.
Pavel Šimerda
Ich ging davon aus, dass Sie den Benutzer hinzufügen und dann den Benutzer einschränken würden.
Adam Katz