Netassist Blog

Ansibleでユーザパスワード設定

こんにちは當間です。お久しぶりです
書きたい事があるという技術部スタッフの執筆者が増え、中々私の番が回ってこないまま半年が経ってしまいました
Ansible 2.0 release からもう1年経ってしまいますが、このまま初歩からゆっくり紹介していきます

前回でAnsible環境の導入とユーザ追加まで行いました

  1. Ansible 2.0 導入
  2. Ansibleでユーザ追加

今回はcrypted passwordの項になります

 

userモジュールのpassword

ansibleのuserモジュールでユーザを追加する際にpasswordも併せて指定できますが、受け取った値をhash化せずそのまま/etc/shadowへ設定される形になるため、パスワード不一致によりログインできません

実証開始

例としてパスワードはグレートなユーザパスワード、略して’gre-user-w0rd’とします

$ vi site.yml
##################################################
---
- hosts: target
 vars:
 - username: hoge
 - password: gre-user-w0rd
 tasks:
 - name: Add User
 user: name={{ username }}
 password={{ password }}
##################################################
$ ansible-playbook -i hosts site.yml -K
 SUDO password:

PLAY [target] *********************************************

TASK [setup] *********************************************
 ok: [blog2]

TASK [Add User] *****************************************
 changed: [blog2]

PLAY RECAP ********************************************
 blog2 : ok=2 changed=1 unreachable=0 failed=0

changedとなり、hogeユーザにパスワードが設定されたようなので確認してみます

$ ssh blog2

$ sudo tail -1 /etc/shadow
 hoge:gre-user-w0rd:17161:0:99999:7:::

本来ここには$6$540Gov6cPiX553CP$v(省略)等とハッシュ化された文字列が格納されるべきですが、希望したグレートなユーザパスワード、gre-user-w0rdが平文で記載されています。

$ ssh blog2 -l hoge
hoge@blog2's password:
Permission denied, please try again.

当然このままではパスワード不一致となり追加ユーザではログインできません

実証ここまで

 

sha-512でhash化

というわけでグレユザワードをhash化する必要があります
今回対象サーバのblog2はCentOS6.8なので

 $ cat /etc/redhat-release
 CentOS release 6.8 (Final)

$ authconfig --test | grep hash
 password hashing algorithm is sha512

hashアルゴリズムはsha512にて実施します
CentOS6ならgrub-cryptコマンドを使うのが手っ取り早いですね

$ grub-crypt --sha-512
 Password:
 Retype password:
 $6$K.onA0aje27YvjAT$dJcXdkgB2nYACprLyUJnsdj/UIMptOyS500VtvzqlaDtGiivA1g.cvZSyz5SEPFgJDycgnV84.VCT0fdfHWev.

上記hash化したグレユザワードをplaybookに記載しましょう

 

sha-512でhash化したユーザパスワードを設定する

$ vi site.yml
##################################################
 ---
 - hosts: target
 vars:
 - username: hoge
 - password: '$6$K.onA0aje27YvjAT$dJcXdkgB2nYACprLyUJnsdj/UIMptOyS500VtvzqlaDtGiivA1g.cvZSyz5SEPFgJDycgnV84.VCT0fdfHWev.'
 tasks:
 - name: Add User
 user: name={{ username }}
 password={{ password }}
 become: yes
##################################################
$ ansible-playbook -i hosts site.yml -K
SUDO password:

PLAY [target] ******************************************************************

TASK [setup] *******************************************************************
ok: [blog2]

TASK [Add User] ****************************************************************
changed: [blog2]

PLAY RECAP *********************************************************************
blog2 : ok=2 changed=1 unreachable=0 failed=0

対象にログインして確認します

$ ssh blog2

$ sudo tail -1 /etc/shadow
hoge:$6$K.onA0aje27YvjAT$dJcXdkgB2nYACprLyUJnsdj/UIMptOyS500VtvzqlaDtGiivA1g.cvZSyz5SEPFgJDycgnV84.VCT0fdfHWev.:17161:0:99999:7:::

hash化されたパスワードが格納されているので、実際にログイン確認してみます

$ ssh blog2 -l hoge
hoge@blog2's password:

$ whoami
hoge

追加したhogeユーザとそのパスワード、グレユザワードでログインできました!

しかし、playbookに記載するhash化パスワードを別途手動で実行して用意するのは手間ですし、hash化する前のパスワードを忘れてしまうとアウトです。
CentOS7にはgrub-cryptコマンドがないので、そちらもネックとなります。
パスワードを考えるのもmkpasswdコマンドがあると便利ですがデフォルトで導入されてないのが普通です。

 

次回

というわけで次回は、

  • パスワードを別途hash化しなくても済む方法
  • ランダムパスワードを作成

このあたりについて書いていきます