連載
» 2009年01月21日 00時00分 公開

OpenLDAPで始めるディレクトリサーバ構築(4):考えておこう! OpenLDAPのセキュリティ設定 (2/3)

[菊池研自,伊藤忠テクノソリューションズ株式会社]

slapd.confの設定によるアクセスコントロール

 LDAPサーバは、ネットワーク上でユーザー名、コンピュータ名といったディレクトリ情報を提供するため、誰にどの情報を提供するかというアクセス制御が必要になります。OpenLDAPでは、slapd.confファイルのグローバルセクション、または各バックエンドデータベースセクションに、以下の書式で記述することができます。

access to <what> [ by <who> <access> [ <control> ] ]+

 各バックエンドデータベースセクションに記述がない場合は、グローバルセクションの設定が適用されます。また、グローバルセクションにも設定がない場合は、すべてのユーザーに対し、すべての情報が参照可能となります。

 デフォルト状態のslapd.confファイルは、「access to」ディレクティブがコメントアウトされているため、ユーザー認証用のパスワードなど、他人に知られたくない情報を含むすべてのディレクトリ情報が参照可能です。

 このため、OpenLDAP運用時には登録する情報の性質を考慮し、むやみに情報を提供しないよう「access to」ディレクティブを適切に設定しておく必要があります。今回は、前回登録済みのエントリのうち一般に参照を許すべきでない情報をuserPassword属性として、次の設定を行っておきます(注1)。また、少し厳しいかもしれませんが、パスワード変更に必要な属性を除くすべての属性の変更権は、デフォルトのまま管理者にのみ与えておきます。

# vi /etc/openldap/slapd.conf
……[略]……
access to dn.subtree="ou=People,dc=my-domain,dc=com" attrs=shadowLastChange
  by self write
  by * read

access to dn.regex=".*,ou=(People|Group),dc=my-domain,dc=com$" attrs=userPassword
  by self write
  by anonymous auth

access to dn.subtree="dc=my-domain,dc=com"
  by * read



# service ldap restart

注1:「access to」ディレクティブの設定は、「man slapd.access」で確認できるとおり、さまざまな設定が可能です。


SSL/TLSを用いた通信経路の暗号化

 ここまで、OpenLDAPサーバのセキュアな運用のために、userPassword属性については、暗号化しLDAPサーバ上に保存すること、シェルのヒストリに残さないこと、そして情報の性質を考慮しむやみに参照/更新可能にしないことを説明してきました。

 しかしながら、まだ注意しなければならないことがあります。それは、LDAPサーバへの認証情報送付時に、パスワードが平文のままでネットワーク上を流れていることです。ネットワーク上でパケットキャプチャが可能な場合は、第三者がパスワードを確認できてしまいます。

 この問題に対処する機能が、SSL/TLS通信を利用した通信経路そのものの暗号化です。CentOS、またはその上位ディストリビュータから配布されるopenldap-serversパッケージのインストール時には、「make slapd.pem」コマンドを利用し、認証局から証明されていない状態ではあるものの、証明書ファイルが作成されています(注2)。

# rpm -qf /etc/pki/tls/certs/slapd.pem
openldap-servers-2.3.27-8.el5_2.4

注2:ソースコードからコンパイルしたOpenLDAPを利用している場合、別途、/etc/pki/tls/certsディレクトリにて「make slapd.pem」コマンドを実行して証明書を用意してください。


 このため、SSL/TLS通信の設定は、slapd.confファイルにてコメント化された「TLSCertificateFile」「TLSCertficateKeyFile」ディレクティブにデフォルト状態で指定された証明書ファイルおよび鍵ファイルの設定をコメントインし、先頭が空白で始まらないように調整するだけです。

