OpenLDAP

提供: ArchWiki
2023年4月18日 (火) 13:38時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (カテゴリを修正)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

OpenLDAP は LDAP プロトコルのオープンソースの実装です。LDAP サーバーは基本的に、データの書き込みではなくアクセスに最適化されたリレーショナルでないデータベースです。主として (メールクライアントなどの) アドレス帳や様々なサービス (ドメインコントローラをエミュレートするのに使われる Samba や、/etc/passwd を置き換える Linux システム認証など) の認証バックエンドとして使われ、ユーザーデータを保持します。

ノート: ldap で始まる OpenLDAP のコマンド (ldapsearch など) はクライアント側のユーティリティであり、slap で始まるコマンド (slapcat など) はサーバー側のユーティリティです。

このページではその入り口として基本的な OpenLDAP をインストールしてサニティチェックを行います。

ヒント: ディレクトリサービスは範囲がとても広いテーマであり、設定は複雑です。初めてディレクトリサービスに接する場合は、ここ を読めば簡単に理解でき、LDAP の全てを知らなかったとしても始めることができると思います。

インストール

OpenLDAP には LDAP サーバーとクライアントの両方が含まれています。公式リポジトリopenldap パッケージでインストールしてください。

設定

サーバー

ノート: 既にマシン上に OpenLDAP データベースが存在する場合は、/var/lib/openldap/openldap-data/ 内の全てのファイルを削除してください。

サーバーの設定ファイルは /etc/openldap/slapd.conf です。

suffix と rootdn を編集してください。suffix は基本的にドメイン名を使いますが、そうである必要はありません。ディレクトリは使い様です。ここではドメイン名には example を、tld には com を使うこととします。rootdn は LDAP の管理者の名前です (ここでは root を使います)。

suffix     "dc=example,dc=com"
rootdn     "cn=root,dc=example,dc=com"

そしてデフォルトの root パスワードを削除して強固なパスワードを作成します:

# sed -i "/rootpw/ d" /etc/openldap/slapd.conf #find the line with rootpw and delete it
# echo "rootpw    $(slappasswd)" >> /etc/openldap/slapd.conf  #add a line which includes the hashed password output from slappasswd

よく使われる schemaslapd.conf の一番上に追加すると良いでしょう:

# cp /usr/share/doc/samba/examples/LDAP/samba.schema /etc/openldap/schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
#include        /etc/openldap/schema/samba.schema

よく使われる indexslapd.conf の一番下に追加すると良いでしょう:

index   uid             pres,eq
index   mail            pres,sub,eq
index   cn              pres,sub,eq
index   sn              pres,sub,eq
index   dc              eq

LDAP サーバーを使って認証したい場合、LDAP 認証#LDAP サーバーのセットアップに書かれているようにアクセス制御の設定をしてください。

データベースディレクトリを準備します。デフォルトの設定ファイルの名前を変更してください:

# cp /var/lib/openldap/openldap-data/DB_CONFIG.example /var/lib/openldap/openldap-data/DB_CONFIG
ノート: OpenLDAP 2.4 から slapd.conf の設定は非推奨になりました。このバージョンから全ての設定は /etc/openldap/slapd.d/ に保存されることになっています。

slapd.conf の変更を新しい /etc/openldap/slapd.d/ の設定に保存するには、まず古い設定ファイルを削除する必要があります。設定を変更するたびに実行してください:

# rm -rf /etc/openldap/slapd.d/*

(データベースがまだない場合は、systemd を使って slapd.service を起動・停止することでデータベースを作成してください。)

次のコマンドで新しい設定を生成します:

# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/

上のコマンドは slapd.conf を変更する度に実行する必要があります。全てが問題ないか確認してください。"bdb_monitor_db_open: monitoring disabled; configure monitor database to enable" というメッセージは無視してください。

/etc/openldap/slapd.d の新しいファイルとディレクトリの所有権を再帰的に変更:

# chown -R ldap:ldap /etc/openldap/slapd.d
ノート:
  • Berkeley DB (BDB) は使用するべきではありません。通常の slapd データベースのバックエンドとしては slapd(8) の mdb バックエンドが推奨されます。OpenLDAP の Lightning Memory-Mapped Database (LMDB) ライブラリを使用してデータを保存し、Berkeley DB バックエンドを置き換えます。OpenLDAP の公式パッケージはデフォルトで mdb を使用します。
  • ディレクトリを作成した後はインデックスを作成してください。インデックスは作成する前に slapd を停止する必要があります。
