Zwischenspeichern Sie das Passwort, wenn SSH-Schlüssel verboten sind

46

Ich habe einen Server, auf den ich häufig per ssh zugreifen muss, weil ich darauf rechne. Das Rechenzentrum verbietet nun ausdrücklich SSH-Schlüssel, da diese "unsicher" sind. Sie sind der Meinung, dass die Eingabe meines Passworts über eine Tastatur, die immer vor anderen Menschen möglich ist, eine viel sicherere Möglichkeit ist, sich anzumelden.

Jetzt; Ich kann ihre Meinung nicht ändern (ich habe es versucht).

Gibt es eine Möglichkeit, SSH-Kennwörter zumindest vorübergehend zu speichern, wie GIT Kennwörter für eine bestimmte Zeit in einem Cache speichern kann?

user2667180
quelle
55
the computing center explicitly forbids SSH-keys because they are "insecure"- meine Meinung dazu? Suchen Sie einen neuen Server-Host, da der Ihre offensichtlich unpassend ist.
Matt Clark
18
@Matt: "Rechenzentrum" klingt eher nach einem akademischen Gittersystem, das bei weitem nicht so viel Konkurrenz hat, wie ich denke
Grawity
27
Sie liegen falsch. Sie haben wahrscheinlich vergessen, ssh-Schlüssel zu deaktivieren, wenn sie Konten verfallen, und entschieden, dass ssh-Schlüssel das Problem sind.
Joshua
10
Grawity ist richtig. Es ist ein nationaler Supercomputer, also bleibe ich dabei. Für das, was es wert ist, ist die Maschine schön. Joshua hat wahrscheinlich auch recht, aber das ist die Art von Recht, die für nichts gut ist
user2667180
7
@TheHansinator Wenn ein Keylogger installiert ist, wurden Sie bereits so weit gefährdet, dass es nicht mehr darauf ankommt, ob Sie Ihre SSH-Verbindungen schützen. Die publickeyAuthentifizierung bietet jedoch noch weitere Vorteile . Wenn Sie die passwordAuthentifizierung auf dem Server deaktivieren , verhindern Sie, dass alle Angreifer versuchen, Kennwörter zu erraten. Wenn ein Angreifer einen Mitm-Angriff auf einen Client unternimmt, auf dem der öffentliche Schlüssel des Servers noch nicht gespeichert ist, sind Sie besser geschützt publickeyals bei Verwendung der passwordAuthentifizierung.
Kasperd

Antworten:

63

Wiederverwendung der Verbindung

Mit SSHv2 kann dieselbe authentifizierte Verbindung mehrere "Kanäle" einrichten - interaktive Shell, Batch-Befehl, SFTP sowie sekundäre wie z. B. Agentenweiterleitung oder TCP-Weiterleitung. Ihr Server unterstützt wahrscheinlich standardmäßig das Multiplexen von Verbindungen. (Wenn sich Ihre Administratoren beschweren, wird Ihr Kennwort nirgendwo zwischengespeichert - die gesamte Verbindung wird zwischengespeichert.)

Mit OpenSSH haben Sie ControlMasterund ControlPathOptionen (-M und -S), um dies zu nutzen:

  1. Starten Sie eine 'Master'-SSH-Verbindung mit -M. (Da Sie noch keinen ControlPath in Ihrer Konfiguration haben, müssen Sie ihn in der Befehlszeile mit angeben -S. Er muss eine lange Lebensdauer haben, daher füge ich die -fNOptionen zum Ablegen im Hintergrund hinzu. Ansonsten sind sie technisch optional.)

    $ ssh [email protected] -fNMS ~/.ssh/bar.socket
    [email protected]'s password:
    

    Du bist zurück in der lokalen Shell.

  2. Starten Sie eine neue Verbindung über den Master:

    $ ssh [email protected] -S ~/.ssh/bar.socket
    

    Du bist in.

  3. Um dies für Git / rsync / SFTP nützlich zu machen, müssen Sie ControlPathin Ihrer Konfiguration einrichten , da Sie nicht immer Folgendes angeben -Skönnen:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Sie können dies automatisieren - neuere OpenSSH-Versionen verfügen auch über eine Funktion, ControlPersistdie automatisch eine Masterverbindung im Hintergrund herstellt, falls noch keine vorhanden ist. Auf diese Weise können Sie Schritt 1 überspringen und ssh wie gewohnt verwenden.

  1. Konfiguration in ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. Bei der ersten Verbindung wird nach dem Passwort gefragt:

    $ ssh [email protected]
    [email protected]'s password:
    [foo@bar:~]$ exit
    
  3. Der zweite nicht:

    $ ssh [email protected]
    [foo@bar:~]$ yay
    

