OpenLDAP
OpenLDAP は LDAP プロトコルのオープンソースの実装です。LDAP サーバーは基本的に、データの書き込みではなくアクセスに最適化されたリレーショナルでないデータベースです。主として (メールクライアントなどの) アドレス帳や様々なサービス (ドメインコントローラをエミュレートするのに使われる Samba や、/etc/passwd
を置き換える Linux システム認証など) の認証バックエンドとして使われ、ユーザーデータを保持します。
このページではその入り口として基本的な OpenLDAP をインストールしてサニティチェックを行います。
インストール
OpenLDAP には LDAP サーバーとクライアントの両方が含まれています。公式リポジトリの openldap パッケージでインストールしてください。
設定
サーバー
サーバーの設定ファイルは /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
よく使われる schema を slapd.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
よく使われる index を slapd.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
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
最後に、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.conf
にTLS_REQCERT allow
という行を追加してください。 - 認証局により署名された証明書を使う場合、
ldap.conf
にTLS_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 を見て下さい。
自己署名証明書の作成
自己署名証明書を作成するには、次を入力:
$ 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
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 によってサポートされているワイルドカードを使うことができます。
設定ディレクトリを再生成:
# 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
を再起動してください。サービスを有効にしていた場合は、再有効化もしてください。
次のステップ
これで基本的な LDAP のインストールは完了です。次はディレクトリを自分で設計してください。LDAP を何のために使うのかによって大きく変わってきます。LDAP を初めて使う場合は、まずはディレクトリを使用するクライアントサービス (PAM や Postfix など) によって推奨されている設定から始めると良いでしょう。
システム認証の方法は 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
参照
- Official OpenLDAP Software 2.4 Administrator's Guide
- phpLDAPadmin phpMyAdmin 風のウェブインターフェイスツール
- apachedirectorystudioAUR Eclipse ベースの LDAP ビューア (AUR)。OpenLDAP でも問題なく動作します