web-dev-qa-db-ja.com

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、および暗号化されたパスワードを区切る3つの$区切り文字が含まれます。

python crypt docs$ N形式については何も言及しないことに注意してください。

質問:

  1. crypt.cryptに指定されている、末尾が$で終わることになっているソルトか、または$ N $ SALT形式?

  2. PythonのドキュメントはDESを参照していますが、SHA-512またはMD5はどのように呼び出されますか。また、このドキュメントはどこにありますか?

  3. 私は本当にcrypt.cryptの出力を取得し、最初の$ 6を切り取って$にすることになっていますか? N $ SALT $ CRYPTED?これはansibleのニーズですか?

20
Chris Sattinger

ドキュメントに示されている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'

32
felix

これは私のために働きました(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ですか?

4
Justin Simpson

これは 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())"

4
Eli

私は @ felixの答え を受け取り、それをスクリプトにして、作業中のDockerプロジェクトに含めることができました。多くの開発者がmacOS/OSXを使用しており、そのプラットフォームにはmkpasswdがないことを知っているので、グーグルを保存しています。

次のオプションを追加しました。

  • PROCESS_TIME(boolean)
    • ラウンド数とCPU時間で出力の2行目を有効にします
  • 丸め(整数)
    • 「平均的な」システムで約300ミリ秒かかるように調整された default_rounds 値を上書きします。最小で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))
2
Bruno Bronosky

次のシェルコマンドを使用してパスワードを設定しています。

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

暗号化されたパスワードの生成を処理する機能を持つjinja2フィルターを使用できます。以下は、提供されたパスワードを使用してLinuxユーザーを作成するための実用的な例です。

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

これがあなたと他の人を助けることを願っています。

0
Arbab Nazar

このようにしてみてください

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をインストールする必要があります。

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

使用する hosts: localhostset_factとhostvars、「変数」をグローバルに使用可能にする必要がある場合(ファクトは作成後に読み取り専用になります):

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