Product SiteDocumentation Site

11.7. LDAP ディレクトリ

OpenLDAP は LDAP プロトコルの実装です; 言い換えれば、LDAP プロトコルとはディレクトリを保存するために設計された特製データベースです。これが最もよく使われる用途は、LDAP サーバを使ってユーザアカウントと関連するパーミッションの中央管理を行う場合です。更に、LDAP データベースは簡単に複製できるので、復数の同期された LDAP サーバをセットアプすることが可能になります。ネットワークとユーザの数が急速に多くなった場合でも、復数のサーバ間で負荷のバランスをとることが可能です。
LDAP データは階層的に構造化されています。データ構造は「スキーマ」によって定義され、スキーマはデータベースに保存できるオブジェクトの種類をその属性リストと一緒に説明しています。データベース内の特定のオブジェクトを参照するために使われる構文はデータ構造に依存し、構文の複雑さはデータ構造の複雑さに対応します。

11.7.1. インストール

slapd パッケージには、OpenLDAP サーバが含まれます。ldap-utils パッケージには、LDAP サーバと情報をやり取りするためのコマンドラインツールが含まれます。
slapd のインストールは、debconf を設定して低い優先度の質問を表示するようにしていない限り、通常非対話的です。とは言っても、slapd は debconf を使うパッケージですから、dpkg-reconfigure slapd を使えば簡単に LDAP データベースを再設定することが可能です。
  • OpenLDAP サーバ設定を中止しますか? もちろん No です。我々は LDAP サービスを設定します。
  • DNS ドメイン名: 「falcot.com」。
  • 組織名: 「Falcot Corp」。
  • 管理用パスワードを打ち込む必要があります。
  • 使用するデータベースバックエンド: 「HDB」。
  • slapd を完全消去する場合に、データベースを削除しますか? いいえ。間違ってデータベースを失う危険性を増やすのは得策ではありません。
  • 古いデータベースを移動しますか? データベース既に存在するにも関わらず、設定を行おうとした場合に、この質問を尋ねられます。例えば、最初のインストールの直後に dpkg-reconfigure slapd を実行する場合など、空っぽのデータベースをから設定を再開したい場合、答えは「yes」です。
  • LDAPv2 プロトコルを許可しますか? いいえ、許可する意味が無いからです。我々が使おうとしているツールは全て LDAPv3 プロトコルを理解します。
以下の問い合わせによって実例を示す通り、最低限のデータベースが設定されています:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot

# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2
この問い合わせの結果 2 種類のオブジェクトが返されました: 組織自身と、管理ユーザです。

11.7.2. ディレクトリの書き込み

空っぽのデータベースは特に便利というわけではないので、全ての存在するディレクトリをデータベースに投入することにします; ディレクトリにはユーザ、グループ、サービス、ホスト名データベースが含まれます。
migrationtools パッケージには、標準的な Unix ディレクトリ (/etc/passwd/etc/group/etc/services/etc/hosts など) からのデータを展開するための一連のスクリプトが含まれます。スクリプトを使ってデータを変換し、LDAP データベースに投入します。
パッケージをインストールしたら、必ず /etc/migrationtools/migrate_common.ph を編集してください; IGNORE_UID_BELOWIGNORE_GID_BELOW オプションを編集して (コメント解除するだけで十分です)、DEFAULT_MAIL_DOMAIN/DEFAULT_BASE を更新する必要があります。
実際の移行操作は migrate_all_online.sh コマンドを使って行います、以下の通りです:
# cd /usr/share/migrationtools
# LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
migrate_all_online.sh から LDAP データベースに移行するデータの種類に関する数個の質問を尋ねられます。表 11.1には Falcot の使用例で使った回答がまとめられています。

表11.1 migrate_all_online.sh スクリプトからの質問に対する回答

質問回答
X.500 命名コンテキストdc=falcot,dc=com
LDAP サーバホスト名localhost
管理者識別名cn=admin,dc=falcot,dc=com
認証情報の紐付け管理用パスワード
DUAConfigProfile を作成no
我々は意図的に /etc/aliases ファイルの移行を行いませんでした。なぜなら、Debian の提供する標準的なスキーマには、このスクリプトが電子メールアドレスを表現するために使う構造が含まれないからです。このデータをディレクトリに統合したい場合、標準的なスキーマに /etc/ldap/schema/misc.schema ファイルを追加するべきです。
ldapadd コマンドの -c オプションの利用について触れておきます; このオプションはエラーが起きた場合に処理を停止しないように要求するものです。このオプションを使うことが必要です。なぜなら、/etc/services を変換する際に、無視しても問題無い数個のエラーが起きる事が多いからです。

