毎回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を利用すると脆弱になる。
- 参考:Wikipedia - ソルト (暗号)
-
よくある誤用を参照されたし。
-
ソルトの再利用
プログラマがパスワードをハッシュ化する際に毎回同じソルトを使用するケース。 この場合でも、既存のレインボーテーブルを無効化することはできる(ソルトの値が適切であれば)。ただし、広く使われている製品にソルトがハードコーディングされると、そこから抽出したソルトを使って新しいレインボーテーブルを生成できてしまう。 また、ソルトが固定だと、パスワードが同じユーザーはハッシュ値も同じになってしまう(ハッシュ値を作る際にユーザ名を混ぜ込んでいる場合を除く)。これにより、一つのハッシュ値で複数のユーザーを攻撃するのが容易になってしまう。
結論
- name: user add yamashtt
user:
name: yamashtt
password: "{{ user_passwd_postgres | password_hash( 'sha512', user_passwd_postgres_salt ) }}"
shell: /bin/bash
group_varsにuser_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 ) }}"
{{}}の中では変数は全部展開されるんですね。わーお、スッキリ~!!