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

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

ユーザー情報や組織情報などを一元的に管理するディレクトリサーバは、企業システムの中で重要な役割を果たしています。この連載ではオープンソースの「OpenLDAP」を用いて、ディレクトリサーバの構築・活用方法を解説します。(編集部)

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

 前回の「OpenLDAPサーバを利用したユーザー認証」では、エントリを投入し、ユーザー認証を実行しその結果を確認するところまでを説明しました。今回は、OpenLDAPサーバの運用においてセキュリティ面で考慮すべき点と、それに関連する設定方法を説明していきます。

IPバインドによるアクセス制限

 OpenLDAPのLDAPサーバであるslapdプログラムは、デフォルト状態ではすべてのIPアドレスをリスニングしながらLDAPクライアントのリクエストを受け付けています。

# service ldap start
# lsof -n -i tcp:ldap

COMMAND   PID USER   FD   TYPE   DEVICE SIZE NODE NAME
slapd   20965 ldap    7u  IPv6 19369452       TCP *:ldap (LISTEN)
slapd   20965 ldap    8u  IPv4 19369453       TCP *:ldap (LISTEN)

 複数のネットワークインターフェイスを持つホストでのLDAPサーバ運用時に、セキュリティ上、特定インターフェイスからのみアクセスを受け付けたい場合や、同一ホスト上のLDAPクライアントからのみにアクセスを制限したい場合は、slapdプログラムの起動時に「-h」オプションを付与することでslapdプログラムがバインドするIPアドレスを指定することができます。

 本連載で対象としているCentOS、またはその上位ディストリビュータから配布されるOpenLDAPを利用する場合、「-h」オプションを用いたIPバインド設定は、同一rpmパッケージに含まれるrcスクリプトを利用して調整すると便利です。

# vi /etc/init.d/ldap
...[略]...
function start() {
...[略]...
        #harg="ldap:///"                        ←コメントアウト
        harg="ldap://127.0.0.1/ ldap://[::1]/"  ←localhostのみのバインドに変更
...[略]...
        exec ${slapd} -h "$harg" -u ${user} $OPTIONS $SLAPD_OPTIONS
...[略]...

# service ldap restart
# lsof -n -i tcp:ldap

COMMAND   PID USER   FD   TYPE   DEVICE SIZE NODE NAME
slapd   30247 ldap    7u  IPv4 19401536       TCP 127.0.0.1:ldap (LISTEN)
slapd   30247 ldap    8u  IPv6 19401537       TCP [::1]:ldap (LISTEN)

TCP Wrapperを用いたアクセス制限

 OpenLDAPのLDAPサーバプログラムであるslapdは、TCP Wrapperを利用することもできます。通常、TCP Wrapperを利用するためには、OpenLDAPのコンパイル時に「--enable-wrappers」を明示的に指定する必要がありますが、本連載で対象としているCentOS、またはその上位ディストリビュータから配布されるslapdプログラムは、「--enable-wrappers」が有効な状態でコンパイルされ、実行時にTCP Wrapperから提供されるライブラリへリンクが可能な状態となっています。

# ldd `which slapd` | grep libwrap
        libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00d23000)

 このため、/etc/hosts.allowまたは/etc/hosts.denyに次のように記述することで、簡単にTCP Wrapperを利用したアクセス制御が可能になります。

# vi /etc/hosts.allow
slapd: 192.168.1.0/255.255.255.0 127.0.0.1 : ALLOW
slapd: ALL : DENY

関連記事

→ Linux Tips:TCP Wrapperの設定が正しいかどうか調べるには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/235chktcpwrapper.html


rootdn/rootpwディレクティブでのパスワード変更

 ソースコードからOpenLDAPをコンパイルしインストールすると、設定ファイルであるslapd.confでは、次の管理ユーザー用DN(「rootdn」ディレクティブ)とそのパスワード(「rootpw」ディレクティブ)が有効になっています。

