最初に
前回までのFDS記事でSASLという言葉が出てきましたが,そういえばこれまでSASLについてあまり触れることがありませんでしたので,今回はOpenLDAPとSASLの関係についてお話ししておきます。
SASLとはSimple Authentication and Security Layerの略であり,簡単に言ってしまうと認証のためのフレームワークのようなものです。SASLを使用することにより,開発者は既存のライブラリや仕組みを再利用することができ,利用者にはチャレンジ・レスポンス認証などの安全な認証方式を提供することができます。
また,認証方式についてですが,SASLの中にはいくつかのメカニズムが用意されており,Kerberos,GSSAPI,DIGEST-MD5などいくつかの方式を利用することができるのですが,今回は検証環境の関係上,KerberosなどではなくDIGEST-MD5やCRAM-MD5を用いて安全な認証を実現します。
OpenLDAPとSASLの関係
たとえば,今まで通り-xオプションを使ったシンプル認証で
% ldapsearch -x -D “uid=nomo,ou=People,dc=example,dc=com" -w abc123 -b “dc=example,dc=com" "objectClass=*"
という検索を行う場合,クライアントからサーバに次のようなデータが送信されます。abc123という文字列が暗号化されていないことがわかるでしょうか(図1)。
SASLを有効にすることで,前回の記事のAPOP同様,ネットワーク上に流れるパスワードを暗号化することができます。
それではさっそくSASLの設定です。/etc/openldap/slapd.confに以下を追記してslapdを再起動してください。
リスト1 slapd.confに追記する内容
sasl-regexp
uid=([^,]+),.*,cn=auth
uid=$1,ou=People,dc=example,dc=com
password-hash {CLEARTEXT}
クライアント側からSASL認証が要求されると,LDAPサーバは認証時に与えられたユーザ名を用いて,
uid=ユーザ名,cn=<レルム>,cn=digest-md5,cn=auth
(レルムが省略された場合はuid=ユーザ名,cn=digest-md5,cn=auth)
といったDNを生成します。ただし,実際にはこのようなエントリは存在しませんので,実際のDNにマッピングする設定が必要となります。そのための設定が
sasl-regexp 変換前DN 変換後DN
です。また,チャレンジ・レスポンス方式を使用する場合にはサーバ側に平文パスワード,または中間値が必要となりますので,エントリ中のuserPassword属性を常に平文で保存しておくため,
password-hash {CLEARTEXT}
を設定しています。この設定を行うことで
% ldappasswd -U nomo -w abc123 -Y digest-md5 -s hoge
のようにパスワードを変更しても,それがデフォルトのSSHA形式でなく常に平文状態で格納されるようになります。
エントリの登録
今回は
sasl-regexp uid=([^,]+),.*,cn=auth uid=$1,ou=People,dc=example,dc=com
という設定を行っているため,登録するエントリもuid=$1,ou=People,dc=example,dc=com に属している必要があります。
リスト2 サンプルエントリ
dn: dc=example,dc=c,om
objectClass: dcObject
objectClass: organization
dc: example
o: example
dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
dn: uid=nomo,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
sn: nomo
cn: nomo
uid: nomo
userPassword: abc123
エントリを登録できたら,後は次のように-Uオプションと-Yオプションを使用した検索が可能となります。
% ldapsearch -U proxy -Y digest-md5 -b "dc=example,dc=com" "objectclass=*"
Wiresharkで確認してみても,平文パスワードは確認できず,サーバから発行されたチャレンジに基づきクライアントが毎回異なったレスポンスを返していることがわかります(図2)。