# slapindex
# chown ldap:ldap /var/lib/openldap/openldap-data/*

もしくは $ sudo -u ldap slapindex を実行。

最後に、systemd を使って slapd.service で slapd デーモンを起動してください。

クライアント

クライアントの設定ファイルは /etc/openldap/ldap.conf です。

設定はとてもシンプルです: BASE をサーバーの suffix に、URI をサーバーのアドレスに変更するだけです、例:

/etc/openldap/ldap.conf
BASE            dc=example,dc=com
URI             ldap://localhost

SSL を使う場合は:

  • URI エントリのプロトコル (ldap または ldaps) は slapd の設定と一致しなくてはなりません。
  • 自己署名証明書を使う場合は、ldap.confTLS_REQCERT allow という行を追加してください。
  • 認証局により署名された証明書を使う場合、ldap.confTLS_CACERTDIR /usr/share/ca-certificates/trust-source という行を追加してください。

最初のエントリを作成

クライアントを設定したら、root の役割をするエントリである root エントリを作成することを推奨します:

$ ldapadd -x -D 'cn=root,dc=example,dc=com' -W
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example
description: Example directory

dn: cn=root,dc=example,dc=com
objectClass: organizationalRole
cn: root
description: Directory Manager
^D

最初の行の後のテキストは標準入力で入力していますが、-f オプションやファイルリダイレクトを使うことでファイルから読み込むこともできます。

OpenLDAP をテストする

下のコマンドを実行するだけで、簡単にテストできます:

$ ldapsearch -x '(objectclass=*)'

もしくは、上記の設定例を使って、rootdn で認証するには (-x-D <user> -W で置き換える):

$ ldapsearch -D "cn=root,dc=example,dc=com" -W '(objectclass=*)'

データベースに関する情報が表示されるはずです。

OpenLDAP over TLS

ノート: 上流のドキュメント の方がこのセクションよりも情報が豊富です。

ネットワークを介して OpenLDAP サーバーにアクセスする場合、特にサーバー上に極秘のデータを保存するときは、クリアテキストで送られたデータを盗聴される恐れがあります。次のパートでは LDAP サーバーとクライアントの間に SSL 接続をセットアップしてデータを暗号化して送信する方法を説明します。

TLS を使うには、証明書が必要になります。テスト目的なら、自己署名証明書で足りるでしょう。証明書について詳しく知るには、OpenSSL を見て下さい。

警告: OpenLDAP はパスワードが関連付けられた証明書を使うことができません。

自己署名証明書の作成

自己署名証明書を作成するには、次を入力:

$ openssl req -new -x509 -nodes -out slapdcert.pem -keyout slapdkey.pem -days 365

LDAP サーバーに関する情報の入力が求められます。ほとんどの情報は空のままでも大丈夫です。一番重要な情報はコモンネームです。コモンネームは LDAP サーバーの DNS 名に設定してください。LDAP サーバーの IP アドレスが example.org で解決できてもサーバーの証明書の CN が bad.example.org の場合、LDAP クライアントは証明書を拒否してしまうため TLS 接続をネゴシエートできなくなります (全く予期できない結果になります)。

それから、作成された証明書ファイルを /etc/openldap/ssl/ (ディレクトリが存在しない場合は作成してください) にコピーしてパーミッションを設定します。slapdcert.pem は公開鍵なので誰からでも読み込めるようにしてください。逆に slapdkey.pem は ldap ユーザーだけが読み込めるようにしてください:

# mv slapdcert.pem slapdkey.pem /etc/openldap/ssl/
# chmod -R 755 /etc/openldap/ssl/
# chmod 400 /etc/openldap/ssl/slapdkey.pem
# chmod 444 /etc/openldap/ssl/slapdcert.pem
# chown ldap /etc/openldap/ssl/slapdkey.pem

SSL を使うように slapd を設定

デーモンの設定ファイル (/etc/openldap/slapd.conf) を編集して以下の行を追加することで LDAP に証明書ファイルの場所を指定してください:

# Certificate/SSL Section
TLSCipherSuite DEFAULT
TLSCertificateFile /etc/openldap/ssl/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/ssl/slapdkey.pem
ノート: 最新版の OpenLDAP (2.4.45) は GnuTLS ではなく OpenSSL を使用します。そのため最新版の OpenLDAP は DEFAULT TLSCipherSuite を処理することができます。ldd /usr/bin/slapd を実行することで確認できます。

