Product SiteDocumentation Site

11.7. LDAP ディレクトリ

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

11.7.1. インストール

OpenLDAP サーバは slapd パッケージに含まれます。LDAP サーバと情報をやり取りするためのコマンドラインツールは ldap-utils パッケージに含まれます。
通常 slapd のインストール時に質問される事項の数は少ないので、作られたデータベースは要求を満足するものにはならないでしょう。幸いなことに dpkg-reconfigure slapd を使えば簡単に LDAP データベースをより詳細に再設定することが可能です。
  • OpenLDAP サーバの設定を省略しますか? LDAP サービスを設定するので当然「いいえ」を選びます。
  • DNS ドメイン名。「falcot.com」と入力します。
  • 組織名。「Falcot Corp」と入力します。
  • 管理者のパスワードを入力します。
  • 利用するデータベースバックエンド。「MDB」を選びます。
  • slapd をパージした時にデータベースを削除しますか? 間違ってデータベースを失う危険性を増やすのは得策ではありませんから「いいえ」を選びます。
  • 古いデータベースを移動しますか? この質問はデータベースが既に存在するにも関わらず設定を行おうとした場合に表示されます。たとえば最初のインストールの直後に dpkg-reconfigure slapd を実行する場合など、空っぽのデータベースから設定を再開したい場合、「はい」を選びます。
  • LDAPv2 プロトコルを許可しますか? 許可する意味がないので「いいえ」を選びます。本書で使うツールはすべて LDAPv3 プロトコルを理解します。
以下の問い合わせによって実例を示す通り、最低限のデータベースが設定されています。
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope subtree
# 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 データベースに投入します。
migrationtools パッケージをインストールしたら、必ず /etc/migrationtools/migrate_common.ph を編集してください。つまり、IGNORE_UID_BELOWIGNORE_GID_BELOW オプションを編集して (コメント解除するだけで十分です)、DEFAULT_MAIL_DOMAINDEFAULT_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
認証情報の紐付けLDAP データベース管理用パスワード
DUAConfigProfile を作成no
上の例では ETC_ALIASES=/dev/null を指定することで意図的に /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 パッケージをインストールする必要があります。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 権限はい
オーナのみ設定ファイルの読み書きができるようにしますかno
LDAP 管理用アカウントcn=admin,dc=falcot,dc=com
LDAP 管理用パスワードLDAP データベース管理用パスワード
そして、/etc/nsswitch.conf ファイルを変更し、最近インストールした ldap モジュールを使うように NSS を設定する必要があります。

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

# /etc/nsswitch.conf
#
# 以下は GNU Name Service Switch 機能の設定例です。
# `glibc-doc' と `info' パッケージをインストール済みならば、
# `info libc "Name Service Switch"' で詳細情報を参照できます。

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 モジュールは他のモジュールよりも前に書き込みます。こうすることで、問い合わせの際に ldap モジュールが優先して使われます。注目すべき除外例が hosts サービスです。なぜなら、LDAP サーバに接続するには (ldap.falcot.com の名前解決を行うためには) 先に DNS を調べる必要があるからです。hosts サービスで最初 ldap モジュールを使うようにすると、LDAP サーバにホスト名を問い合わせることになります。しかし、名前解決を担当している LDAP サーバに接続するには LDAP サーバの名前解決が必要なので、無限ループすることになります。
LDAP サーバからの応答を正式な回答として取り扱う場合 (そして特殊な状況が起きない限り files モジュールの使うローカルファイルからの応答を無視する場合)、以下の構文を使ってサービスを設定します。
service: ldap [NOTFOUND=return] files.
LDAP サービスを利用して問い合わせたエントリが 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
LDAP 管理用アカウントcn=admin,dc=falcot,dc=com
LDAP 管理用パスワード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 を再利用します (第 10.2.1.1 節「公開鍵基盤、easy-rsaを参照してください)。./build-key-server ldap.falcot.com を実行すると、数個の一般的な (場所、組織名などに関する) 質問を尋ねられます。「Common Name」に対する回答は必ず LDAP サーバの完全修飾ホスト名にしてください。今回の場合 ldap.falcot.com にしてください。
./build-key-server ldap.falcot.com は証明書を作成し、keys/ldap.falcot.com.crt ファイルに保存します。さらに対応する秘密鍵は keys/ldap.falcot.com.key に保存されます。
さらに、これらの鍵を標準的な場所にインストールし、openldap ユーザ権限で実行されている LDAP サーバが秘密鍵を読み込み可能であることを保証しなければいけません。これを行うために以下の通り実行します。
# adduser openldap ssl-cert
ユーザ `openldap' をグループ `ssl-cert' に追加しています...
ユーザ openldap をグループ ssl-cert に追加
完了。
# 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.27 暗号化用の 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.28 /etc/default/slapd ファイル

# slapd.conf ファイルまたは slapd.d cn=config ディレクトリの
# デフォルト位置を指定してください。空の場合、コンパイル時のデフォルト値
# (/etc/ldap/slapd.d およびその代替の /etc/ldap/slapd.conf) が使われます。
SLAPD_CONF=

# slapd サーバを実行するシステムアカウントを指定してください。
# 空の場合、root 権限で実行します。
SLAPD_USER="openldap"

# slapd サーバを実行するシステムグループを指定してください。
# 空の場合、SLAPD_USER のメイングループ権限で実行します。
SLAPD_GROUP="openldap"

# slapd サーバの pid ファイルのパスを指定してください。未指定の場合、
# init.d スクリプトは $SLAPD_CONF (デフォルト値は /etc/ldap/slapd.conf
# です) を評価してパスを指定しようとします。
SLAPD_PIDFILE=

# 通常 slapd は TCP ポート 389 番だけにサービスを提供します。
# さらに slapd は TCP ポート 636 番 (ldaps) および unix ソケット
# にもサービスを提供できます。
# 以下はその使用例です。
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# SLAPD_NO_START を設定した場合、init スクリプトは
# slapd を開始および再開しません (停止だけは実行されます)。
# 別の手段で slapd を実行している場合や、通常はマシンの起動時に
# slapd を開始したくない場合、以下の行を有効化してください。
#SLAPD_NO_START=1

# SLAPD_SENTINEL_FILE がファイルへのパスに設定され、設定されたファイル
# が存在する場合、init スクリプトは slapd を開始および再開しません
# (停止だけは実行されます)。設定ファイルを編集したくない場合
# (たとえば、メンテナンス中または設定管理システムの使用中などの場合)、
# ここで指定したファイルを使って一時的に slapd の開始を無効化します。
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# slapd は (SASL を介した) Kerberos 認証の際にデフォルトでシステムの
# keytab ファイル (/etc/krb5.keytab) を使います。別の keytab ファイルを
# 使うには、以下の行でそのファイルを指定し、以下の行を有効化してください。
#export KRB5_KTNAME=/etc/krb5.keytab

# 以下では 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 とデフォルトのベース識別名は /etc/ldap/ldap.conf を編集すれば変更することが可能です。こうすることで、入力する量を激減させることが可能です。

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

#
# LDAP のデフォルト設定
#

# 詳細は ldap.conf(5) を参照してください。全ユーザに対して
# このファイルの読み込みを許可し、書き込みを禁止してください。

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

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS 証明書 (これは GnuTLS を使う場合に必要です)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt