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

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

Il est dit ceci:

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

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

j'ai essayé ceci:

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

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

password: $somereallyniceandbigrandomsalt$UqddPX3r4kH3UL5jq5/ZI.

qui comprend trois $ délimiteurs séparant 6 (ce qui signifie que C'est un hash SHA-512), le sel, et le mot de passe crypté.

Notez que le python crypte docs ne mentionnez rien sur le $N format.

Questions:

  1. sel, tel que fourni à crypt.crypt, censé se terminer par un arrière $ ou $N $ SALT format?

  2. Python docs se réfère à DES, mais comment est SHA-512 ou MD5 étant appelé et où est la documentation pour cela?

  3. Suis-je vraiment censé prendre la sortie de crypt.crypt et couper la première 6$ et faire $N$SALT$CRYPTED? Est-ce que ansible besoins?

19
demandé sur felix 2013-03-05 22:45:24

8 réponses

l'exemple de python montré dans la documentation dépend de quelle version de crypt fonctionne sur le système d'exploitation que vous utilisez.

j'ai généré la crypt sur OS X et le serveur que je ciblais est ubuntu.

en raison de différences dans la mise en œuvre de crypt est offert par L'OS, le résultat est différent et incompatible.

Utilisez ceci à la place:

http://pythonhosted.org/passlib/

Passlib est un bibliothèque de hachage de mot de passe pour Python 2 & 3, qui fournit implémentations multiplateformes de plus de 30 algorithmes de hachage de mots de passe, ainsi qu'un cadre pour la gestion des mots de passe. C'est conçu pour être utile pour un large éventail de tâches, de la vérification d'un hachage trouvé dans / etc / shadow, à la fourniture de la force de hachage de mot de passe pour multi-utilisateur application.

>>> # 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.60pFS6W992T7Q1q2wikMbxYUvMHD1tT1'

31
répondu felix 2015-08-05 07:35:15

cela a fonctionné pour moi (en utilisant python 2.7.4):

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

j'ai un rva.yml qui ressemble à ceci:

---
password: $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 à l'aide de l'errance, vagrant up, et puis à partir d'une autre console je peux ssh à la VM nouvellement créée en utilisant l'utilisateur artefact créé par ansible, avec le mot de passe thisismypassword.

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

4
répondu Justin Simpson 2014-11-01 18:01:12

ceci a été mis à jour dans le Ansible docs. Il y a deux moyens privilégiés:

Comment puis-je 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) alors vous pouvez encore facilement générer ces mots de passe utilisent Python. Tout d'abord, assurez-vous que le mot de passe Passlib bibliothèque de hachage est installé.

pip install passlib

une fois la bibliothèque prête, les valeurs de mot de passe SHA512 peut alors être générée comme suit:

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

4
répondu Eli 2015-08-04 01:43:58

j'ai pris la réponse de@felix et en a fait un script que je pourrais inclure dans un projet docker sur lequel je travaille. Je sais que beaucoup de développeurs utilisent macOS/OSX et qu'il n'existe pas mkpasswd sur cette plateforme, donc je leur épargne le Googling.

j'ai ajouté les options suivantes:

  • PROCESS_TIME (booléen)
    • active la 2ème ligne de sortie avec le nombre de tours et CPU temps
  • ROUNDS (entier)
    • Remplace default_rounds valeur qui est réglée pour prendre ~300ms sur un système" moyen". Vous voulez un minimum de 100ms, mais doit être aussi grand que vous pouvez vous permettre.
#!/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:
# $rounds=656000$pfFmQISGcjWHOCxW$rBptiSK.tqSPnUiq6KiSHzz6LvvW/x1SjkkWFwxWB9Dt75NLNBs0N3OyGV4K5ejjBs/u.o3jtigvUKbmmwVQP.
#
# $ PROCESS_TIME=1 ./mkpasswd.py
# Password:
# $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
# $rounds=1280000$QO5FSyw5rQpiY6PIzRMJ4RzCbH61XxIdpsUm/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
répondu Bruno Bronosky 2017-07-14 19:43:27

j'ai utilisé 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
répondu Viraj 2014-08-15 18:55:12

essayez comme ceci

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
répondu Artem Feofanov 2014-04-09 15:14:11

Vous pouvez utiliser les filtres jinja2 qui ont la capacité de gérer la génération de mots de passe cryptés. Voici un exemple pratique 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, vous et les autres.

0
répondu Arbab Nazar 2016-05-01 19:31:04

besoins pwgen installé sur l'ordinateur hôte cible:

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

Utiliser hosts: localhost,set_fact et hostvars, si vous avez besoin de la "variable" être disponible dans le monde entier (les faits sont en lecture seule après la création):

{{hostvars['localhost']["new_fact"]}}
0
répondu sjas 2017-05-08 06:17:17