毎回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 ) }}"
{{}}
の中では変数は全部展開されるんですね。わーお、スッキリ~!!