webentwicklung-frage-antwort-db.com.de

Wie erstelle ich einen Benutzer und setze ein Passwort mit ansible?

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:

  1. Soll das zu crypt.crypt gelieferte Salt mit einem abschließenden $ enden, oder hat es das Format $ N $ SALT ?

  2. Python-Dokumente beziehen sich auf DES, aber wie wird SHA-512 oder MD5 aufgerufen und wo ist die Dokumentation dafür?

  3. 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?

19
felix

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

31
felix

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?

4
Justin Simpson

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())"

4
Eli

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:

  • PROCESS_TIME (boolean)
    • Aktiviert die 2. Zeile der Ausgabe mit der Anzahl der Runden und der CPU-Zeit
  • ROUNDS (Ganzzahl)
    • Überschreibt den default_rounds -Wert, der für ein "durchschnittliches" System auf ~ 300 ms eingestellt ist. Sie möchten ein Minimum von 100 ms, sollten aber so groß sein, wie Sie es sich leisten können. 
#!/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))
2
Bruno Bronosky

Ich habe den folgenden Shell-Befehl verwendet, um das Kennwort festzulegen. 

- name: "Set user password: someuser"
  command: 'echo "somepassword"| passwd --stdin "someuser"'
  Sudo: yes
1
Viraj

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.

0
Arbab Nazar

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"
0
Artem Feofanov

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"]}}
0
sjas