Ansible userで毎回changedとなることを防ぐ


毎回changedになる理由

- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512') }}"

これをやってしまうと毎回ランダムなsaltでハッシュ化されたパスワードが生成されるため、都度chagned = Trueとなってしまう。

ランダムにしないためのsalt?

password_hash('sha512','salt')のように指定すると、毎回saltが固定されるためハッシュ化された値は同じになる。

- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512','salt') }}"

しかしコレだとsaltがハードコーティングされていることになり、しかも全アカウントで同じsaltを利用すると脆弱になる。

ソルトの再利用
プログラマがパスワードをハッシュ化する際に毎回同じソルトを使用するケース。 この場合でも、既存のレインボーテーブルを無効化することはできる(ソルトの値が適切であれば)。ただし、広く使われている製品にソルトがハードコーディングされると、そこから抽出したソルトを使って新しいレインボーテーブルを生成できてしまう。 また、ソルトが固定だと、パスワードが同じユーザーはハッシュ値も同じになってしまう(ハッシュ値を作る際にユーザ名を混ぜ込んでいる場合を除く)。これにより、一つのハッシュ値で複数のユーザーを攻撃するのが容易になってしまう。

結論

- name: user add yamashtt
  user:
    name: yamashtt
    password: "{{ user_passwd_postgres | password_hash( 'sha512', user_passwd_postgres_salt ) }}"
    shell: /bin/bash

group_varsuser_passwd_postgres(平文のパスワード)と一緒にuser_passwd_postgres_saltも定義する。チームメンバーにはアカウント毎にsaltも変更するように周知する。

コメント募集 解決済み

本記事初投稿時に{{}}の中で{{}}を使う方法がわからずにコメントを募集していました。
以下はその記録です。投稿してわずか15分程で回答をいただけてしまいました。スバラシイ!!!

初投稿時に記載していた内容

- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512','{{ user_passwd_postgres_salt }}') }}"

上記のように変数の中に変数をいれる(Linxuのevalみたいな)ことはできませんか?

いただいたコメント

コメントにて@akira6592さんよりサポートいただきました!ありがとうございます!

- name: usermod postgres password
  user:
    name:     "postgres"
    password: "{{ user_passwd_postgres | password_hash('sha512', user_passwd_postgres_salt ) }}"

{{}}の中では変数は全部展開されるんですね。わーお、スッキリ~!!