■OpenLDAPシステム管理(openldap2.3以上) ●設定データベース  OpenLDAPの設定はslapd.confに書き変更があれば  編集してプロセスを再起動するのが通常です。  しかし、これでは運用中に作業できないことになります。  動的に変更する方法がないのか?  ということでひとつ設定データベースというものを見ていきます。  これがあればオンラインで設定を変更できるようになります。 ●設定データベースの設定 # vi slapd.conf ---追記--- ###############FOR cn=config############# database config rootdn cn=config rootpw {SSHA}30O57dpx5YJK40ujn8+IZUsqNZSgXiUZ ---------- ※rootpwの部分は「# slappasswd -h {SSHA} -s scret」のようにして生成 プロセスを再起動しslapd.confを再読み込み # pkill slapd # ./slapd -f $configfile ●実施の設定データの検索 # ldapsearch -x -D cn=config -w secret -b cn=config ----実際の出力--- dn: cn=config objectClass: olcGlobal cn: config olcConfigFile: /usr/local/etc/openldap/slapd.conf olcAllows: bind_v2 olcArgsFile: /usr/local/var/run/slapd.args olcAttributeOptions: lang- olcAuthzPolicy: none olcConcurrency: 0 olcConnMaxPending: 100 olcConnMaxPendingAuth: 1000 olcGentleHUP: FALSE olcIdleTimeout: 0 olcIndexSubstrIfMaxLen: 4 olcIndexSubstrIfMinLen: 2 olcIndexSubstrAnyLen: 4 olcIndexSubstrAnyStep: 2 olcLocalSSF: 71 olcLogLevel: Stats olcPidFile: /usr/local/var/run/slapd.pid olcReadOnly: FALSE  ・  ・  ・ olcDbIndex: givenName pres,eq,sub olcDbIndex: memberUid pres,eq,sub olcDbIndex: loginShell pres,eq olcDbIndex: nisMapName pres,eq,sub olcDbIndex: nisMapEntry pres,eq,sub olcDbLinearIndex: FALSE olcDbMode: 384 olcDbSearchStack: 16 olcDbShmKey: 0 olcDbCacheFree: 1 # search result search: 2 result: 0 Success # numResponses: 14 # numEntries: 13 ------------------ 多すぎるのでdnだけでも抜き出してみましょう。 # ldapsearch -x -D cn=config -w secret -b cn=config dn|grep -v ^# ---- dn: cn=config dn: cn=include{0},cn=config dn: cn=include{1},cn=config dn: cn=include{2},cn=config dn: cn=include{3},cn=config dn: cn=schema,cn=config dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}inetorgperson,cn=schema,cn=config dn: cn={3}nis,cn=schema,cn=config dn: olcDatabase={-1}frontend,cn=config dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}bdb,cn=config ---- slapd.confとすべての出力は対応しています。 http://www.openldap.org/doc/admin23/slapdconf2.html に唯一多くの情報が正式に記載されています。 各設定についてはこちらを参考に。 今のままでは設定データベースを変更してもメモリ上の 変更をするだけでプロセスを起動しなおすと 元に戻ってしまいます。 ciscoでいう「conf t」して「copy run start」しない状態ですね。 設定データベースを変更したら次回起動時からも 反映するように設定します。 ・設定データ格納ディレクトリの作成 # mkdir /usr/local/etc/openldap/slapd.d ・設定データの作成 もしslapdがあがっているようであれば停止します。 # pkill slapd # slaptest -f $prefix/etc/openldap/slapd.conf -F $prefix/etc/openldap/slapd.d -f:設定ファイル -F:設定ディレクトリ ・slapd.dの中のファイルを確認 うまくいけば$prefix/etc/openldap/slapd.d/の中に cn=config.ldifファイルや cn=configディレクトリが作成されます。 ---実行例--- # ls /usr/local/etc/openldap/slapd.d/* /usr/local/etc/openldap/slapd.d/cn=config.ldif /usr/local/etc/openldap/slapd.d/cn=config: cn=include{0}.ldif cn=include{3}.ldif olcDatabase={-1}frontend.ldif cn=include{1}.ldif cn=schema olcDatabase={0}config.ldif cn=include{2}.ldif cn=schema.ldif olcDatabase={1}bdb.ldif ----------- 次回から起動時に-f -F をつけなくてもslapd.d配下の設定が 有効になって起動してきます。 逆にslapd.confが有効にならないのでslapd.confを変更しても だめになります。ldapmodifyですべて設定していくことになります。 ●データの変更 ・現在設定の確認 # ldapsearch -x -D "cn=config" -w secret -b "olcDatabase={-1}frontend,cn=config" -x:TLS(ssl)を使わない -D:バインド名 -w:バインドのパスワード -b:ベース名 # {-1}frontend, config dn: olcDatabase={-1}frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: {-1}frontend olcAccess: {0}to * by self write by users write by anonymous auth olcLastMod: TRUE olcMaxDerefDepth: 0 olcReadOnly: FALSE olcSchemaDN: cn=Subschema となっているので usersのアクセス権をreadに変えてみます。 ・変更内容をldifファイルに記述 # vi access.ldif ---ファイルの内容--- dn: olcDatabase={-1}frontend,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by self write by users read by anonymous auth ---END ファイル内容--- ・変更します。 # ldapmodify -x -D cn=config -w secret -f access.ldif ・変更されたかどうか確認 # ldapsearch -x -D cn=config -w secret -b "olcDatabase={-1}fronten d,cn=config" # extended LDIF # # LDAPv3 # base with scope subtree # filter: (objectclass=*) # requesting: ALL # # {-1}frontend, config dn: olcDatabase={-1}frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: {-1}frontend olcLastMod: TRUE olcMaxDerefDepth: 0 olcReadOnly: FALSE olcSchemaDN: cn=Subschema olcAccess: {0}to * by self write by users read by anonymous auth # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1 たまたま今はアクセス権の設定を変更しましたが その他の変更をする場合も同じようにしてldifファイルを 作ってldapmodifyで更新すればオンラインのまま設定が変更されます。 変更する元ネタの探し方がわからないと ldifファイルを作れません。 個人的には以下のようにして探しています。 ・一度現在の設定をすべてファイルに書き出してみる。 例).例えばLogLevelの設定を変えたいとします。 # ldapsearch -x -D cn=config -w secret -b cn=config| tee config.txt # grep -i loglevel config.txt  ※大体値やパラメータ名を予想します。 olcLogLevel: Stats olcAttributeTypes: ( OLcfgGlAt:28 NAME 'olcLogLevel' SYNTAX 1.3.6.1.4.1.1466.1 p $ olcLocalSSF $ olcLogLevel $ olcPasswordCryptSaltFormat $ olcPasswordHash と出てくるのでolcLogLevelを見つけます。 この辺の予想してとか現在入っている値を知ってて 初めて目的の設定パラメータにたどり着くところが いまいちですが、とりあえず慣れれば特に大変でもない。 そして # view config.txt olcLogLevelを検索 ・そしてそのパラメータのあるdn名を探す olcLogLevelのdn名は「dn: cn=config」 ・ldifファイルの作成 ドキュメントなどで入れることが可能な値は事前に調べる。 今回の場合は「Stats」→「Stats2」に変更する。 ということでldifファイルは ---loglevel.ldif--- dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: Stats2 ------------------- # ldapmodify -x -D cn=config -w secret -f /tmp/loglevel.ldif modifying entry "cn=config" という感じ。 ldapsearch -x -D cn=config -w secret -b cn=config olcLogLevel # extended LDIF # # LDAPv3 # base with scope subtree # filter: (objectclass=*) # requesting: olcLogLevel # # config dn: cn=config olcLogLevel: Stats2 となる。 どうかな。わかりにくいよね。 でもこの機能はアドミンは覚えるほか無いでしょう。