コンテンツにスキップ

ldapiとcn=config

ldapi:/// は Unix ドメインソケット経由のローカル LDAP 接続。 cn=config は slapd の設定を LDAP エントリとして扱う設定データベース。


OpenLDAP では、接続先を URI で指定する。

URI 意味
ldap://host TCP 389 の LDAP 接続。StartTLS で暗号化できる
ldaps://host TCP 636 の TLS 付き LDAP 接続
ldapi:/// Unix ドメインソケット経由のローカル接続

ldapi:/// はネットワーク越しではなく、同じ OS 上の Unix ドメインソケットを使って slapd に接続する。


Unix ドメインソケットは、同じホスト上のプロセス同士が通信するための仕組みである。

TCP のように IP アドレスとポートで通信するのではなく、ファイルシステム上のソケットを通じて通信する。

ldapmodify
-> ldapi:///
-> Unix domain socket
-> slapd

ローカル接続なので、OS は接続元プロセスの UID / GID などを slapd に伝えられる。これを SASL EXTERNAL と組み合わせることで、Linux root 相当の接続を LDAP の認証 ID として扱える。


ローカル管理でよく見るコマンドは次の形である。

Terminal window
sudo ldapmodify \
-Y EXTERNAL \
-H ldapi:///

意味は次のとおり。

部分 意味
sudo Linux root としてコマンドを実行する
-Y EXTERNAL SASL EXTERNAL 認証を使う
-H ldapi:/// ローカル Unix ドメインソケットで slapd に接続する

流れは次のようになる。

Linux root
-> ldapi:/// socket
-> slapd obtains peer credentials
-> SASL EXTERNAL identity
-> ACL check

cn=config は、 slapd の設定を LDAP エントリとして表した設定データベースである。

古い形式では slapd.conf という単一の設定ファイルを使っていたが、現在の OpenLDAP では cn=config による動的設定が一般的である。

cn=config には、たとえば次のような設定が含まれる。

  • 読み込むスキーマ
  • データベース定義
  • suffix
  • rootDN
  • ACL
  • index
  • overlay
  • TLS 設定

cn=config と dc=example,dc=com のような通常データベースは役割が違う。

データベース 役割
cn=config slapd 自身の設定
dc=example,dc=com ユーザー、グループ、組織などの通常データ

cn=config は設定データベースであり、ユーザーやグループを保存する場所ではない。


cn=config の実体は、ファイルシステム上では slapd.d ディレクトリ配下に保存される。

Debian 系では一般に次の場所である。

/etc/ldap/slapd.d/

ただし、 slapd.d を直接編集するべきではない。実行中の slapd の状態と不整合になったり、LDIF の内部形式を壊したりする可能性がある。

設定変更は ldapmodify で cn=config に対して行う。

Terminal window
sudo ldapmodify \
-Y EXTERNAL \
-H ldapi:/// \
-f change.ldif

rootDN は、LDAP データベースごとに設定できる特権 DN である。

たとえば、通常データベースに次のような rootDN がある。

olcRootDN: cn=admin,dc=example,dc=com

この rootDN は、そのデータベース内では ACL によらず強い権限を持つ管理者として扱われる。

ただし、 cn=admin,dc=example,dc=com が自動的に cn=config も管理できるとは限らない。通常データベースの rootDN と、設定データベースの管理権限は別に考える。


次の 3 つは別物である。

名前 所属 意味
Linux root OS UID 0 のローカル管理者
LDAP rootDN LDAP データベース その DB の特権 DN
SASL EXTERNAL identity SASL / LDAP 接続経路から得た認証 ID

ローカル root で ldapmodify -Y EXTERNAL -H ldapi:/// を実行すると、LDAP 側では SASL EXTERNAL identity として見える。その identity に何ができるかは ACL で決まる。