そろそろLDAPにしてみないか?

第18回 OpenLDAPとSASL

この記事を読むのに必要な時間:およそ 2 分

最初に

前回までの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)。

図1 Wiresharkでパケットをキャプチャした様子

図1 Wiresharkでパケットをキャプチャした様子

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)。

図2 パケットをキャプチャした様子

図2 パケットをキャプチャした様子

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。

コメント

コメントの記入