Let’s Encrypt のような認証局により署名された SSL 証明書を用いる場合、ルート証明書データベースと中間証明書のパスを指定する必要があります。また、ユーザー ldap が読み込めるように .pem ファイルと途中のディレクトリの所有者情報を変更する必要もあるでしょう:

# Certificate/SSL Section
TLSCipherSuite DEFAULT
TLSCertificateFile /etc/letsencrypt/live/ldap.my-domain.com/cert.pem
TLSCertificateKeyFile /etc/letsencrypt/live/ldap.my-domain.com/privkey.pem
TLSCACertificateFile /etc/letsencrypt/live/ldap.my-domain.com/chain.pem
TLSCACertificatePath /usr/share/ca-certificates/trust-source

TLSCipherSuite は slapd が TLS 接続をネゴシエートするときに使用する OpenSSL の暗号方式のリストを指定します。優先度が高い順です。特定の暗号を指定するかわりに、OpenSSL によってサポートされているワイルドカードを使うことができます。

ノート:
  • DEFAULT はワイルドカードです。サポートされている暗号方式やワイルドカード、オプションについては ciphers(1ssl) の説明を読んでください。
  • ローカルの OpenSSL によってサポートされている暗号を確認するには、次を実行: openssl ciphers -v ALL:COMPLEMENTOFALL。OpenSSL コマンドを使えば実際に TLSCipherSuite によって有効になる暗号は何なのかテストできます: openssl ciphers -v 'DEFAULT'

設定ディレクトリを再生成:

# rm -rf /etc/openldap/slapd.d/*                                  # erase old config settings
# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/  # generate new config directory from config file
# chown -R ldap:ldap /etc/openldap/slapd.d                        # Change ownership recursively to ldap on the config directory

SSL で slapd を起動

slapd.service を編集して slapd が使用するプロトコルを変更してください。

上書きユニットを作成:

systemctl edit slapd.service
[Service]
ExecStart=
ExecStart=/usr/bin/slapd -u ldap -g ldap -h "ldaps:///"

ローカルホスト接続は SSL を使う必要がありません。ローカルのサーバーにアクセスしたいときは ExecStart 行を以下のように変更してください:

ExecStart=/usr/bin/slapd -u ldap -g ldap -h "ldap://127.0.0.1 ldaps:///"

そして slapd.service再起動してください。サービスを有効にしていた場合は、再有効化もしてください。

ノート: 上で書かれているように自己署名証明書を作成した場合は、TLS_REQCERT allow をクライアント側の /etc/openldap/ldap.conf に追加しないとサーバーに接続することができなくなります。

次のステップ

これで基本的な LDAP のインストールは完了です。次はディレクトリを自分で設計してください。LDAP を何のために使うのかによって大きく変わってきます。LDAP を初めて使う場合は、まずはディレクトリを使用するクライアントサービス (PAMPostfix など) によって推奨されている設定から始めると良いでしょう。

システム認証の方法は LDAP 認証の記事に書かれています。

LDAP のフロントエンドとして phpLDAPadmin も存在します。

ヒントとテクニック

LDAP のバックアップ

LDAP データベースと設定をバックアップすることで後で何かあったときに復元することができます。

設定のエクスポート

$ slapcat -F /etc/openldap/slapd.d -n 0 -l "$(hostname)-ldap-mdb-config-$(date '+%F').ldif"

データベースのエクスポート

$ slapcat -l "$(hostname)-ldap-database-$(date '+%F').ldif"

トラブルシューティング

slapd 設定のチェック

以下のコマンドで設定をチェックできます:

$ slaptest -f /etc/openldap/slapd.conf -v

クライアント認証のチェック

セキュアでない認証でサーバーに接続できない場合:

$ ldapsearch -x -H ldap://ldaservername:389 -D cn=Manager,dc=example,dc=exampledomain

TLS によって暗号化された認証で接続をする場合:

$ ldapsearch -x -H ldaps://ldaservername:636 -D cn=Manager,dc=example,dc=exampledomain

LDAP サーバーが突然停止する

slapd を起動しても停止してしまう場合、以下を実行して "ldap" ユーザーからデータディレクトリに書き込むことができるようにしてみてください:

# chown -R ldap:ldap /var/lib/openldap

LDAP サーバーを起動できない

コマンドラインからデバッグ出力を有効にしてLDAPサーバーを起動してみてください:

# slapd -u ldap -g ldap -h ldaps://ldaservername:636 -d Config,Stats

参照