Erstellen Sie manuell ein Kennwort für / etc / shadow

109

Ich muss manuell bearbeiten /etc/shadow, um das Root-Passwort in einem Image einer virtuellen Maschine zu ändern.

Gibt es ein Kommandozeilen-Tool, das ein Passwort akzeptiert und einen /etc/shadowkompatiblen Passwort-Hash auf Standard-Out generiert ?

Lorin Hochstein
quelle

Antworten:

126

Sie können dafür die folgenden Befehle verwenden:

Methode 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

Hinweis: Beim Bestehen -1wird ein MD5-Passwort generiert, -5ein SHA256 und ein -6SHA512 (empfohlen).

Methode 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

Methoden akzeptiert md5, sha-256undsha-512

Methode 3 (des, md5, sha256, sha512)

Wie von @tink vorgeschlagen, können wir das Passwort folgendermaßen aktualisieren chpasswd:

echo "username:password" | chpasswd 

Oder Sie können ein verschlüsseltes Passwort mit verwenden chpasswd. Zuerst generiere es mit diesem:

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

Später können Sie das generierte Passwort verwenden, um Folgendes zu aktualisieren:

echo "username:encryptedPassWd"  | chpasswd -e

Dieses verschlüsselte Passwort können wir verwenden, um einen neuen Benutzer mit Passwort zu erstellen, zum Beispiel:

useradd -p 'encryptedPassWd'  username
Rahul Patil
quelle
3
Bei der Verwendung von chpasswd -e, stellen Sie sicher , dass einfache Anführungszeichen auf der Zeichenfolge , die Sie verwenden echoin; Andernfalls werden $Sonderzeichen nicht buchstäblich behandelt.
Zags
4
Beachten Sie, dass make von diesen in Ihrem Shell-Verlauf endet. Ich würde verwenden, openssl passwd -1was 1) nicht dort endet und 2) ein zufälliges Salz für Sie erzeugt (was auch nicht in der Shell-Geschichte endet).
Ztyx,
1
openssl passwdDokumentation für alle, die herausfinden möchten , was die -1Option bewirkt.
CivFan
4
Für einen SHA-512-Hash: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- Aus verwandter ServerFault-Frage
CivFan
9
Methode 1) und 2) oben verwendet MD5 für das Hashing. MD5 gilt nicht mehr als Best Practice, da Hash-Kollisionen aufgetreten sind. Verwenden Sie Methode 3) oder die in unix.stackexchange.com/a/198906/10911 beschriebene Methode .
Ztyx
36

Unter Ubuntu 12.04 gibt es mkpasswd (aus dem whois-Paket): Overfeatured Frontend to Crypt (3)

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass

Wo:

  • -m= Berechnen Sie das Passwort mit der TYPE-Methode. Wenn TYPE help ist, werden die verfügbaren Methoden gedruckt.
  • -S = Salz verwendet.

Z.B

$ mkpasswd -m help

-s = Read password from stdin
user3183018
quelle
8
Es ist nicht nötig, das Salz anzugeben, mkpasswd kümmert sich darum, ein zufälliges zu generieren.
Bis
1
Unabhängig davon schlagen generierte Passwörter von mkpasswd, die in / etc / passwd kopiert wurden, immer fehl. Gibt es eine Möglichkeit zu überprüfen, ob der von mkpasswd erstellte Hash korrekt ist?
CMCDragonkai
@ CMCDragonkai: Falsche Frage. Sie müssen sich fragen, was Ihr System erwartet.
user3183018
1
@To 마 SE: Manchmal ist es nützlich, das Salz zu kontrollieren. Ich habe es beim Testen der Hash-Generierung von Passwörtern für Web-Apps verwendet, bei denen ich das Salz in einem separaten Geschäft gespeichert habe. ZB Hash-Passwort in MySQL DB und pro Benutzer Salt in Redis.
user3183018
15

Diese Lösung bietet folgende Vorteile:

  • Nichts zusätzliches zu installieren
  • Speichert das Passwort nicht in Ihrem Shell-Verlauf
  • Erzeugt ein zufälliges Salz für Sie
  • Verwendet einen modernen, starken Hashing-Algorithmus, SHA-512
  • Fordert Sie erneut zur Eingabe des Kennworts auf, um Fehler zu vermeiden.

    $ python3 -c "from getpass import getpass; from crypt import *; \
        p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
        if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
    

Verweise

u150825
quelle
3

Für diejenigen ohne Debian-basierte Systeme. Python3 funktioniert genauso gut.

python3 -c 'import crypt; print(crypt.crypt("test"))'

HINWEIS: Die Zeichenfolge "test" ist das Kennwort, das wir als verschlüsselte Zeichenfolge generieren.

Greg
quelle
Aus irgendeinem Grund crypt.mksaltfunktioniert die Verwendung nicht beim Generieren von Kennwörtern für /etc/shadow. Aber die Methode von @ Alex131089 funktioniert!
Maultinglawns
Ich habe gerade 1,5 Stunden mit dieser Methode verbracht, bevor mir der Kommentar aufgefallen ist. Kann es jemand entfernen? Ich kann noch nicht abstimmen.
Michał F
1
@ MichałF anscheinend hat das nicht funktioniert, weil das salzen nicht richtig gemacht wurde. Vielen Dank für den Hinweis. Ich habe das Salt entfernt, da das Salting vom Betriebssystem abhängt und es in meiner Antwort nicht praktisch ist, alle Bereiche des Betriebssystems zu berücksichtigen. Sie sollten Methode 1 verwenden, die von @RahulPatil beschrieben wird, da dies die Verwendung von Salting ermöglicht und opensslein ziemlich universelles Tool ist.
Greg
Nicht ratsam, da Ihr Passwort in Ihrem Shell-Verlauf verbleibt.
Mark Stosberg
Ich meine, Sie können den Befehl immer aus Ihrem Shell-Verlauf löschen
Greg
3

