ユーザー情報や組織情報などを一元的に管理するディレクトリサーバは、企業システムの中で重要な役割を果たしています。この連載ではオープンソースの「OpenLDAP」を用いて、ディレクトリサーバの構築・活用方法を解説します。(編集部)
前回の「OpenLDAPサーバを利用したユーザー認証」では、エントリを投入し、ユーザー認証を実行しその結果を確認するところまでを説明しました。今回は、OpenLDAPサーバの運用においてセキュリティ面で考慮すべき点と、それに関連する設定方法を説明していきます。
OpenLDAPのLDAPサーバであるslapdプログラムは、デフォルト状態ではすべてのIPアドレスをリスニングしながらLDAPクライアントのリクエストを受け付けています。
# service ldap start |
複数のネットワークインターフェイスを持つホストでのLDAPサーバ運用時に、セキュリティ上、特定インターフェイスからのみアクセスを受け付けたい場合や、同一ホスト上のLDAPクライアントからのみにアクセスを制限したい場合は、slapdプログラムの起動時に「-h」オプションを付与することでslapdプログラムがバインドするIPアドレスを指定することができます。
本連載で対象としているCentOS、またはその上位ディストリビュータから配布されるOpenLDAPを利用する場合、「-h」オプションを用いたIPバインド設定は、同一rpmパッケージに含まれるrcスクリプトを利用して調整すると便利です。
# vi /etc/init.d/ldap |
OpenLDAPのLDAPサーバプログラムであるslapdは、TCP Wrapperを利用することもできます。通常、TCP Wrapperを利用するためには、OpenLDAPのコンパイル時に「--enable-wrappers」を明示的に指定する必要がありますが、本連載で対象としているCentOS、またはその上位ディストリビュータから配布されるslapdプログラムは、「--enable-wrappers」が有効な状態でコンパイルされ、実行時にTCP Wrapperから提供されるライブラリへリンクが可能な状態となっています。
# ldd `which slapd` | grep libwrap |
このため、/etc/hosts.allowまたは/etc/hosts.denyに次のように記述することで、簡単にTCP Wrapperを利用したアクセス制御が可能になります。
# vi /etc/hosts.allow |
→ Linux Tips:TCP Wrapperの設定が正しいかどうか調べるには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/235chktcpwrapper.html
ソースコードからOpenLDAPをコンパイルしインストールすると、設定ファイルであるslapd.confでは、次の管理ユーザー用DN(「rootdn」ディレクティブ)とそのパスワード(「rootpw」ディレクティブ)が有効になっています。
# grep ^root [インストールdir]/etc/openldap/slapd.conf |
この「rootdn」ディレクティブは、対象データベースのアクセス制御に従わないDNを指定することができるものです。このため、このslapd.confファイルに記述された「rootdn」「rootpw」ディレクティブを変更せずそのままの状態で運用を開始しては、非常に危険な要素を含んだ運用となってしまいます。「rootpw」ディレクティブは確実に変更しておきましょう。
さらにslapd.confファイルでは、この「rootpw」ディレクティブへ設定する値を、{CRYPT}、{MD5}、{SMD5}、{SSHA}、{SHA}といった一方向性ハッシュ関数を利用して暗号化することができます。
# slappasswd -h {SSHA} -s secret ←文字列“secret”をSSHAでハッシュ |
このように「rootpw」ディレクティブに設定する値を暗号化しておくことで、slapd.confが直接参照されたとしても、実際のパスワード値への変換は困難なため、セキュリティを強化する役目を果たすことになります。
せっかく暗号化したパスワードですが、ldapsearch、ldapaddといったOpenLDAPクライアントコマンドからLDAPサーバへパスワードを送付するには、コマンドライン上からは平文でパスワードを指定する必要があります。
ここで問題になるのが、シェルのヒストリ機能です。例えば「-D」オプションを用いた簡易認証利用時に、「-w」オプションに続けてパスワードを指定した場合、シェルのヒストリをさかのぼることでパスワードが確認できてしまいます。
# 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 |
平文で登録した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 |
Copyright © ITmedia, Inc. All Rights Reserved.