web-dev-qa-db-fra.com

Comment créer un utilisateur et définir un mot de passe avec ansible?

Le documentation nous renvoie au github exemple , mais c'est un peu rare et mystérieux.

Il dit ceci:

# created with:
# crypt.crypt('This is my Password', '$1$SomeSalt')
password: $1$SomeSalt$UqddPX3r4kH3UL5jq5/ZI.

mais crypt.crypt n'émet pas ce que montre l'exemple. Il utilise également MD5.

J'ai essayé ceci:

# python
import crypt
crypt.crypt('This is my Password', '$6$somereallyniceandbigrandomsalt$')
>> '$69LxCegsnIwI'

mais le champ de mot de passe de l'utilisateur devrait obtenir quelque chose comme ceci:

password: $6$somereallyniceandbigrandomsalt$UqddPX3r4kH3UL5jq5/ZI.

qui comprend trois délimiteurs $ séparant le 6 (ce qui signifie qu’il s’agit d’un hachage SHA-512), le salt et le mot de passe crypté.

Notez que le crypt docs python ne mentionne rien du format $ N.

Des questions:

  1. Le sel, tel qu’il est fourni à crypt.crypt, est-il censé se terminer par un $ final ou est-il au format $ N $ SALT?

  2. Les documents Python font référence à DES, mais comment est appelé SHA-512 ou MD5 et où est la documentation pour cela?

  3. Suis-je vraiment supposé prendre la sortie de crypt.crypt et couper le premier $ 6 et faire $ N $ SALT $ CRYPTED? Est-ce que c'est ce dont on a besoin?

19
felix

L'exemple de python présenté dans la documentation dépend de la version de crypt exécutée sur le système d'exploitation utilisé. 

J'ai généré le crypt sur OS X et le serveur que je visais est Ubuntu. 

En raison des différences dans lesquelles l’implémentation de crypt est proposée par le système d’exploitation, le résultat est différent et incompatible.

Utilisez ceci à la place:

http://pythonhosted.org/passlib/

Passlib est une bibliothèque de hachage de mots de passe pour Python 2 et 3, qui fournit Des implémentations multi-plateformes de plus de 30 algorithmes de hachage de mots de passe, , Ainsi qu'un cadre de gestion des hachages de mots de passe existants. Il est conçu pour être utile pour une large gamme de tâches, allant de la vérification d'un hachage Se trouvant dans/etc/shadow à la fourniture d'un hachage de mot de passe complet pour l'application multi-utilisateurs de .

>>> # 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/ln9nyEfxM67ea8Bvb79JoW50pGjf6iM87taIvfSmpjasE4/wBG1.60pFS6W992T7Q1q2wikmbxyUbM1

31
felix

Cela a fonctionné pour moi (avec python 2.7.4):

python
>>> import crypt
>>> crypt.crypt('thisismypassword', '$6$Som3S@lt$')
'$6$Som3S@lt$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.'

J'ai un vars.yml qui ressemble à ceci:

---
password: $6$Som3S@lt$XGoe9ONI00NaTkYn46CLDr8TSkvkovahinFqy95vrSe5Hzx2999C9mgF76ODFRnXMJHUCWFHLdkYd3c7AB9WV.

et un playbook.yml comme ceci:

---
- hosts: vagrant
  vars_files:
    - vars.yml
  user: vagrant

  tasks:
  - name: create artefactual user
    user: name=artefactual state=present password={{password}} Shell=/bin/bash

Je lance mon Playbook en utilisant vagabond, vagrant up, puis depuis une autre console, je peux passer à la nouvelle machine virtuelle créée en utilisant l’utilisateur artefactuel créé par ansible, avec le mot de passe thisismypassword.

Je viens de copier le résultat de crypt.crypt dans la variable ansible appelée mot de passe et je l'ai utilisé. La sortie de crypt que vous montrez dans votre question semble trop courte, je ne suis pas sûr de savoir pourquoi vous avez cela, peut-être une version différente de python?

4
Justin Simpson

Ceci a été mis à jour dans le Ansible docs . Il y a deux manières préférées:

Comment générer des mots de passe cryptés pour le module utilisateur? 

L'utilitaire mkpasswd disponible sur la plupart des systèmes Linux est une excellente option:

mkpasswd --method=SHA-512 Si cet utilitaire n'est pas installé sur votre système (par exemple, vous utilisez OS X), vous pouvez toujours générer facilement ces mots de passe à l'aide de Python. Tout d’abord, assurez-vous que la bibliothèque de hachage du mot de passe Passlib Est installée.

pip install passlib

Une fois la bibliothèque prête, les valeurs de mot de passe SHA512 Peuvent être générées comme suit:

python -c "from passlib.hash import sha512_crypt; import getpass; print sha512_crypt.encrypt(getpass.getpass())"

4
Eli

J'ai pris la réponse de @ felix et j'en ai fait un script que je pourrais inclure dans un projet de docker sur lequel je travaille. Je sais que beaucoup de développeurs utilisent macOS/OSX et qu'il n'y a pas de mkpasswd sur cette plate-forme, je les enregistre donc sur Google.

J'ai ajouté les options suivantes:

  • PROCESS_TIME (booléen)
    • Permet la 2ème ligne de sortie avec le nombre de tours et le temps de calcul
  • ROUNDS (entier)
    • Remplace la valeur default_rounds qui est réglée pour prendre environ 300 ms sur un système "moyen". Vous voulez un minimum de 100 ms, mais vous devriez être à la hauteur de vos moyens. 
#!/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

J'utilise la commande Shell suivante pour définir le mot de passe. 

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

Vous pouvez utiliser les filtres jinja2 capables de gérer la génération de mots de passe chiffrés. Voici un exemple de travail pour créer l’utilisateur Linux avec le mot de passe fourni:

- name: Creating Linux User
  user:
    name: "{{ myuser }}" 
    password: "{{ mypassword | password_hash('sha512') }}"

J'espère que cela vous aidera et aidera les autres.

0
Arbab Nazar

essayez comme ça

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

pwgen doit être installé sur l'hôte cible:

- name: generate linux user password
  local_action: Shell /usr/bin/pwgen 16 1
  register: generated_linux_user_password

Utilisez hosts: localhost, set_fact et hostvars, si vous souhaitez que la 'variable' soit disponible globalement (les faits sont en lecture seule après la création):

{{hostvars['localhost']["new_fact"]}}
0
sjas