Die Dokumentation verweist auf den Github Beispiel , aber das ist etwas spärlich und mysteriös.
Es sagt dies:
# created with:
# crypt.crypt('This is my Password', '$1$SomeSalt')
password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.
aber crypt.crypt
gibt nicht aus, was das Beispiel zeigt. Es wird auch MD5 verwendet.
Ich habe es versucht:
# python
import crypt
crypt.crypt('This is my Password', '$6$somereallyniceandbigrandomsalt$')
>> '$69LxCegsnIwI'
aber das Passwortfeld des Benutzers sollte ungefähr so aussehen:
password: $6$somereallyniceandbigrandomsalt$UqddPX3r4kH3UL5jq5/ZI.
dies beinhaltet drei $ Trennzeichen, die den 6
(was bedeutet, dass es sich um einen SHA-512-Hash handelt), das Salt und das verschlüsselte Passwort trennen.
Beachten Sie, dass die Python-Datei crypt docs nichts über das Format $ N enthält.
Fragen:
Soll das zu crypt.crypt
gelieferte Salt mit einem abschließenden $ enden, oder hat es das Format $ N $ SALT ?
Python-Dokumente beziehen sich auf DES, aber wie wird SHA-512 oder MD5 aufgerufen und wo ist die Dokumentation dafür?
Soll ich wirklich die Ausgabe von crypt.crypt
nehmen und das erste $ 6 abschneiden und $ N $ SALT $ CRYPTED machen? Ist es das, was man braucht?
Das in der Dokumentation dargestellte Python-Beispiel hängt davon ab, welche Crypt-Version auf dem von Ihnen verwendeten Betriebssystem ausgeführt wird.
Ich habe die Krypta unter OS X generiert und der Server, den ich anvisierte, ist Ubuntu.
Aufgrund der Unterschiede bei der Implementierung der Verschlüsselung durch das Betriebssystem ist das Ergebnis unterschiedlich und inkompatibel.
Verwenden Sie stattdessen diese:
http://pythonhosted.org/passlib/
Passlib ist eine Passwort-Hashing-Bibliothek für Python 2 & 3, die plattformübergreifende Implementierungen von über 30 Passwort-Hashing-Algorithmen Sowie ein Framework zur Verwaltung vorhandener Passwort-Hashes bereitstellt. Es handelt sich um , Das für eine Vielzahl von Aufgaben nützlich ist, von der Überprüfung eines Hashes In/etc/shadow bis hin zur Bereitstellung eines vollständigen Passwort-Hashing für Mehrbenutzeranwendung .
>>> # import the hash algorithm
>>> from passlib.hash import sha512_crypt
>>> # generate new salt, and hash a password
>>> hash = sha512_crypt.encrypt("password")
>>> hash
'$ 6 $ rounds = 656000 $ BthPsosdEpqOM7Qd $ l/Ln9nyEfxM67ea8Bvb79JoW50pGjf6i877IIffm_mpjasE4/wBG1.60pFS6W992T7Q1q2wikMbxYUVDH11
Dies funktionierte für mich (mit Python 2.7.4):
python
>>> import crypt
>>> crypt.crypt('thisismypassword', '[email protected]$')
'[email protected]$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.'
Ich habe eine vars.yml, die so aussieht:
---
password: [email protected]$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.
und ein playbook.yml wie folgt:
---
- hosts: vagrant
vars_files:
- vars.yml
user: vagrant
tasks:
- name: create artefactual user
user: name=artefactual state=present password={{password}} Shell=/bin/bash
Ich führe mein Playbook mit vagrant, vagrant up
, aus und kann dann von einer anderen Konsole aus ssh an den neu erstellten virtuellen Computer mit dem von ansible erstellten artefactual-Benutzer mit dem Kennwort thisismypassword
senden.
Ich habe gerade die Ausgabe von crypt.crypt in die ansible-Variable namens password kopiert und diese verwendet. Die Ausgabe von crypt, die Sie in Ihrer Frage zeigen, ist zu kurz. Ich bin nicht sicher, warum Sie das bekommen haben, vielleicht eine andere Version von Python?
Dies wurde in den Ansible-Dokumenten aktualisiert. Es gibt zwei bevorzugte Wege:
Wie generiere ich verschlüsselte Passwörter für das Benutzermodul?
Das Dienstprogramm mkpasswd, das auf den meisten Linux-Systemen verfügbar ist, ist eine großartige Option:
mkpasswd --method=SHA-512
Wenn dieses Dienstprogramm nicht auf Ihrem System installiert ist (z. B. verwenden Sie OS X), können Sie diese Kennwörter mit Python dennoch problemlos erzeugen. . Stellen Sie zunächst sicher, dass die Passlib-Kennwortbibliothek Installiert ist.
pip install passlib
Sobald die Bibliothek bereit ist, können die SHA512-Kennwortwerte Wie folgt generiert werden:
python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"
Ich habe @ felix's answer genommen und daraus ein Skript gemacht, das ich in ein Docker-Projekt einfügen könnte, an dem ich arbeite. Ich weiß, dass viele Entwickler macOS/OSX verwenden und dass es auf dieser Plattform keine mkpasswd
gibt, also speichere ich ihnen das Googling.
Ich habe die folgenden Optionen hinzugefügt:
#!/usr/bin/env python3
# Because OSX doesn't have mkpasswd...
# Based on https://stackoverflow.com/a/17992126/117471
# python3 -c "from passlib.hash import sha512_crypt; print(sha512_crypt.encrypt(input()))" <<< bruno # NOQA
# Usage:
#
# $ ./mkpasswd.py
# Password:
# $6$rounds=656000$pfFmQISGcjWHOCxW$rBptiSK.tqSPnUiq6KiSHzz6LvvW/x1SjkkWFwxWB9Dt75NLNBs0N3OyGV4K5ejjBs/u.o3jtigvUKbmmwVQP.
#
# $ PROCESS_TIME=1 ./mkpasswd.py
# Password:
# $6$rounds=656000$e0OGrad82DBrUo9T$ldqtOdN54gmXI6nb0D.Y5mm5ih.LIQm/Ep/bkNL76.3hE65FqXA9wyZ.M5YOrv6dSvwhPAktXGJ6LJT0Fgd4x.
# 656000 rounds in 1.008705 seconds of cpu time
#
# $ ROUNDS=1280000 PROCESS_TIME=1 ./mkpasswd.py <<< bruno
# $6$rounds=1280000$QO5FSyw5rQpiY6PI$0zRMJ4RzCbH61XxIdpsUm/79.VZ13Mm9TBN9GvJwt1LI1U5FVzakrLya5VJsXlTou3p5ZeWmo29bIUjubRuc31
# 1280000 rounds in 1.9206560000000001 seconds of cpu time
import os
import sys
import time
from getpass import getpass
from passlib.hash import sha512_crypt
rounds = os.environ.get('ROUNDS')
if not rounds:
rounds = sha512_crypt.default_rounds
passwd = input() if not sys.stdin.isatty() else getpass()
proc = sha512_crypt.using(rounds=rounds)
start = time.process_time()
out = proc.encrypt(passwd)
end = time.process_time()
print(out)
if os.environ.get('PROCESS_TIME'):
print('{} rounds in {} seconds of cpu time'.format(rounds, end-start))
Ich habe den folgenden Shell-Befehl verwendet, um das Kennwort festzulegen.
- name: "Set user password: someuser"
command: 'echo "somepassword"| passwd --stdin "someuser"'
Sudo: yes
Sie können die jinja2-Filter verwenden, mit denen die Generierung verschlüsselter Kennwörter verwaltet werden kann. Hier ein Arbeitsbeispiel, um den Linux-Benutzer mit dem bereitgestellten Passwort zu erstellen:
- name: Creating Linux User
user:
name: "{{ myuser }}"
password: "{{ mypassword | password_hash('sha512') }}"
Hoffe, das wird dir und anderen helfen.
versuchen Sie es so
vars_Prompt:
- name: "user_password"
Prompt: "Enter a password for the user"
private: yes
encrypt: "md5_crypt" #need to have python-passlib installed in local machine before we can use it
confirm: yes
salt_size: 7
- name: "add new user" user: name="{{user_name}}" comment="{{description_user}}" password="{{user_password}}" home="{{home_dir}}" Shell="/bin/bash"
Auf dem Zielhost muss pwgen
installiert sein:
- name: generate linux user password
local_action: Shell /usr/bin/pwgen 16 1
register: generated_linux_user_password
Verwenden Sie hosts: localhost
, set_fact
und hostvars, wenn die 'Variable' global verfügbar sein soll (Fakten werden erst nach der Erstellung gelesen):
{{hostvars['localhost']["new_fact"]}}