1
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

ChefTips: SALT付きSHA-512でパスワードのshadow hashを生成する

解決したい課題

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

参考

Chefと/etc/shadowとRuby

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?