# vi /etc/openldap/slapd.conf
……[略]……
# The next three lines allow use of TLS for encrypting connections using a
# dummy test certificate which you can generate by changing to
# /etc/pki/tls/certs, running "make slapd.pem", and fixing permissions on
# slapd.pem so that the ldap user or group can read it. Your client software
# may balk at self-signed certificates, however.
# TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
TLSCertificateFile /etc/pki/tls/certs/slapd.pem                ←コメントイン
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem             ←コメントイン

# service ldap restart

 なお、SSLv2、SSLv3、TLSといったプロトコル、鍵交換方式、暗号アルゴリズム、鍵長などのサーバ-クライアント間で利用する暗号方式セットの選択には、「TLSCipherSuite」ディレクティブを利用できます。

 また、OpenLDAPの起動時には、「-h」オプションを利用してldapsポートを追加でバインドする必要がありますが、この設定には同一rpmパッケージに含まれるrcスクリプトを利用すると便利です。これは、rcスクリプトである/etc/init.d/ldapファイル中に、slapd.confファイルをチェックし、TLSで始まる行がある場合は、ldapsポートをバインドポートに加える記述があるためです。

# lsof -i tcp:ldap -i tcp:ldaps
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
slapd 5732 ldap 7u IPv6 13825 TCP *:ldap (LISTEN)
slapd 5732 ldap 8u IPv4 13826 TCP *:ldap (LISTEN)
slapd 5732 ldap 9u IPv6 13830 TCP *:ldaps (LISTEN)         ←追加されたldapsポート
slapd 5732 ldap 10u IPv4 13831 TCP *:ldaps (LISTEN)        ←追加されたldapsポート

 正しくldapsポートでリスニングが開始されたでしょうか? 次は、LDAPクライアント側の設定です。

  • ldapsearchコマンドなどOpenLDAPクライアントコマンドを利用する場合は、/etc/openldap/ldap.confファイルに
  • pam、nss経由でldap接続する場合は、pam_ldap.so、nss_ldap.soが参照する/etc/ldap.confファイルに

次の設定を追加します。

# vi /etc/openldap/ldap.conf(または# vi /etc/ldap.conf
……[略]……
URI ldaps://127.0.0.1/
TLS_REQCERT never(またはTLS_REQCERT allow)

 上記の設定は、「URI」ディレクティブにてldapsプロトコルを用いてローカルホスト上でldapsポートで待ち受けるOpenLDAPサーバへ接続すること、および「TLS_REQCERT」ディレクティブにて認証局より認証されていないサーバ証明書をクライアントが受け入れる旨を指定しています。

 それではtcpdumpコマンドを用いてローカルインターフェイスのパケットをキャプチャしながら、クライアントからの接続時にldaps通信が行われていることを確認してみましょう。

# tcpdump port ldaps -i lo -X -s 1024
……[略]……
16:22:52.779049 IP cent52a.my-domain.com.ldaps > cent52a.my-domain.com.53923: P 1:1144(1143) ack 134 win 529 <nop,nop,timestamp 11456317 11456315>
    0x0000: 4500 04ab 2353 4000 4006 14f8 7f00 0001 E...#S@.@.......
    0x0010: 7f00 0001 027c d2a3 bfb2 edbb bfef b481 .....|..........
    0x0020: 8018 0211 02a0 0000 0101 080a 00ae cf3d ...............=
    0x0030: 00ae cf3b 1603 0100 4a02 0000 4603 0149 ...;....J...F..I
    0x0040: 44b4 4cd6 aa9b 67e6 8bf3 14ce d5fd 5f5f D.L...g.......__
……[略]……

 サーバ証明書がクライアントに渡った後、暗号化通信が開始され、すべての通信がネットワーク上で不可視となっていることが確認できたはずです。

 実運用では、LDAPクライアントが正しいサーバへ接続していることを保証できるように、確実な認証局から発行されたサーバ証明書を利用し、クライアント側の「URI」ディレクティブにはサーバ証明書に指定された正しいサーバのFQDNを指定するようにしてください。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。