Verwenden Sie die -OOption, um den Multiplex-Master zu steuern (stoppen oder TCP-Weiterleitungen konfigurieren) .

Eine ähnliche Methode wird von neueren PuTTY-Versionen unterstützt .

Grawity
quelle
1
Vielen Dank für diese nette Antwort. google war bei diesem problem nicht hilfreich, da es sich immer um ssh-keys handelte und ich nicht die richtigen schlüsselwörter kannte. Hat mir viel geholfen!
user2667180
1
Es sollte selbstverständlich sein, aber wenn Sie diese Konfiguration verwenden, müssen Sie unbedingt sicherstellen, dass Ihr Konto gesichert ist und dass Ihr .ssh-Ordner ordnungsgemäß gesperrt ist, da jeder Benutzer, der Zugriff auf die Kanaldateien auf diesem Computer hat, Ihr Konto als Huckepack nehmen kann Verbindung und greifen Sie auf den Server zu.
Shellster
3
@shellster: Du meinst "irgendjemand mit der gleichen UID", so wie es bei ssh-agent schon der Fall ist. Selbst wenn Sie absichtlich die Berechtigungen der Socket-Datei (die standardmäßig 0600 sind) öffnen, werden andere Benutzer nur eine "Multiplex-UID-Nichtübereinstimmung" erhalten.
Grawity
3
@shellster Jemand mit root könnte sowieso einen Keylogger installieren und Ihr Passwort für das Remote-System stehlen oder eine beliebige Anzahl schändlicher Dinge tun. Wenn wir uns Sorgen um die lokale Wurzel machen, ist dies nicht weniger sicher als das Speichern eines privaten SSH-Schlüssels.
Amalloy
1
Ich betrachte die lokale Wurzel nicht als Bedrohung, denn wenn es jemals zu einer Bedrohung wird, stoßen Sie auf jeden Fall darauf an. (Wie bei staatlicher Spionage.) Ehrlich gesagt könnte eine lokale Wurzel Ihren ssh-Client und Ihren ssh-Agenten einfach durch das ersetzen, was sie wollen. Speichern Sie alle Passwörter und privaten Schlüssel in /root/.secret? Sicher.
Grawity
19

Verwenden sshpass

sshpass ( github , man page ) ist ein Tool, das das Passwort automatisch an ssh weiterleitet. Der sichere Weg, es zu benutzen, ist der folgende:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Dadurch wird das Kennwort ~/.ssh/compute_passwordähnlich wie bei einer privaten Schlüsseldatei ohne Passphrase gelesen . Sie können den sshpassBefehl in ein kleines Shell-Skript oder einen Shell-Alias ​​einfügen, um die Eingabe des vollständigen Befehls zu vermeiden. Leider habe ich keinen Weg gefunden, dies zu tun ~/.ssh/config.

(Es ist auch möglich, das Kennwort direkt in der Befehlszeile anzugeben sshpass, dies sollte jedoch vermieden werden, da das Kennwort an alle weitergegeben wird, die dazu in der Lage sind. ps)

Vergleich mit anderen Methoden

Dieser Ansatz ist natürlich weniger sicher als die ordnungsgemäße Einrichtung der Authentifizierung mit öffentlichen Schlüsseln, aber das wissen Sie wahrscheinlich bereits.

Es ist auch weniger sicher als die Antwort von @grawity zur Wiederverwendung von Verbindungen, hat jedoch den Vorteil, dass das Kennwort überhaupt nicht interaktiv eingegeben werden muss.

Sie könnten die Antwort von @ grawity als Alternative zur Authentifizierung von Pubs mit einer Passphrase und privatem Schlüssel-Caching (z. B. ssh-agent) betrachten. Dann wäre meine Antwort eine Alternative zu pubkey auth ohne eine Passphrase für die private Schlüsseldatei.

