Ansibleでユーザパスワードを変更してSSMパラメータストアにパスワードを保存する


実現したいこと

Ansibleを使用してTargetサーバのユーザのパスワードを変更します。
変更後のパスワードはAWS Systems Managerの一機能であるパラメータストアに保存したいと思います。
パラメータストアは無料でリージョンごとに10000個までのパラメータを管理することができます。

前回に引き続き、Docker + Ansibleの環境で以下を実現します。
①ランダムパスワードを生成する
②ユーザのパスワードを変更する
③SSMパラメータストアにパスワードを保存する

設定

DockerとAnsibleの細かい設定は前回の記事と同じであるため省略します。
変更するのはmain.ymlです。

まずは、15文字のランダムなパスワードを生成します。
次に、生成されたパスワードを表示します。
生成されたパスワードを対象のユーザに設定します。
最後にAWS CLIコマンドでパラメータストアにパスワードを保存します。

ssm put-parameterの補足説明です。
・パスワードと紐づける名前を--nameで指定。また、"/"を使用して階層を設定
・typeにSecureStringを指定して、デフォルトのAWS KMS Keyを使用してパラメータを暗号化
 (デフォルトのAWSマネージドキーの場合はKey IDを指定しない)
・regionを指定する (.aws/configにリージョンを設定していても、明示的に指定しないとエラーになる)

main.yml
- hosts: targets
  become: yes
  gather_facts: no
  tasks:
    ##################################################
    # Generate new password
    ##################################################
    - name: Generate new password
      shell: cat /dev/urandom | base64 | fold -w 15 | head -n1
      register: random_password

    ##################################################
    # Display the output
    ##################################################
    - name: Output
      debug:
        msg: Password -> [ {{random_password.stdout_lines[0]}} ]

    ##################################################
    # Change password of the user
    ##################################################
    - name: Change password
      user:
        name: test-user
        password: "{{ random_password.stdout_lines[0] | password_hash('sha512') }}"

    ##################################################
    # Add the password to Parameter Store
    ##################################################
    - name: Put password
      delegate_to: localhost
      shell: >
        aws ssm put-parameter
        --name "/Passwords/test-user"
        --type "SecureString"
        --value {{random_password.stdout_lines[0]}}
        --region ap-northeast-1

IAMポリシー

EC2からSystems Managerへパラメータを設定できるようにするため、最低限以下のポリシーをEC2に設定したIAMロールに与える必要があります。
・ssm:PutParameter

実行結果

では、AnsibleのPlaybookを実行します。

ansible-playbook -i ./inventory ./main.yml

PLAY [targets]****************************************************************************************************
TASK [Generate new password] *************************************************************************************
changed: [10.0.1.100]

TASK [Output] ****************************************************************************************************
ok: [10.0.1.100] => {
    "msg": "Password -> [ LAnjvZ5d/CdrFEE ]"
}

TASK [Change password] *******************************************************************************************
changed: [10.0.1.100]

TASK [Put password] **********************************************************************************************
changed: [10.0.1.100]

PLAY RECAP *******************************************************************************************************
10.0.1.100                 : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

変更後のパスワードでサーバにログイン

無事に変更後のパスワードでSSH接続ができました。

1つ注意点として、Ansibleコマンドでパスワードを変更する際に、password_hash('sha512')で
hash化しなければ、パスワードが変更されてもSSHでログインできません。

以下のように警告が表示されます。

[WARNING]: The input password appears not to have been hashed. The 'password'
argument must be encrypted for this module to work properly.

AWSマネジメントコンソールでの結果確認

パラメータストアを確認します。
階層が設定されていますが、数が多くなると見づらくなりそうです。

test-userのパスワードを確認します。
暗号化したので、値のところにある「表示」をクリックすると平文で見えるようになります。