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、および暗号化されたパスワードを区切る3つの$区切り文字が含まれます。
python crypt docs は$ N形式については何も言及しないことに注意してください。
質問:
crypt.crypt
に指定されている、末尾が$で終わることになっているソルトか、または$ N $ SALT形式?
PythonのドキュメントはDESを参照していますが、SHA-512またはMD5はどのように呼び出されますか。また、このドキュメントはどこにありますか?
私は本当にcrypt.crypt
の出力を取得し、最初の$ 6を切り取って$にすることになっていますか? N $ SALT $ CRYPTED?これはansibleのニーズですか?
ドキュメントに示されているpythonの例は、使用しているOSで実行されているcryptのバージョンによって異なります。
私はOS Xで暗号を生成し、ターゲットにしたサーバーはubuntuです。
OSが提供する暗号化の実装の違いにより、結果は異なり、互換性がありません。
代わりにこれを使用してください:
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 $ rounds = 656000 $ BthPsosdEpqOM7Qd $ l/ln9nyEfxM67ea8Bvb79JoW50pGjf6iM87taIvfSmpjasE4/wBG1.60pFS6W992T7Q1q2wikMbxYUvMHD1tT1'
これは私のために働きました(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
を使用してプレイブックを実行し、別のコンソールから、パスワードthisismypassword
を使用して、ansibleによって作成されたArtefactualユーザーを使用して、新しく作成されたvmにsshできます。
Crypt.cryptの出力をpasswordという名前のansible変数にコピーして使用しました。あなたの質問に示しているcryptの出力は短すぎるようです、なぜそれを取得したのか、おそらく異なるバージョンのpythonですか?
これは Ansible docs で更新されました。 2つの推奨される方法があります。
ユーザーモジュールの暗号化されたパスワードを生成するにはどうすればよいですか?
ほとんどの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())"
私は @ felixの答え を受け取り、それをスクリプトにして、作業中の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))
次のシェルコマンドを使用してパスワードを設定しています。
- name: "Set user password: someuser"
command: 'echo "somepassword"| passwd --stdin "someuser"'
Sudo: yes
暗号化されたパスワードの生成を処理する機能を持つjinja2フィルターを使用できます。以下は、提供されたパスワードを使用してLinuxユーザーを作成するための実用的な例です。
- name: Creating Linux User
user:
name: "{{ myuser }}"
password: "{{ mypassword | password_hash('sha512') }}"
これがあなたと他の人を助けることを願っています。
このようにしてみてください
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"
これには、ターゲットホストにpwgen
をインストールする必要があります。
- name: generate linux user password
local_action: Shell /usr/bin/pwgen 16 1
register: generated_linux_user_password
使用する hosts: localhost
、set_fact
とhostvars、「変数」をグローバルに使用可能にする必要がある場合(ファクトは作成後に読み取り専用になります):
{{hostvars['localhost']["new_fact"]}}