# grep ^root [インストールdir]/etc/openldap/slapd.conf
rootdn          "cn=Manager,dc=my-domain,dc=com"
rootpw          secret

 この「rootdn」ディレクティブは、対象データベースのアクセス制御に従わないDNを指定することができるものです。このため、このslapd.confファイルに記述された「rootdn」「rootpw」ディレクティブを変更せずそのままの状態で運用を開始しては、非常に危険な要素を含んだ運用となってしまいます。「rootpw」ディレクティブは確実に変更しておきましょう。

slappasswdコマンド

 さらにslapd.confファイルでは、この「rootpw」ディレクティブへ設定する値を、{CRYPT}、{MD5}、{SMD5}、{SSHA}、{SHA}といった一方向性ハッシュ関数を利用して暗号化することができます。

# slappasswd -h {SSHA} -s secret        ←文字列“secret”をSSHAでハッシュ
{SSHA}yyvyWUCDENa3jZihWJdjJ5KYJRscBmnJ

# vi /etc/openldap/slapd.conf
...[略]...
#rootpw secret                                 ←削除
rootpw {SSHA}yyvyWUCDENa3jZihWJdjJ5KYJRscBmnJ  ←ハッシュした値を設定

# service ldap restart

 このように「rootpw」ディレクティブに設定する値を暗号化しておくことで、slapd.confが直接参照されたとしても、実際のパスワード値への変換は困難なため、セキュリティを強化する役目を果たすことになります。

OpenLDAPクライアントコマンドの-Wオプション

 せっかく暗号化したパスワードですが、ldapsearch、ldapaddといったOpenLDAPクライアントコマンドからLDAPサーバへパスワードを送付するには、コマンドライン上からは平文でパスワードを指定する必要があります。

 ここで問題になるのが、シェルのヒストリ機能です。例えば「-D」オプションを用いた簡易認証利用時に、「-w」オプションに続けてパスワードを指定した場合、シェルのヒストリをさかのぼることでパスワードが確認できてしまいます。

# ldapsearch -x -D "cn=Manager,dc=my-domain,dc=com" -w secret
(CTRL+p)

# ldapsearch -x -D "cn=Manager,dc=my-domain,dc=com" -w secret  ←パスワードが表示される

 このとき役に立つのが、「-W」オプションを指定しOpenLDAPのクライアントコマンドを実行する方法です。この方法を用いることでパスワードは対話的に求められるようになり、シェルのヒストリに保存されることはありません。

# ldapsearch -x -D "cn=Manager1,dc=my-domain,dc=com" -W
Enter LDAP Password: secret
……[略]……

(CTRL+p)
# ldapsearch -x -D "cn=Manager1,dc=my-domain,dc=com" -W       ←パスワードが表示されない

password-hashディレクティブ

 平文で登録したuserPassword属性がある場合、ldapsearchコマンドで取得するこの属性は、コロン2つ(::)に続けてbase64形式でエンコードされ表示されているだけですので、読み出し可能なアクセスコントロールが設定されている場合は簡単にデコードし、平文のパスワードを確認できてしまいます。

 ここで役立つのが、「password-hash」ディレクティブです。このディレクティブは、RFC3062で定義されるLDAP Password Modify Extended Operation利用時に、指定したハッシュアルゴリズムを使用してuserPassword属性値を暗号化し、OpenLDAPサーバに格納する機能を提供します。

 このとき、LDAPクライアントからのLDAP Password Modify Extended Operationの利用には、ldappasswdコマンドおよび/etc/ldpa.confにおける「pam_password」ディレクティブを利用することができます。

# vi /etc/ldap.conf
…[略]…
pam_password exop                ←passwdコマンド利用時に、EXOPを利用

# vi /etc/openldap/slapd.conf
…[略]…
password-hash {SSHA}             ←グローバルセクションに設定

# service ldap restart

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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