Es kann kein Benutzer mit Passwort über ssh [closed] erstellt werden

13

Ich habe versucht, einen Benutzer mit Passwort über ssh (mit root-Berechtigung) wie folgt zu erstellen:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser

Auf diese Weise konnte ich erfolgreich ein Konto mit dem Namen erstellen newuser, aber ich konnte mich nicht mit dem erwarteten Kennwort anmelden (das ist 1234).

Es macht keinen Unterschied, ob ich doppelte Anführungszeichen hinzufüge:

ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"

Und dann habe ich mich gefragt, ob ich ein gehashtes Passwort generieren und lokal als Variable speichern kann, aber immer noch ohne Glück.

password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"

Gibt es etwas, das ich vermisse? Danke im Voraus!

Amigcamel
quelle
Das Übergeben von Kennwörtern über die Befehlszeile ist eine schlechte Idee, da andere Benutzer möglicherweise die Befehlszeilenargumente sehen. Siehe Heemayls Antwort darauf. Darüber hinaus klingt dies wie ein XY-Problem . Was versuchst du eigentlich zu erreichen? Wozu dient ein Kontopasswort, das niemand kennt (oder wissen soll)? Wenn es darum geht, ein Konto zu erstellen, das keine Anmeldungen über ein Kennwort akzeptiert, legen Sie einfach kein Kennwort fest, wodurch die kennwortbasierte Anmeldung als Ubuntu-Standardrichtlinie deaktiviert bleibt.
David Foerster

Antworten:

22

Dies ist eine klassische Zitatfrage.

Problem: Ohne Anführungszeichen oder doppelte Anführungszeichen werden die Befehlsersetzung ( $()) und die Variablenerweiterung (die $s im von zurückgegebenen Hash-Kennwort opensslwerden als Variablenindikator behandelt) in der lokalen Umgebung und nicht auf der Remote-Shell ausgeführt.

Lösung: Verwenden Sie einfache Anführungszeichen um den useraddBefehl, der sshin der lokalen Shell verwendet wird, um zu verhindern, dass der Befehl ersetzt und die Variablen in der lokalen Umgebung erweitert werden. Lassen Sie die Erweiterungen in der nicht angemeldeten, nicht interaktiven Remote-Shell erfolgen:

ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'

Beachten Sie die Zitate.

Sicherheitsprobleme:

  • Die SSH- rootAnmeldung sollte deaktiviert sein. Wenn Sie sie aktivieren müssen, sollte nur die schlüsselbasierte Authentifizierung zulässig sein

  • MD5 ist bereits defekt und ohne Salz sind Sie einem einfachen Rainbow-Tabellenangriff ausgesetzt (es ist nicht einmal ein Brute-Forcing- / Wörterbuchangriff erforderlich). openssl passwderzeugt jedoch ein zufälliges Salz. Auf jeden Fall sollten Sie in Betracht ziehen, SHA-2 mit Salz zu verwenden

  • Passwörter, die als Argumente an Befehle übergeben werden, können für andere Prozesse im (fernen) System sichtbar sein. Dies hängt davon ab, wie Ihr eingebunden procfsist (siehe hidepid) und ob der Befehl sich selbst neu schreibt (dies ist in diesem Fall vermutlich nicht der Fall).

heemayl
quelle
1
Funktioniert wie ein Zauber und danke für die zusätzlichen Informationen!
Amigcamel
1
Der md5crypt-Passwort-Hash hat ein Salz ...
ilkkachu
@ilkkachu MD5 ist kein sicherer Hash. Wenn Sie interessiert sind, führen Sie eine Suche nach Informationssicherheit durch . Eigentlich sollten Sie einen zusammengesetzten Algorithmus oder eine kryptografische Bibliothek verwenden, aber SHA-2 ist deutlich besser als MD5.
wizzwizz4
1
@wizzwizz4 ja, das ist bekannt, ändert nichts an der Tatsache, dass die Informationen in dieser Antwort falsch sind. :)
Hobbs
2
@ wizzwizz4, der Passwort - Hash ( md5crypt ) , die von crypt(3)in Linux und mit der markierten $1$Kennung ist nicht das gleiche wie die Ebene MD5 - Hash - Algorithmus, in die gleichen Weise wie die $5$und $6$ Kennworthashwerte nicht ebene SHA-256 und SHA-512 entweder . Die MD5-basierte Methode weist eine feste Anzahl von Iterationen auf, was das größte Problem darstellt.
ilkkachu
7

Wie @heemayl bemerkte, ist der MD5-Passwort-Hash-Algorithmus in die Jahre gekommen, und aktuelle Systeme verwenden die neueren SHA-2-basierten Passwort-Hashes, die einen anpassbaren Arbeitsfaktor haben. Das OpenSSL-Befehlszeilentool scheint diese jedoch nicht zu unterstützen.

Mit dem chpasswdDienstprogramm können Sie jedoch das Kennwort eines Benutzers gemäß den Systemeinstellungen ändern.

Auf diese Weise können Sie den neuen Benutzer erstellen und sein Kennwort auf der Remote-Seite ändern.

echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswdNimmt den Benutzernamen und das Passwort von stdin, nicht von der Kommandozeile. Dies ist tatsächlich ein Vorteil, da Befehlszeilenargumente für alle anderen Prozesse im System sichtbar sind. Wenn openssl passwddas Kennwort also auf der Fernbedienung ausgeführt wird, ist es vorübergehend für alle Prozesse im System sichtbar.

Ich bin mir nicht sicher, ob es ein fertiges Befehlszeilenprogramm zum Generieren von Kennwort-Hashes gibt, das der Systemfunktion bekannt crypt(3)ist. Perl hat die cryptFunktion eingebaut, aber es müsste noch ein richtiges Salt generiert werden.

ilkkachu
quelle