OpenSSH mit öffentlichen Schlüsseln aus der Datenbank

14

Ist es möglich, die öffentlichen Schlüssel aus einer Datenbank anstelle der Datei authorized_keys abzurufen?

Ich möchte ein solches Setup verwenden, um den SSH-Zugriff auf Dinge wie Git-Repositorys für mehrere Benutzer zu verwalten, ohne die authorized_keys-Datei jedes Mal neu erstellen zu müssen, wenn ein öffentlicher Schlüssel geändert oder hinzugefügt wird.

Fionn
quelle
1
Ich benutze Marionette dafür
Matt Simmons
Userify kann diese Konten mit zentraler Verwaltung, aber lokaler Authentifizierung verwalten. Auf diese Weise können Sie bei einem Ausfall Ihrer zentralisierten Datenbank zwar weiterarbeiten, aber alle Vorteile der zentralisierten Verwaltung nutzen.
Jamieson Becker

Antworten:

16

Ich habe diese Frage gefunden, als ich versuchte, sie selbst zu beantworten. Nach einigem Suchen und Experimentieren habe ich ein paar andere Optionen dafür gefunden. Ich werde den Teil über das Verteilen von Schlüsseln als Alternative überspringen, da Matt Simmons das behandelt hat. Ich weiß auch, dass es Zeiten gibt, in denen das nicht gut genug ist. Wenn Sie beispielsweise GitHub sind und Millionen öffentlicher Schlüssel für einen einzelnen Benutzer speichern müssen, ist es nicht machbar oder wünschenswert, SSH-autorisierte Schlüsseldateien fortlaufend zu aktualisieren und über potenziell Dutzende bis Hunderte von Edge-Boxen hinweg synchron zu halten.

So,

  1. Zunächst haben RedHat (und Varianten) einen unterstützten Patch für OpenSSH, der die Optionen AuthorizedKeysCommandund hinzufügt AuthorizedKeysCommandRunAs. Der Patch wurde in openssh 6.2 upstream zusammengeführt. So zitieren Sie aus der Manpage :

    AuthorizedKeysCommand

    Gibt ein Programm an, das zum Nachschlagen der öffentlichen Schlüssel des Benutzers verwendet werden soll. Das Programm wird mit dem ersten Argument aufgerufen, das den Namen des zu autorisierenden Benutzers enthält, und sollte in der Standardausgabe AuthorizedKeys-Zeilen ausgeben (siehe AUTHORIZED_KEYS in sshd (8)). Standardmäßig (oder wenn die leere Zeichenfolge festgelegt ist) wird kein AuthorizedKeysCommand ausgeführt. Wenn der AuthorizedKeysCommand den Benutzer nicht erfolgreich autorisiert, erfolgt die Autorisierung über die AuthorizedKeysFile. Beachten Sie, dass diese Option nur bei aktivierter PubkeyAuthentication wirksam ist.

    AuthorizedKeysCommandRunAs

    Gibt den Benutzer an, unter dessen Konto der AuthorizedKeysCommand ausgeführt wird. Leere Zeichenfolge (Standardwert) bedeutet, dass der zu autorisierende Benutzer verwendet wird.

    In meinen heutigen Experimenten habe ich festgestellt, dass dies aufgrund von SELinux-Standardrichtlinien nicht funktioniert. Sie können dies umgehen, indem Sie die SELinux-Erzwingung mit deaktivieren setenforce 0. Da das Ausschalten von SELinux wahrscheinlich eine schlechte Idee ist, können Sie stattdessen die richtige Richtlinie generieren. In meinem Fall war das so einfach wie der Versuch , sich mit der AuthorizedKeysCommandOption einzuloggen /etc/ssh/sshd_configund dann zu verwenden audit2allow -a -M local && semodule -i local.pp. Dies durchsucht im Wesentlichen die Überwachungsprotokolle und findet Dinge, die verhindert wurden, und generiert Ausnahmen für sie. Wenn Sie wahrscheinlich andere Dinge haben, die in die Whitelist aufgenommen werden, sollten Sie wahrscheinlich mehr darüber erfahren audit2allow, um sicherzustellen, dass die neuen Richtlinien genau richtig sind.

  2. Es gibt andere (wahrscheinlich weniger getestete und vertrauenswürdige) Patches, die ähnliche Funktionen hinzufügen. Zum Beispiel gibt es openssh-script-auth . Sie können auch den Patch finden, den RedHat verwendet hat, und diesen direkt anwenden. Ein kurzer Kampf googeln deckt https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch und https://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch welche basierend auf den RH-Versionen, die jedoch für neuere Versionen von OpenSSH aktualisiert wurden.

  3. Patchen Sie OpenSSH, um Schlüsselsuchvorgänge direkt von einigen Stores aus durchzuführen (z. B. von GitHub und CodeBaseHQ und anderen). GitHub hat diesen Patch nach meinem besten Wissen nicht als Open-Source-Version bereitgestellt, aber ich weiß, dass ich in der Vergangenheit auf Versionen für MySQL- und PostgreSQL-Schlüsselsuche gestoßen bin. Ich habe gerade versucht, sie wiederzufinden, aber nicht viel Glück gehabt.

  4. Es gibt auch einige FUSE-basierte Optionen. Zum Beispiel gibt es LPKFuse, mit dem Sie öffentliche Schlüssel aus LDAP bereitstellen können , indem Sie den AuthorizedKeysFileSpeicherort auf einen im LPKFuse-Dateisystem ändern. Der LPKFuse FS erstellt virtuelle Dateien, deren Inhalt durch Felder von einem Verzeichnisserver gesichert wird.


Alles in allem denke ich, dass Option 1 bei weitem die beste ist, da sie offiziell von RedHat unterstützt wird. Darüber hinaus können Sie jede beliebige Logik in das Skript einfügen (einschließlich der Kommunikation mit einer Datenbank), und zwar in jeder gewünschten Sprache.

Bo Jeanes
quelle
Re: # 1 schöner Fund !! Ich hoffe, das geht stromaufwärts, es wäre praktisch in ESXi.
Jason Tan
@JasonTan: AuthorizedKeysCommand wurde in openssh 6.2 upstream geschaltet. Ich habe auch die Antwort aktualisiert, um dies widerzuspiegeln.
Bluewind
Großartige Antwort, Option 1 war genau das, wonach ich gesucht habe.
Shane Kilkelly
3

OpenSSH hat diese Funktion meines Wissens nicht. Am besten lässt du die Datei nachts (oder so oft wie nötig) von einem Skript automatisch neu generieren.

Möglicherweise möchten Sie auch die folgende Frage sehen: Ein System zum Verteilen öffentlicher SSH-Schlüssel

Matt Simmons
quelle
1

Ich glaube, dass Sie in neueren openssh-Versionen Schlüssel in einem LDAP-Eintrag eines Benutzers speichern können. Wenn Sie LDAP oder AD bereits für die Kontoverwaltung verwenden, sollten Sie es auch für die Schlüsselverwaltung nutzen können.

Berg
quelle