【OpenLDAP基本講座 第3回】cn=configの正体。slapd.conf世代からの脱却と動的設定の極意

「設定ファイルがない!?」と叫んだことはありませんか?

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、Symas OpenLDAPのインストールと、初期データベースの構築を行いました。
ここまでは順調だったはずです。

しかし、ここから少し踏み込んだ設定をしようとして、/etc/openldap/slapd.conf を探したとき、多くのエンジニアが絶望します。
「ファイルがない……あるのはディレクトリだけ……」
これが、OpenLDAP 2.3以降で導入され、2.4以降で標準となった cn=config (OLC: On-Line Configuration) システムです。

コウ君

先生、これ一番嫌いです!
/etc/openldap/slapd.d/ の中を見たら、変な数字がついたファイルがいっぱいあるし、中身を見たら「このファイルは編集するな」って書いてあるし。
設定を1行変えるだけなのに、なんでこんなに面倒なことになったんですか?
vim で編集して再起動じゃダメなんですか?

リナックス先生

コウ君、その怒りはごもっとも。
でも、この仕組みにはちゃんと理由があるの。
最大のメリットは「無停止で設定変更ができること」よ。
LDAPサーバーは止まると全システムに影響が出るでしょ? だから、再起動せずに新しい設定やスキーマを反映できる仕組みが必要だったの。
今回はウィンドウズ先生に、この複雑怪奇に見える cn=config の構造を解き明かしてもらいましょう。

ウィンドウズ先生

はい、ウィンドウズ先生です。
Windowsのレジストリも似たようなものですね。テキストファイルではありませんが、構造化されたデータベースとして設定を持っています。
OpenLDAPの cn=config は、「設定情報そのものをLDAPツリーとして管理する」という発想です。
つまり、ユーザーデータを検索・更新するのと同じコマンド(ldapsearch, ldapmodify)で、サーバーの設定も操作できるのです。
慣れてしまえば、これほど理にかなったシステムはありませんよ。

本記事では、cn=config のディレクトリ構造の解説から、LDIFを使った正しい設定変更手順、スキーマの追加方法、そして設定ミスで起動しなくなった時のリカバリ方法までを徹底解説します。

🐬 OpenLDAP 基本講座 カリキュラム


第1章:slapd.conf vs cn=config。パラダイムシフトを理解する

まずは、旧来の方式と現在の方式を比較して、頭を切り替えましょう。

旧方式:slapd.conf (静的設定)

  • 形式: 1つのテキストファイル (/etc/openldap/slapd.conf)。
  • 変更方法: エディタで編集し、service slapd restart で再起動。
  • 欠点: 再起動するまで設定が反映されない。構文エラーがあると起動しない。

新方式:cn=config (動的設定 / OLC)

  • 形式: /etc/openldap/slapd.d/ 配下のディレクトリツリー。実体はLDIFファイル群。
  • 変更方法: ldapmodify コマンドを使って、設定変更リクエストを投げる。
  • 利点: 再起動不要(即時反映)。 コマンド実行時に構文チェックが行われるため、設定ミスでサーバーが落ちるリスクが低い。
  • 注意点: ファイルを直接編集してはいけない(CRCチェックサムが含まれているため)。

💡 プロの豆知識:slapd.conf はまだ使える?
実は、現在のOpenLDAPでも slapd.conf での起動はサポートされています(非推奨ですが)。
しかし、RHELなどのディストリビューション標準の起動スクリプトは cn=config を前提に作られているため、無理に使うと運用が面倒になります。
素直に cn=config に慣れるのが賢明です。


第2章:cn=configツリーの歩き方。どこに何がある?

設定情報は、特別なLDAPツリー(DIT)として管理されています。
このツリーを見るには、以下のコマンドを使います。

# -n 0 は設定用データベースを指す
slapcat -n 0

出力される内容は膨大ですが、構造は以下のようになっています。

主要なエントリ

  1. cn=config
    ルートエントリ。グローバル設定(ログレベル、TLS設定など)が含まれます。
  2. cn=schema,cn=config
    スキーマ定義(属性やオブジェクトクラスの定義)が格納されています。
  3. cn=module{0},cn=config
    動的モジュール(ライブラリ)のロード設定です。
  4. olcDatabase={0}config,cn=config
    設定データベース自体の設定です(管理者パスワードなど)。
  5. olcDatabase={1}monitor,cn=config
    監視用データベースの設定です。
  6. olcDatabase={2}mdb,cn=config
    最重要。 ユーザーデータを格納するメインのバックエンドDB(MDB)の設定です。
    サフィックス(dc=...)、データディレクトリパス、インデックス設定、ACL(アクセス制御)はここにあります。

※番号 {0}, {1}, {2} は環境によって異なる場合があります。


第3章:実践!LDIFによる動的設定変更 (ldapmodify)

では、実際に設定を変更してみましょう。
基本のフローは以下の通りです。

  1. 変更内容を記述した .ldif ファイルを作成する。
  2. ldapmodify コマンドで適用する。

例1:ログレベルの変更

デフォルトではログが少ないため、詳細な統計情報(stats)が出るようにします。

1. LDIFファイルの作成 (log_stats.ldif)

dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats

解説:
dn: cn=config は変更対象のエントリ(グローバル設定)を指定。
changetype: modify は修正モード。
replace: olcLogLevel は属性の値を置換することを意味します。

2. 適用コマンド

ldapmodify -Y EXTERNAL -H ldapi:/// -f log_stats.ldif

解説:
-Y EXTERNAL -H ldapi:/// は、OSのroot権限(UNIXソケット)を使って、パスワードなしで設定変更を行うための定型句です。
成功すると modifying entry "cn=config" と表示され、即座にログ出力が変わります。再起動は不要です。

例2:最大接続数の変更