marcelm
quelle
3
Wenn die Richtlinie des Rechenzentrums auf der Grundlage von "Aber Schlüsselpaare werden auf einer Festplatte gespeichert, auf der sie von jemandem gestohlen werden können!" Erstellt wurde, wird diese Richtlinie anscheinend eher nach hinten losgehen.
Grawity
6
@grawity Nun, schlechte Richtlinien führen zu noch schlimmeren Workarounds ¯ \ _ (ツ) _ / ¯
marcelm
1
Wenn Sie Ihr Kennwort als ausreichend langen Strom zufälliger Zeichen (z. B. head -c 16 /dev/urandom | base64für 128 Bit) generieren und es nicht auf anderen Systemen verwenden, ähnelt es in Bezug auf die Sicherheit einem Schlüssel. Als schwer zu brachialisieren und als einfach zu verwendende Datei, wenn sie nicht verschlüsselt ist. Das gilt auch für die Bösen, wenn sie die Akte bekommen. Der einzige Unterschied besteht darin, dass das Kennwort so wie es ist an den Server gesendet wird, während Schlüssel besser berechnet werden können, um zu beweisen, dass Sie den richtigen privaten Schlüssel besitzen, ohne ihn preiszugeben Standardwerkzeuge).
ilkkachu
1

Verwenden Sie den Passwort-Manager.

Einige Kennwortmanager (z. B. KeePassXC) verfügen über die Funktion zum automatischen Eingeben. Sie speichern das Kennwort im Kennwort-Manager, entsperren die Datenbank, wenn Sie den Manager ausführen, und sshdrücken jedes Mal, wenn Sie zur Eingabe Ihres Kennworts aufgefordert werden, eine Tastenkombination, mit der der Kennwort-Manager Ihr langes Kennwort in die Konsole schreibt.

Sie müssen nichts kopieren, nichts merken (mit Ausnahme des Kennworts zum Entsperren der Datenbank), und Sie können bei jedem Anmeldeversuch ein sicheres Kennwort festlegen, ohne diese 30 Zeichen zu zerstören.

Sie können Ihren Favoriten aus dieser Liste auswählen: https://en.wikipedia.org/wiki/List_of_password_managers

Styroporfliege
quelle
3
Ich bin mir nicht sicher, ob die Funktion zum automatischen Eingeben mit terminalbasierten Programmen gut funktioniert. Die Erkennung sucht nach einem bestimmten Fenstertitel, und das Autotyping selbst bietet am besten nicht die ausgefallenen "Anti-Keylogging" -Funktionen, die KeePass2 hatte ...
grawity
1
@grawity gnome-terminaländert seinen Titel in, ssh somehostwenn ssh mich nach einem Passwort fragt, damit Sie das Titelfenster problemlos mit diesem abgleichen können. Ich habe keine Ahnung von Funktionen zur Keylog-Abwehr - ich verwende KeePassXC täglich im Terminal und das Schlimmste, mit dem ich zu kämpfen hatte, ist die Auswahl des entsprechenden Kontos aus der Liste.
Styropor fliegen
2
@grawity Die Anti-Keylogging-Funktionen müssen ohnehin für jeden Eintrag einzeln aktiviert werden (genau aus dem Grund, dass viele Programme das Einfügen nicht unterstützen).
Bob
0

Eine andere Alternative ist die Verwendung eines GUI-ssh-Clients. Unter Windows wäre PuTTY die naheliegende Wahl . Es gibt auch eine Linux-Version von PuTTY, insbesondere die meisten Debian-basierten Distributionen wie Ubuntu enthalten PuTTY normalerweise in ihrem Repo.

Ein weiterer wirklich guter Kunde ist Termius . Es unterstützt nicht nur Windows und Linux, sondern auch OSX, iOS und Android. Obwohl es hauptsächlich für Handys entwickelt wurde, ist die Desktop-Version eigentlich recht gut.

Wenn ich mich nicht irre, hat / hatte das ehrwürdige Hyperterminal unter Windows auch einen ssh-Client eingebaut, aber ich habe lange Zeit kein Fenster mehr benutzt, daher bin ich mir nicht ganz sicher.

Alle GUI-Clients können Verbindungseinstellungen speichern, die Ihren Benutzernamen und Ihr Kennwort enthalten.

Slebetman
quelle
2
"GUI-basiert" bedeutet nicht automatisch, dass Ihr Passwort gespeichert werden kann, was PuTTY ausdrücklich ablehnt . Die mit Windows gelieferte Version von HyperTerminal war nur für Telnet gedacht und konzentrierte sich mehr auf serielle Verbindungen. Möglicherweise denken Sie an CKermit für Windows mit SSH-Unterstützung, aber die Verschlüsselungsunterstützung ist so veraltet, dass eine Verbindung zu vielen aktuellen Servern nicht einfach hergestellt werden kann.
Grawity