Keine der aktuellen Methoden ist für mich akzeptabel. Sie übergeben entweder das Kennwort in der Befehlszeile (was in der Shell-Historie endet), erfordern die Installation zusätzlicher Dienstprogramme ( python3, makepasswd), verwenden hartcodierte Salze oder verwenden alte Hashing-Techniken.

Diese Methode generiert nach Aufforderung zur Eingabe des Kennworts SHA-512-Hashes und verwendet ein zufälliges Salt.

Eine Methode unter Verwendung von Python 2 ohne nicht standardmäßige Bibliotheken:

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'

So tun Sie es ohne Aufforderung: (Dadurch bleibt Ihr Kennwort im Befehlsverlauf erhalten.)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'
Gert van den Berg
quelle
2
Um zu vermeiden, dass das Kennwort im Befehlsverlauf bleibt, können Sie (zumindest für bash) die Umgebungsvariable HISTCONTROL auf 'ignorespace' setzen und vor dem Befehl ein führendes Leerzeichen einfügen.
adam820
@ adam820: Das ist eine Möglichkeit ... Es würde trotzdem psim Bruchteil einer Sekunde in der Ausgabe stehen, dass der Befehl ausgeführt wird. (Die sicherste bleibt die Version zu verwenden , die für die Eingabe des Kennworts auffordert)
Gert van den Berg
2

Das opensslund chpasswd -ePaar hat in meinem Fall in RHEL6 nicht funktioniert. Kombinieren openssl passwdund usermod -pKommando erledigten den Job.

Generieren Sie den Hash-Wert des Passworts zusammen mit dem Salt-Wert:

$ openssl passwd -1  -salt 5RPVAd clear-text-passwd43

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Kopieren Sie dann die verschlüsselte Zeichenfolge nach usermod. Stellen Sie sicher, dass Sie es in einfache Anführungszeichen setzen.

$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root

Probieren Sie es in der Shadow-Datei aus.

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::
Joon Byun
quelle
1

Eine weitere Methode zum Generieren von Passwörtern ist die Verwendung des opensslTools.

Generieren Sie MD5-Passwörter

openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/

DES-Passwörter generieren

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2
Evgeny
quelle
3
Wie unterscheidet sich von Verfahren 1 in Rahul Patil Antwort ? Beachten Sie, dass der alte DES-basierte Passwort-Hashing-Algorithmus definitiv nicht verwendet werden sollte! Zum einen werden nur Passwörter mit bis zu acht Bytes unterstützt, was heutzutage völlig unzureichend ist.
einen Lebenslauf
3
Zitat Snowden: "Angenommen, Ihr Gegner kann eine Billion Vermutungen pro Sekunde anstellen ." Mit einem nicht völlig unvernünftigen Zeichensatz von 70 Zeichen und einem völlig zufälligen Kennwort sind das 576 Sekunden - weniger als zehn Minuten. Selbst gegen einen weniger fähigen, aber entschlossenen Gegner ist es absolut unzureichend .
einen Lebenslauf
Dies ist nicht sehr sicher, weil MD5 und DES ...
AdamKalisz
Vielen Dank, dass Sie die einzige Antwort sind, die zeigt, wie DES-Passwörter verschlüsselt werden! Sehr nützlich, um zu versuchen, das Root-Passwort für eine IP-Kamera-Firmware zu überschreiben.
Malvineous
1

Als ich etwas auf die Kritik von u150825 und Gert van den Berg einging, stellte ich fest, dass ich etwas relativ Flexibles für verschiedene Situationen mit verschiedenen Automatisierungssystemen brauchte. Ich beschloss, meiner eigenen kleinen Bibliothek nützlicher Skripte etwas hinzuzufügen und dies zu schreiben. Es werden nur native Bibliotheken aus Python 2.7+ verwendet und es funktioniert auch mit Python3.

Sie können es hier abholen, wenn Sie möchten. Es ist genauso einfach, dies in Ihrer Umgebung abzulegen, wenn Sie es häufig verwenden müssen, http-gehostet oder was auch immer, und Sie können es auf jeder Plattform mit dem Standard-Python-Interpreter ausführen, den Sie zur Verfügung haben zuverlässig darauf zählen, dass es funktioniert.

Standardmäßig wird die Verwendung von getpass mit Eingabeaufforderungen für stderr veranlasst (was ein einfaches Erfassen von stdout ermöglicht). Wenn Sie jedoch eine Zeichenfolge hinzufügen, wird nur von stdin geerntet. Abhängig davon, wie Sie vorgehen, wird es möglicherweise auch nicht im Befehlsverlauf angezeigt. Achten Sie also nur darauf, mit was Sie arbeiten. Ich mag es, ein flexibles Tool zu haben, das sich erwartungsgemäß verhält, anstatt mich auf Pakete oder Python verlassen zu müssen, die meinen Weg zum Sieg auf 10 verschiedene Arten bahnen.

James Harmison
quelle
Ob Python in einer beliebigen Version bereits installiert ist oder nicht, hängt vom System ab. Womit genau ist das Problem chpasswd?
RalfFriedl