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 格式的任何内容。
问题:
提供给crypt.crypt
的salt是否应该以尾随的 $ 结尾,还是以 $ N $ SALT 格式结束?
Python文档是指DES,但是如何调用SHA-512或MD5以及它的文档在哪里?
我真的应该取crypt.crypt
的输出并切断第一个 $ 6 并使 $ N $ SALT $ CRYPTED ?这是ansible需要的吗?
答案 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
,因此我将他们保存为谷歌搜索。
我添加了以下选项:
#!/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: localhost
,set_fact
和hostvars。全球可用(事实在创建后只读):
{{hostvars['localhost']["new_fact"]}}