11.7.3. LDAP を用いたアカウントの管理

これで LDAP データベースに幾つかの実用的な情報が含まれるようになりましたので、このデータを使うように設定します。この節では、様々なシステムディレクトリが LDAP データベースを使うように Linux システムを設定する方法に注目します。

11.7.3.1. NSS の設定

NSS システム (Name Service Switch、傍注GOING FURTHER NSS とシステムデータベース参照) はシステムディレクトリの情報を定義または取得するために設計されたモジュール式システムです。NSS 用のデータ源として LDAP を使うには、libnss-ldap パッケージをインストールする必要があります。インストール中に数個の質問が行われます; その回答が表 11.2にまとめられています。

表11.2 libnss-ldap パッケージの設定

質問回答
LDAP サーバの Uniform Resource Identifierldap://ldap.falcot.com
検索起点の識別名dc=falcot,dc=com
使用する LDAP バージョン3
LDAP データベースはログインを必要としますか?no
root 用の特別な LDAP 権限yes
所有者だけが設定ファイルを読み取り可能/書き込み可能な状態にするno
root 用 LDAP アカウントcn=admin,dc=falcot,dc=com
LDAP root アカウントパスワード管理用パスワード
そして、/etc/nsswitch.conf ファイルを変更し、最近インストールした ldap モジュールを使うように NSS を設定する必要があります。

例11.30 /etc/nsswitch.conf ファイル

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd: ldap compat
group: ldap compat
shadow: ldap compat

hosts: files dns ldap
networks: ldap files

protocols: ldap db files
services: ldap db files
ethers: ldap db files
rpc: ldap db files

netgroup: ldap files
通常 ldap モジュールは他のモジュールよりも前に書き込みます。こうすることで、先に使われるようになります。注目すべき除外例が hosts サービスです。なぜなら、LDAP サーバに接続するには (ldap.falcot.com の名前解決を行うためには) 先に DNS を調べる必要があるからですhosts サービスで最初 ldap モジュールを使うようにすると、LDAP サーバにホスト名を問い合わせる事になります; 名前解決を担当する LDAP サーバに接続するには LDAP サーバの名前解決が必要なので、無限ループすることになります。
主に LDAP サーバを信頼する場合 (そして files モジュールの使うローカルファイルを軽視する場合)、以下の構文を使ってサービスを設定します:
service: ldap [NOTFOUND=return] files.
要求されたエントリが LDAP データベースに存在しない場合、問い合わせに対する応答は「not existing」になるでしょう。これはリソースがローカルファイルに存在するか否かに依存しません; LDAP サービスが利用可能でない場合のみ、ローカルファイルが使われます。

11.7.3.2. PAM の設定

この節では、PAM 設定 (傍注BEHIND THE SCENES /etc/environment/etc/default/locale参照) を説明します。ここで説明した PAM 設定で、アプリケーションが LDAP データベースに向けて要求された認証を実行することを可能にします。
PAM 用の LDAP モジュールは libpam-ldap パッケージによって提供されます。libpam-ldap パッケージをインストールする際に、libnss-ldap をインストールしたにされた質問と良く似た数個の質問を尋ねられます。幾つかの設定パラメータ (LDAP サーバの URI など) は libnss-ldap パッケージと共有されます。この回答は表 11.3にまとめられています。

表11.3 libpam-ldap の設定

質問回答
LDAP 管理者がローカルの root の如く振る舞うことを許可しますか?はい。こうすることで、通常の passwd コマンドから LDAP データベースに保存されているパスワードを変更する事が可能になります。
LDAP データベースはログインを要求しますか?no
root 用 LDAP アカウントcn=admin,dc=falcot,dc=com
LDAP root アカウントパスワードLDAP データベース管理用パスワード
パスワードに対して用いるローカル暗号化アルゴリズムcrypt
libpam-ldap をインストールと自動的に /etc/pam.d/common-auth/etc/pam.d/common-password/etc/pam.d/common-account ファイルで定義されたデフォルトの PAM 設定が適用されます。このメカニズムは専用の pam-auth-update ツール (libpam-runtime パッケージから提供される) を使います。pam-auth-update ツールは PAM モジュールを有効化または無効化したい管理者によって実行される場合もあります。

11.7.3.3. 安全な LDAP データ交換