同時接続数の上限(TimeWait対策など)を変更します。

1. LDIFファイルの作成 (limit.ldif)

dn: cn=config
changetype: modify
replace: olcThreads
olcThreads: 16
-
replace: olcToolThreads
olcToolThreads: 4

解説:
ハイフン - は、同じエントリに対して複数の変更を行う場合の区切り文字です。
これを忘れるとエラーになります。

💡 プロのノウハウ:現在の設定確認
「今の設定はどうなってるんだっけ?」と思ったら、ldapsearch を使いましょう。
ldapsearch -Y EXTERNAL -H ldapi:/// -b "cn=config" "(olcLogLevel=*)"
これで現在のログレベル設定だけを抽出できます。


第4章:スキーマの追加。includeディレクティブはもう使わない

slapd.conf 時代は、include /etc/openldap/schema/nis.schema と一行書けば終わりでした。
cn=config では、スキーマもLDIF形式でDBに登録する必要があります。

標準スキーマの追加手順

OpenLDAPのパッケージには、あらかじめLDIF形式に変換されたスキーマファイルが同梱されています。
場所は /etc/openldap/schema/ (または /opt/symas/etc/openldap/schema/) です。

ユーザー管理に必要な基本スキーマ(Cosine, NIS, InetOrgPerson)を追加します。

PR

# パスは環境に合わせて調整してください
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

core.ldif は最初から入っているので追加不要です。

古い .schema ファイルしかない場合

ネット上の古いライブラリなどで、.schema 形式のファイルしか手に入らない場合があります。
これを cn=config に入れるには、一度LDIF形式に変換する必要があります。

変換手順(上級者向け):

  1. 一時的な dummy.conf を作り、そこに include my.schema を書く。
  2. slaptest -f dummy.conf -F /tmp/output_dir を実行する。
  3. 出力されたディレクトリ内の cn=config/cn=schema/cn={0}my.ldif を取り出す。
  4. 取り出したファイルの末尾にある構造情報(structuralObjectClass など)を削除し、dncn を整える。
  5. ldapadd で投入する。

かなり面倒ですが、これが「正しい」手順です。


第5章:モジュールのロードとOverlayの設定

OpenLDAPは機能をモジュール(プラグイン)として追加できます。
代表的なのが、レプリケーション用の syncprov や、グループ所属を管理する memberof です。

モジュールのロード

syncprov.la モジュールをロードする設定です。

# module_load.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov

これを適用すると、メモリ上にモジュールがロードされ、Overlay機能が使えるようになります。

Overlayの設定

モジュールをロードしたら、それを特定のデータベース(MDB)に適用(Overlay)します。

# overlay_syncprov.ldif
dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100

このLDIFでは「新しいエントリを作成(changetype: add)」している点に注目してください。
設定ツリーの中に、新しい枝(Overlay設定)を生やすイメージです。


第6章:トラブルシューティング。直接編集してしまったら?

「うっかり /etc/openldap/slapd.d/cn=config/olcDatabase={2}mdb.ldifvi で編集して保存してしまった!」
すると、次回の起動時や ldapmodify 実行時に以下のようなエラーが出ます。

checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}mdb.ldif"

OpenLDAPは、ファイルの先頭にあるチェックサム(CRC32)と中身が一致しない場合、改竄されたとみなして読み込みを拒否します。

リカバリ手順1:正規の手順で直す(推奨)

もしサービスがまだ起動しているなら、ldapmodify を使って、間違った値を正しい値に修正するLDIFを流せば、チェックサムは自動的に再計算されて保存されます。

リカバリ手順2:チェックサムを無視させる(緊急時)

サービスが起動しない場合は、手動でファイルを修正するしかありません。
しかし、手計算でCRC32を合わせるのは不可能です。
解決策: ファイルの先頭2行(チェックサムの行)を削除して保存します。

# これを消す
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 d41d8cd9

チェックサム行がない場合、OpenLDAPは「古いバージョンからの移行ファイルかな?」と判断して、警告を出しつつも読み込んでくれます。
そして、次回正しく更新されたタイミングで、正しいチェックサムを付与してくれます。

💡 プロの助言:バックアップの重要性
cn=config をいじる前は、必ず設定全体のバックアップを取りましょう。
slapcat -n 0 -l config_backup.ldif
これさえあれば、最悪の場合ディレクトリごと削除して、slapadd -n 0 -F /etc/openldap/slapd.d -l config_backup.ldif で復元できます。


まとめ:設定も「データ」として扱う

お疲れ様でした!
第3回は、OpenLDAP最大の難所である cn=config について解説しました。

今回の重要ポイント:

  • cn=config はディレクトリツリーであり、ファイル編集ではなくLDIFで操作する。
  • ldapmodify -Y EXTERNAL は、root権限で設定変更する時の魔法の呪文。
  • スキーマやモジュールも、すべてLDIFとして動的に追加できる。
  • 直接編集してしまったら、チェックサム行を消して逃げる。
ウィンドウズ先生

最初は面倒に感じるかもしれませんが、これをマスターすれば、あなたはサーバーを止めることなく、どんな設定変更も自在に行えるようになります。
これぞ「24時間365日稼働」を支えるプロの技術です。

さて、設定の仕方は分かりました。
次回はいよいよ、この箱の中に「ユーザー」や「グループ」といった実際のデータを入れていきます。

次回、第4回は「データ管理の作法。LDIFファイルとldapコマンド群」です。
ユーザー作成、パスワード変更、属性の追加・削除など、日々の運用で使うコマンド操作を徹底的に練習します。お楽しみに!

▼ cn=configを体感する ▼

設定変更を安全に試す
「おすすめVPS」

おすすめVPSを見る

ミドルウェアのプロへ
「ITエンジニア転職」

転職エージェントを見る

コメント