ActiveLdap でアカウントパスワードを設定する方法

LDAPLinux 等のユーザアカウントDBとして利用するのが一般的な用途ですが、ユーザたちのパスワード設定する方法をそう言えば書いていませんでした。

ユーザエントリには posixAccount オブジェクトクラスを持たせて userPassword にパスワード文字列を設定します。一般的にパスワード文字列は生のまま保存せず、一方向ハッシュにして保存するというセキュリティ上の作法がよく知られていると思います。

OpenLDAP でも、この方式に対応しています*1 。また、ハッシュアルゴリズムは幾つかの種類が利用できるようになっています。一方でそれ故に、単に userPassword にハッシュサムを入れれば良いという事にはなっていません。ハッシュサムの値を見たところで、その値がどのアルゴリズムによって作られたかは見分けがつかないし、アルゴリズムが特定できない以上はパスワードの検証が出来ないからです。

では、どのようにハッシュサムを userPassword に格納するかですが、実際に見た方が早いでしょう。以下が実際のパスワード設定例です。

# 新しいパスワード(悪いパスワードの例)
new_password = 'hogehoge'

# パスワードのハッシュサムを得る。今回のアルゴリズムは SSHA。
hash_sum = ActiveLdap::UserPassword.ssha(new_password) # => "{SSHA}2HlHGgDB47/vD5+v0k8DhOOcbj9wZ1Zo"

# エントリを取得して、userPassword にハッシュサムを入れて、保存
u = User.find('tashen')
u.user_password = hash_sum
u.save # => true

# bind してみて成功
u.bind(new_password) # => true

見ての通り ActiveLdap::UserPassword がこのあたりの処理を楽にしてくれます。セキュリティ上の理由からして、今のところお勧めアルゴリズムは SSHA です。

include ActiveLdap::UserPassword

ssha "hogehoge" # => "{SSHA}1eMI336vCgcPUI1hc+9IpLCVa0hHUVZS"
smd5 "hogehoge" # => "{SMD5}M8F+FUSKpVMHWrw5I+FBSHM5V2Y="
sha "hogehoge" # => "{SHA}OyxsENDngHLRTgLMTFh4FNDxDzo="
md5 "hogehoge" # => "{MD5}MpQ15eZr6AmmVq8QX0JAHg=="

*1:何故 OpenLDAP に限定して書いているかと言うのは後日