2014年9月25日木曜日

OpenLDAPのパスワードハッシュ形式

OpenLDAPにパスワードを格納する際に平文パスワードのままではセキュリティ上の懸念があるため、ハッシュ化した形式でパスワードを格納することが推奨されます。

OpenLDAPのデフォルトのパスワードハッシュ形式は SSHA (ソルト付きSHA1)ですが、SHA1の暗号強度が今日のコンピューターにとって十分とは言えない時代がやってきました。
このような状況に合わせて、MicrosoftやGoogleなどではSHA1の利用の中止が決まっています。

http://www.digicert.ne.jp/howto/basis/transitioning-to-sha-2.html
http://www.itmedia.co.jp/enterprise/articles/1409/08/news043.html


このような状況のため、OpenLDAPのパスワード格納に関してもSHA1の利用を中止し、SHA2へ移行する流れとなってきています。

OpenLDAPでSHA2形式でパスワードを格納する方法は2つあります。

1. pw-sha2オーバーレイによりSHA2形式のパスワード利用します。
  • OpenLDAP 2.4.32以降で実質的なSHA2サポートが始まり、利用が可能となりました。
  • 利用のためには、pw-sha2オーバーレイを有効にする必要があります。
  • {SHA256}、{SSHA256}、{SHA384}、{SSHA384}、{SHA512}、{SSHA512}に対応しています。
  • ハッシュ化パスワードのラウンドは行われません。
2. OSのcrypt(3)機能を利用し、{CRYPT}形式でSHA2ハッシュを利用します。
  • OpenLDAPでは、パスワードの形式として{CRYPT}を指定すると、OSのcrypt(3)機能を利用したハッシュ化が行われます。

    ハッシュできる形式は、OSのcrypt(3)が提供する形式に限られますが、RHEL6などの最近のOSであればSHA2に対応済みです。
  • 利用のためには、password-hashパラメーターと、password-crypt-salt-formatパラメーターの指定が必要です。
    password-hash "{CRYPT}"
    password-crypt-salt-format "$5$%.8s"

    $5$はSHA256形式のハッシュ化を意味し、"%.8s"の部分が8文字のランダムなソルトを付与することを意味します。SHA512を利用したい場合は、$5$の代わりに$6$を指定します。
  • {CRYPT}形式で指定したパスワードは、glibcのcrypt(3)によってSHA256/SHA512のハッシュ化が行われますが、この際、5000回のラウンド処理が行われます。ラウンド回数は salt-formatにroundsパラメーターで指定することが可能で、1000回以上を指定可能です。(1000回以下を指定すると、1000に設定されます)

    8000回のラウンドを指定する場合は、password-crypt-salt-formatに"rounds=8000$"をソルト文字列の前に付与します。
    password-crypt-salt-format "$5$rounds=8000$%.8s"
  • LDIFでパスワードを登録する際にSHA256などで{CRYPT}形式のハッシュ化パスワード文字列を得たいときは、slappasswdコマンドで生成します。
    $ slappasswd -c "$5$rounds=8000$%.8s" -s



2014年9月17日水曜日

OpenLDAP 全角半角問題

OpenLDAPでは、LDAPデータとして、UTF-8の文字列を登録することができる。

このときに、全角Aと半角Aは、同じ文字として扱われる。

たとえば、認証時のユーザー名に全角英数字を使っていても半角英数字と同じユーザー名として扱われるため、認証に成功する。

これは、Unicodeの正規化の処理によって同一文字とみなされるという仕様に従ったもので、設定などで変更することはできない。

OpenLDAPのUnicodeの正規化の処理は、openldap/libraries/liblunicode 配下のコードで行われている。

正規化に用いられるマッピング情報などは、Unicodeコンソーシアムの提供する情報をもとにしており、openldap/libraries/liblunicode/ucdata/uctable.hに定義されており、ビルド時にOpenLDAPに組み込まれている。