如何使用ansible创建用户并设置密码?

时间:2013-03-05 18:45:24

标签: cryptography pycrypto ansible

documentation将我们引向github example,但这有点稀疏和神秘。

它说:

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

crypt.crypt没有发出示例所示的内容。它也使用MD5。

我试过了:

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

但是用户的密码字段应该是这样的:

password: $6$somereallyniceandbigrandomsalt$UqddPX3r4kH3UL5jq5/ZI.

其中包含三个 $ 分隔符,用于分隔6(表示其为SHA-512哈希值),salt和加密密码。

请注意,python crypt docs并未提及有关 $ N 格式的任何内容。

问题:

  1. 提供给crypt.crypt的salt是否应该以尾随的 $ 结尾,还是以 $ N $ SALT 格式结束?

  2. Python文档是指DES,但是如何调用SHA-512或MD5以及它的文档在哪里?

  3. 我真的应该取crypt.crypt的输出并切断第一个 $ 6 并使 $ N $ SALT $ CRYPTED ?这是ansible需要的吗?

8 个答案:

答案 0 :(得分:31)

文档中显示的python示例取决于您正在使用的操作系统上运行的crypt版本。

我在OS X上生成了crypt,我正在攻击的服务器是ubuntu。

由于操作系统提供的crypt实现不同,结果不同且不兼容。

请改用:

http://pythonhosted.org/passlib/

  

Passlib是Python 2的密码散列库。 3,提供   超过30种密码哈希算法的跨平台实现,   以及管理现有密码哈希的框架。它的   旨在用于广泛的任务,从验证哈希   在/ etc / shadow中找到,为提供全功能密码哈希   多用户应用程序。

>>> # import the hash algorithm
>>> from passlib.hash import sha512_crypt

>>> # generate new salt, and hash a password
>>> hash = sha512_crypt.encrypt("password")
>>> hash

'$ 6 $轮= 656000 $ $ BthPsosdEpqOM7Qd升/ ln9nyEfxM67ea8Bvb79JoW50pGjf6iM87taIvfSmpjasE4 / wBG1.60pFS6W992T7Q1q2wikMbxYUvMHD1tT1'

答案 1 :(得分:4)

这对我有用(使用python 2.7.4):

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

我有一个看起来像这样的vars.yml:

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

和这样的playbook.yml:

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

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

我使用vagrant vagrant up运行我的playbook,然后从另一个控制台使用由ansible创建的人工用户使用密码thisismypassword ssh到新创建的vm。

我只是将crypt.crypt的输出复制到名为password的ansible变量中并使用它。您在问题中显示的crypt的输出看起来太短,我不知道为什么你有这个,也许是不同版本的python?

答案 2 :(得分:4)

这已在Ansible docs中更新。有两种首选方式:

  

如何为用户模块生成加密密码?

     

大多数Linux系统上提供的mkpasswd实用程序是一个很好的选择:

     

mkpasswd --method=SHA-512如果您没有安装此实用程序   系统(例如,您正在使用OS X),然后您仍然可以轻松生成   这些密码使用Python。首先,确保Passlib密码   哈希库已安装。

     

pip install passlib

     

库准备好后,SHA512密码值   然后可以按如下方式生成:

     

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

答案 3 :(得分:2)

我拿了@felix's answer并将其变成了一个脚本,我可以将其包含在我正在处理的docker项目中。我知道很多开发人员使用macOS / OSX并且该平台上没有mkpasswd,因此我将他们保存为谷歌搜索。

我添加了以下选项:

  • PROCESS_TIME (布尔值)
    • 启用第二行输出,包括轮数和CPU时间
  • ROUNDS (整数)
    • 覆盖default_rounds值,该值在"平均值"上调整为〜300ms。系统。你想要至少100毫秒,但应该是你能负担得起的。
#!/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))

答案 4 :(得分:1)

我一直使用以下shell命令来设置密码。

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

答案 5 :(得分:0)

试试这个

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"

答案 6 :(得分:0)

您可以使用能够处理加密密码生成的jinja2过滤器。这是一个使用提供的密码创建linux用户的工作示例:

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

希望这会对你和其他人有所帮助。

答案 7 :(得分:0)

这需要在目标主机上安装pwgen

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

如果您需要&#39;变量&#39;请使用hosts: localhostset_fact和hostvars。全球可用(事实在创建后只读):

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