デフォルトで、LDAP プロトコルはネットワークを平文で通信します; (暗号化された) パスワードがネットワーク上をそのまま流れます。暗号化されたパスワードをネットワークから抽出する事が可能です。パスワードは辞書型攻撃に弱いです。暗号化層を設けることで、このような危険性避ける事が可能です; この節の主題は、暗号化層を有効化することです。
11.7.3.3.1. サーバの設定
最初に LDAP サーバ用の (公開鍵と秘密鍵から成る) 鍵ペアを作成します。Falcot 管理者は鍵ペアを生成するために easy-rsa を再利用します (「公開鍵基盤: easy-rsa参照)。./build-server-key ldap.falcot.com を実行すると、数個の一般的な (場所、組織名、などに関する) 質問を尋ねられます。「common name」に対する回答は必ず LDAP サーバの完全修飾ホスト名にしてください; 我々の場合 ldap.falcot.com です。
上のコマンドは証明書を作成し、keys/ldap.falcot.com.crt ファイルに保存します; 対応する秘密鍵は keys/ldap.falcot.com.key に保存されます。
これらの鍵を標準的な場所にインストールし、openldap ユーザ権限で実行されている LDAP サーバが秘密鍵を読み込み可能であることを保証しなければいけません:
# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv keys/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root:ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# mv newcert.pem /etc/ssl/certs/ldap.falcot.com.pem
slapd デーモンにこれらの鍵を暗号化に使うように伝えることも必要です。LDAP サーバ設定は動的に管理されます: 設定は cn=config オブジェクト階層に対する通常の LDAP 操作によって更新され、サーバは設定を永続的なものにするために /etc/ldap/slapd.d をリアルタイムで更新します。このため、ldapmodify が設定を更新する適切なツールです:

例11.31 暗号化用の slapd の設定

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
暗号化を有効化するための最後の作業が /etc/default/slapd ファイル内の SLAPD_SERVICES 変数を変更することです。我々は大事を取って、安全対策されていない LDAP を無効化します。

例11.32 /etc/default/slapd ファイル

# Default location of the slapd.conf file or slapd.d cn=config directory. If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# System account to run the slapd server under. If empty the server
# will run as root.
SLAPD_USER="openldap"

# System group to run the slapd server under. If empty the server will
# run in the primary group of its user.
SLAPD_GROUP="openldap"

# Path to the pid file of the slapd server. If not set the init.d script
# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.conf by
# default)
SLAPD_PIDFILE=

# slapd normally serves ldap only on all TCP-ports 389. slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# If SLAPD_NO_START is set, the init script will not start or restart
# slapd (but stop will still work).  Uncomment this if you are
# starting slapd via some other means or if you don't want slapd normally
# started at boot.
#SLAPD_NO_START=1

# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
# the init script will not start or restart slapd (but stop will still
# work).  Use this for temporarily disabling startup of slapd (when doing
# maintenance, for example, or through a configuration management system)
# when you don't want to edit a configuration file.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# For Kerberos authentication (via SASL), slapd by default uses the system
# keytab file (/etc/krb5.keytab).  To use a different keytab file,
# uncomment this line and change the path.
#export KRB5_KTNAME=/etc/krb5.keytab

# Additional options to pass to slapd
SLAPD_OPTIONS=""
11.7.3.3.2. クライアントの設定
クライアント側で、libpam-ldaplibnss-ldap モジュールの設定を修正し、ldaps:// URI を使うようにする作業が必要です。
LDAP クライアントにサーバを認証させる必要があります。X.509 公開鍵基盤において、公開証明書は認証局 (CA) の鍵で署名されます。easy-rsa を使うことで、Falcot 管理者は自分自身の CA を作成しました。さらに管理者は Falcot の CA の署名を信頼するようにシステムを設定する必要があります。これを行うには、CA 証明書を /usr/local/share/ca-certificates に配置して、update-ca-certificates を実行します。
# cp keys/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
Adding debian:falcot.pem
done.
done.
最後に大事なことですが、様々なコマンドラインツールで使われるデフォルトの LDAP URI とデフォルトの DN は /etc/ldap/ldap.conf を編集すれば変更することが可能です。こうすることで、タイプする量を激減させることが可能です。

例11.33 /etc/ldap/ldap.conf ファイル

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

BASE   dc=falcot,dc=com
URI    ldaps://ldap.falcot.com

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt
この章では、利用可能なサーバソフトウェアの内のほんの僅かなソフトウェアだけに注目しました; しかしながら、ほとんどの一般的なネットワークサービスについて言及しました。今や、より技術的な章に入る準備が整ったと言えます: 一部の概念に関してより詳細を解説し、大規模な配備と仮想化について説明します。