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!
command-line
ssh
password
users
Amigcamel
quelle
quelle
Antworten:
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-Kennwortopenssl
werden als Variablenindikator behandelt) in der lokalen Umgebung und nicht auf der Remote-Shell ausgeführt.Lösung: Verwenden Sie einfache Anführungszeichen um den
useradd
Befehl, derssh
in 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:Beachten Sie die Zitate.
Sicherheitsprobleme:
Die SSH-
root
Anmeldung sollte deaktiviert sein. Wenn Sie sie aktivieren müssen, sollte nur die schlüsselbasierte Authentifizierung zulässig seinMD5 ist bereits defekt und ohne Salz sind Sie einem einfachen Rainbow-Tabellenangriff ausgesetzt (es ist nicht einmal ein Brute-Forcing- / Wörterbuchangriff erforderlich).
openssl passwd
erzeugt jedoch ein zufälliges Salz. Auf jeden Fall sollten Sie in Betracht ziehen, SHA-2 mit Salz zu verwendenPasswö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
procfs
ist (siehehidepid
) und ob der Befehl sich selbst neu schreibt (dies ist in diesem Fall vermutlich nicht der Fall).quelle
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.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
chpasswd
Dienstprogramm 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.
chpasswd
Nimmt 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. Wennopenssl passwd
das 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 diecrypt
Funktion eingebaut, aber es müsste noch ein richtiges Salt generiert werden.quelle