解決したい課題
Chefでは、user
リソースのpassword
プロパティにハッシュ化されたパスワードを記述することで、ユーザのパスワードを設定することができます。世の中のChefハウツー記事とかをみていると、パスワードをハッシュ化する方法として以下の MD5
でのハッシュを紹介している例が多いようです。
openssl passwd -1 "theplaintextpassword"
Chef社公式でも実際に紹介されていますし…
https://docs.chef.io/resource_user.html#password-shadow-hash
MD5
は今から10年以上前から安全性の限界が言われており、MD5
の使用は躊躇されるところであります。この記事では、SALT付きSHA-512でのパスワードハッシュ生成方法を紹介します。
実装例
unix-crypt
というgem
を利用します。
https://rubygems.org/gems/unix-crypt/versions/1.3.0
chef-client が使うrubyにgemをインストールする方法については別記事で紹介します。
sample recipe
require 'unix_crypt'
passwd = "theplaintextpassword"
salt = rand(36**16).to_s(36)
hashpass = UnixCrypt::SHA512.build(passwd, salt)
user "testuser01" do
password hashpass
end
上記のrecipeで生成されたパスワードハッシュは /etc/shadow
に格納されています。
$ grep testuser01 /etc/shadow
testuser01:$6$jf9jczpytkqh4d8d$cyeYxVzXZqXOdcaBFIEj4AB1u8jDKsTOdNZCtOq5EJQ09F6cdRcQg8Xril1iR5Rl4R3wzkyXlK.TM5roXyyDV1:17772:0:99999:7:::
このサンプルレシピは毎回ハッシュを生成するため、同じパスワード文字列を使っていても毎回user
リソースが実行されることにご注意ください。
補足
SALT付きSHA-256でハッシュ化する場合
UnixCrypt::SHA512
から UnixCrypt::SHA256
への変更に加え、SALTを16桁から8桁に変更します。
require 'unix_crypt'
passwd = "theplaintextpassword"
salt = rand(36**8).to_s(36)
hashpass = UnixCrypt::SHA256.build(passwd, salt)
user "testuser01" do
password hashpass
end
ちゃんとハッシュの冒頭が $5$
になっていることが確認できます。
$ grep testuser01 /etc/shadow
testuser01:$5$ma1rnyvi$77zJduFMQkEMHTurexnpCB.grZA/5b8xPFyRQZIb.MA:17772:0:99999:7:::
CentOS7でデフォルトのハッシュ化方式を変更・確認する
/etc/pam.d/system-auth
を直接確認・変更するより、authconfig
コマンドを使用するほうが推奨されるようです。
$ authconfig --test | grep hashing
password hashing algorithm is sha512
$ authconfig --passalgo=sha256 --update
$ authconfig --test | grep hashing
password hashing algorithm is sha256