openldap 2.4 マルチマスタ構成(目次)
| Table of Contents |
システム構成
概要
OpenLDAP2.4から実装されたMirrorModeを利用してマルチマスタ構成を組みます。 尚、ミラーリングの通信はセキュリティを考慮して暗号化します。
LDAPサーバ1
- ホスト名(IP)
- serv201(192.168.11.201)
- OS
- CentOS 5.4 (kernel 2.6.18-164.11.1.el5 )
- パッケージ
- db-4.8.26.tar.gz
- openldap-2.4.21.tgz
LDAPサーバ2
- ホスト名(IP)
- serv202(192.168.11.202)
- OS
- CentOS 5.4 (kernel 2.6.18-164.11.1.el5 )
- パッケージ
- db-4.8.26.tar.gz
- openldap-2.4.21.tgz
インストール
BerKeleyDBのインストール
openldap-2.4.21 は BerKeleyDB 4.4以上を必要とするため、現時点(2010年3月6日)の最新版である4.8をインストールします。
- 最新版をダウンロードします。
http://www.oracle.com/technology/software/products/berkeley-db/index.html
- 解凍してインストールします。インストール場所は「/usr/local」に変更しています。
# tar zxvf db-4.8.26.tar.gz # cd db-4.8.26/build_unix # ../dist/configure --prefix=/usr/local # make # make install
- BerKeleyDBのライブラリを共有ライブラリとして登録します。
# vi /etc/ld.so.conf /usr/local/lib ##追加
- 変更を反映します。
# ldconfig
openldapのインストール
- 最新版をダウンロードします。
# wget ftp://ftp.dti.ad.jp/pub/net/OpenLDAP/openldap-release/openldap-2.4.21.tgz
- 解凍してインストールします。インストール場所は「/usr/local/ldap」に変更しています。
monitor databaseはバックエンドに利用しないので、コンパイル時に無効します。
(無効にしておかないとslapcatコマンドで警告が出てしまいます)# tar zxvf openldap-2.4.21.tgz # cd openldap-2.4.21 # ./configure --prefix=/usr/local/ldap --enable-monitor=no # make depend # make # make install
- ldapのコマンド群に対してパスを設定します。
# vi ~/.bash_profile PATH=$PATH:/usr/local/ldap/bin:/usr/local/ldap/sbin #追加
- パスの設定変更を反映します。
# source ~/.bash_profile
全般的な設定
MANの追加
- manコマンドのパスを設定します。
# vi /etc/man.config MANPATH /usr/local/ldap/share/man
DB_CONFIGの作成
- Berkeley DBの設定ファイルであるDB_CONFIGをサンプルから作成します。内容はそのまま利用します。
# cd /usr/local/ldap # cp -rp etc/openldap/DB_CONFIG.example var/openldap-data/DB_CONFIG
ログの設定
- ログを保存するためのディレクトリを作成します。
# mkdir /var/log/ldap
- ログをsyslog経由で出力するよう設定します。
# vi /etc/syslog.conf local4.* /var/log/ldap/ldap.log
- syslogのログローテートにldap.logを追加します。
# vi /etc/logrotate.d/syslog /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/ldap/ldap.log {
- syslogを再起動します。
# /etc/init.d/syslog restart
管理パスワードの生成
- slappasswdコマンドで管理用パスワードを生成します。
今回のパスワードは「ldapadmin」で作成します。# slappasswd New password: ldapadmin Re-enter new password: ldapadmin {SSHA}16Xun3DtYiWo8rffe9RJHMZu2FF6n7CHこのパスワードは後で利用するのでテキストなどに貼り付けておきます。
秘密鍵と証明書の作成
下記を前提に秘密鍵と証明書を作成します。
- 秘密鍵は「localhost.key」として作成
- 証明書は「localhost.crt」として作成
- ディレクトリを移動します。
# cd /etc/pki/tls
- 秘密鍵を生成します。
「Enter PEM pass phrase:」の後にパスフレーズを入力すると暗号化のための秘密鍵(localhost.key)が生成されます。
# openssl genrsa -des3 2048 -rand /var/log/ > private/localhost.key
※-randでは乱数を生成する際の種となるディレクトリを指定します。ディレクトリはどこでも構いません。 - 起動時に毎回パスフレーズを聞かれるので、秘密鍵からパスフレーズを削除します。
「Enter pass phrase for private/localhost.key:」の後に先ほどのパスフレーズを入力します。
# openssl rsa -in private/localhost.key -out private/localhost.key Enter pass phrase for private/localhost.key: writing RSA key
- 生成された秘密鍵を使ってサイト証明書を発行します。(Common Nameはホスト名を入力)
# openssl req -new -x509 -key private/localhost.key -out certs/localhost.crt -days 3650 ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:192.168.11.201 Email Address []:
※補足:もう片方のサーバはCommon Nameを192.168.11.202で作成します。
openldapの設定(192.168.11.201側)
slapd.confの編集
- ldapの設定ファイル「/usr/local/ldap/etc/openldap/slapd.conf」を編集します
# vi /usr/local/ldap/etc/openldap/slapd.conf
- 以下にslapd.confの内容を全て記載します。
include /usr/local/ldap/etc/openldap/schema/core.schema include /usr/local/ldap/etc/openldap/schema/cosine.schema #追加 include /usr/local/ldap/etc/openldap/schema/inetorgperson.schema #追加 include /usr/local/ldap/etc/openldap/schema/nis.schema #追加 pidfile /usr/local/ldap/var/run/slapd.pid argsfile /usr/local/ldap/var/run/slapd.args database bdb suffix "dc=oss-d,dc=net" #修正 rootdn "cn=Manager,dc=oss-d,dc=net" #修正 rootpw {SSHA}16Xun3DtYiWo8rffe9RJHMZu2FF6n7CH #修正(slappasswdで生成) directory /usr/local/ldap/var/openldap-data #インデックス設定 # レプリケーション内部処理はentryCSNおよびentryUUIDの検索を頻繁に行うため # インデックスを作成し性能向上をはかります。 index objectClass,uid,uidNumber,gidNumber eq #修正 index entryCSN,entryUUID eq #追加 #---------------------------------------------------------------------#以下、全て追加 #ユーザが自分のパスワード変更できるようにアクセス権を設定する access to attrs=userPassword by self write by anonymous auth by * none #管理者は書き込み可能、その他のユーザは読み取り専用とします access to * by self write by * read #ログの設定 #(詳細なログを出力させるとパフォーマンスに大きく影響するため、必要最小限にして下さい) loglevel 256 #TLSの設定 #TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt #CAから証明書を発行してもらった場合は指定 TLSCertificateFile /etc/pki/tls/certs/localhost.crt TLSCertificateKeyFile /etc/pki/tls/private/localhost.key #MirrorModeの設定 overlay syncprov syncrepl rid=1 provider=ldaps://192.168.11.201 bindmethod=simple binddn="cn=Manager,dc=oss-d,dc=net" credentials=ldapadmin #bindパスワードを平文で記載 searchbase="dc=oss-d,dc=net" schemachecking=on type=refreshAndPersist retry="60 +" tls_reqcert=never #今回は自己証明書なのでneverを指定 syncrepl rid=2 provider=ldaps://192.168.11.202 bindmethod=simple binddn="cn=Manager,dc=oss-d,dc=net" credentials=ldapadmin searchbase="dc=oss-d,dc=net" schemachecking=on type=refreshAndPersist retry="60 +" tls_reqcert=never mirrormode on serverID 1
ldap.confの編集
- ldap.confに以下を追加します。
# vi /usr/local/ldap/etc/openldap/ldap.conf TLS_REQCERT never
openldapの設定(192.168.11.202側)
slapd.confの編集
- scpでslapd.confをコピーします。
# scp -r 192.168.11.201:/usr/local/ldap/etc/openldap/slapd.conf /usr/local/ldap/etc/openldap
- コピーした設定ファイルを変更します。変更は3箇所のみです。
# vi /usr/local/ldap/etc/openldap/slapd.conf #MirrorModeの設定 overlay syncprov syncrepl rid=2 #変更 provider=ldaps://192.168.11.201 bindmethod=simple binddn="cn=Manager,dc=oss-d,dc=net" credentials=ldapadmin searchbase="dc=oss-d,dc=net" schemachecking=on type=refreshAndPersist retry="60 +" tls_reqcert=never syncrepl rid=1 #変更 provider=ldaps://192.168.11.202 bindmethod=simple binddn="cn=Manager,dc=oss-d,dc=net" credentials=ldapadmin searchbase="dc=oss-d,dc=net" schemachecking=on type=refreshAndPersist retry="60 +" tls_reqcert=never mirrormode on serverID 2 #変更
ldap.confの編集
- ldap.confに以下を追加します。
# vi /usr/local/ldap/etc/openldap/ldap.conf TLS_REQCERT never
データベース複製
- 192.168.11.201側のデータベースをコピーします。
# cd /usr/local/ldap/var # mv openldap-data openldap-data.old # scp -r 192.168.11.201:/usr/local/ldap/var/openldap-data ./
起動設定
自動起動の設定
- 自動起動用のスクリプトを「/etc/init.d/ldap」として作成します。
以下はサンプルですが、「/etc/init.d/functions」を読み込むため、RedHat系OS以外は動作しません。
一応、ldapsの起動にも対応しています。#!/bin/bash # # chkconfig: 345 27 73 # description: OpenLDAP # processname: slapd # config: /usr/local/ldap/etc/openldap/slapd.conf # pidfile: /usr/local/ldap/var/run/slapd.pid # Source function library. . /etc/init.d/functions # Source networking configuration and check that networking is up. if [ -r /etc/sysconfig/network ] ; then . /etc/sysconfig/network [ ${NETWORKING} = "no" ] && exit 1 fi slapd=/usr/local/ldap/libexec/slapd slapd_conf=/usr/local/ldap/etc/openldap/slapd.conf slapd_args=/usr/local/ldap/var/run/slapd.args [ -x ${slapd} ] || exit 1 RETVAL=0 function start() { # Start daemons. prog=`basename ${slapd}` echo -n $"Starting $prog: " if grep -q ^TLS ${slapd_conf} ; then daemon ${slapd} -h '"ldap:/// ldaps:///"' $OPTIONS $SLAPD_OPTIONS RETVAL=$? else daemon ${slapd} $OPTIONS $SLAPD_OPTIONS RETVAL=$? fi echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap return $RETVAL } function stop() { # Stop daemons. prog=`basename ${slapd}` echo -n $"Stopping $prog: " killproc ${slapd} RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ldap ${slapd_args} return $RETVAL } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status ${slapd} ;; restart) stop start ;; condrestart) if [ -f /var/lock/subsys/ldap ] ; then stop start fi ;; *) echo $"Usage: $0 {start|stop|restart|status|condrestart}" RETVAL=1 esac exit $RETVAL
- 自動起動スクリプトに実行権限を付与します。
# chmod +x /etc/init.d/ldap
- chkconfigコマンドでldapをリストに追加し、自動起動をONにします。
# chkconfig --add ldap # chkconfig ldap on
- chkconfigコマンドで自動起動の確認をします。
LUNレベル3,4,5がonになっていれば問題ありません。
# chkconfig --list ldap ldap 0:off 1:off 2:off 3:on 4:on 5:on 6:off
- セキュリティのため、LDAP起動用に専用ユーザを作成します。
作成に合わせてLDAPインストール先の所有者も変更します。# useradd ldap -d /usr/local/ldap -s /bin/false # chown -R ldap:ldap /usr/local/ldap
- slapd.confには管理者のパスワードが平文で記載されているため、
root以外は読み書きできないようにします。# chmod 600 /usr/local/ldap/etc/openldap/slapd.conf
起動・確認
- ldapを起動します。(2台とも起動します)
# /etc/init.d/ldap start
- psコマンドでプロセスの確認を行います。slapd があれば問題ありません。
# ps ax|grep ldap /usr/local/ldap/libexec/slapd -h ldap:/// ldaps:///
データベースの作成(192.168.11.201側)
データベース構成
- 今回は下記のような構成でデータベースを作成します。
- ・Manager
-
slapd.confでrootdnに設定したディレクティブ。
Unixのrootのような扱いでデータベースに対してありとあらゆる権限を持ちます。
- ・Group
-
グループを登録するディレクティブ。
一般的なグループと同じで、複数ユーザをまとめて1つとして扱うために利用します。
Active Directory であれば administratorsやpoweruserがあります。
- ・Users
-
ユーザを登録するディレクティブ。
データ登録
サブツリーの登録
- サブツリー用にはldifファイルを利用するため、「object.ldif」を作成します。
# vi object.ldif dn: dc=oss-d,dc=net objectClass: dcObject objectclass: organization dc: oss-d o: oss-d.net dn: cn=Manager,dc=oss-d,dc=net objectClass: organizationalRole cn: Manager dn: ou=Users,dc=oss-d,dc=net objectClass: organizationalUnit ou: Users dn: ou=Group,dc=oss-d,dc=net objectClass: organizationalUnit ou: Group
- 上記をldapaddコマンドで登録します。
# ldapadd -x -D "cn=Manager,dc=oss-d,dc=net" -W -f object.ldif Enter LDAP Password: adding new entry "dc=oss-d,dc=net" adding new entry "cn=Manager,dc=oss-d,dc=net" adding new entry "ou=Users,dc=oss-d,dc=net" adding new entry "ou=Group,dc=oss-d,dc=net"
動作確認
マルチマスタの動作確認
両方のサーバで更新処理が行える事を確認するため、
片方のサーバ(serv201)でデータを登録し、もう片方のサーバ(serv202)でデータを削除します。
ユーザ登録(192.168.11.201)
- ユーザ登録用にldifファイル「user.ldif」を作成します。
[root@serv201 ~]# vi user.ldif dn: uid=hoge,ou=Users,dc=oss-d,dc=net uid: hoge objectClass: top objectClass: account objectClass: posixAccount objectClass: shadowAccount cn: hoge uidNumber: 10001 gidNumber: 10001 homeDirectory: /home/hoge loginShell: /bin/bash
- 上記をldapaddコマンドで登録します。
[root@serv201 ~]# ldapadd -x -D "cn=Manager,dc=oss-d,dc=net" -W -f user.ldif
ユーザ登録の確認(両サーバ)
- slapcatコマンドで登録データを確認します。両方のサーバにデータが登録されている事を確認します。
# slapcat
ユーザ削除(192.168.11.202)
- ユーザを削除します。
[root@serv202 ~]# ldapdelete -x -D "cn=Manager,dc=oss-d,dc=net" -W "uid=hoge,ou=Users,dc=oss-d,dc=net"
ユーザ削除の確認(両サーバ)
- slapcatで削除された事を確認します。両方のサーバで削除された事を確認します。
# slapcat
復旧後の動作
- 片系ダウンの状態で更新処理が行われるとデータに差分が発生しますが、復旧時に自動的にデータ同期が行われます。 動作確認は省略します。
各サーバ側での設定
各サーバ側で冗長化したLDAPを指定する場合は、マスタとスレーブに分けて登録します。
マスタとスレーブを分けて登録できない場合は、スペース区切りでLDAPを指定します。
postfixの場合
- スペース区切りで2台のLDAPサーバを設定します。
# vi /etc/postfix/ldap-alias.cf server_host = 192.168.11.201 192.168.11.202
バックアップ
バックアップ方法
データのバックアップにはオンラインバックアップが可能なslapcatコマンド(データをLDIFファイル形式で出力)を利用します。
- 全データをバックアップする場合は以下のようになります。
# slapcat -l backup.ldif
- 特定のサブディレクトリ配下をバックアップする場合は-sオプションを利用します。
Users配下のバックアップを取る場合は以下のように指定します。
# slapcat -s "ou=Users,dc=oss-d,dc=net" -l backup.ldif
バックアップ設定
要件
- バックアップ要件は下記を前提として設定を行います。
要件 実現方法 オンラインバックアップ slapcatコマンドを利用 定期バックアップ cronを利用 世代管理 logrotateを利用
各種設定
- バックアップ用のディレクトリを作成します。
# mkdir /backup
- 定期バックアップはcronを利用します。
今回は毎日2時にバックアップするよう「crontab -e」コマンドで設定します。# crontab -e 0 2 * * * /usr/local/ldap/sbin/slapcat -l /backup/backup.ldif
- 世代管理はlogrotateを利用します。
設定ファイル「/etc/logrotate.d/ldap_backup」を下記内容で新規作成します。# vi /etc/logrotate.d/ldap_backup /backup/backup.ldif { daily missingok notifempty rotate 10 }設定項目については以下の通りです。設定項目 説明 daily 毎日実行する missingok ファイルが無くてもエラーを出さない notifempty ファイルが空なら実行しない rotate 10 10世代残す
- logrotate の確認を行います。
# logrotate -dv /etc/logrotate.d/ldap_backup reading config file /etc/logrotate.d/ldap_backup reading config info for /backup/backup.ldif Handling 1 logs rotating pattern: /backup/backup.ldif after 1 days (10 rotations) empty log files are not rotated, old logs are removed considering log /backup/backup.ldif log /backup/backup.ldif does not exist -- skipping
エラーの場合は下記のようなエラーがでます。error: /etc/logrotate.d/ldap_backup:2 unexpected text
リストア
slapcatでバックアップした場合のリストア手順を示します。
- ldapを停止します。
# /etc/init.d/ldap stop
- データを全て削除します。
# cd /usr/local/ldap/var/openldap-data # rm -rf *
- DB_CONFIGファイルを作成します。
# cd /usr/local/ldap # cp -rp etc/openldap/DB_CONFIG.example var/openldap-data/DB_CONFIG
- slapadd コマンドでリストア後、ファイルの所有者を変更します。
# slapadd -l /backup/backup.ldif # chown -R ldap:ldap /usr/local/ldap/var/openldap-data
- ldapを起動します。
# /etc/init.d/ldap start slapd を起動中: [ OK ]
管理ツールの導入
FAQ
Q. 起動時に「rootdn is always granted unlimited privileges.」という警告メッセージが表示される。
# /etc/init.d/ldap start
slapd の設定ファイルをチェック中: /etc/openldap/slapd.conf: line 101: rootdn is always granted unlimited privileges.
config file testing succeeded
[ OK ]
slapd を起動中: [ OK ]
- A:
rootdnが常に全権限が持つ場合に上記警告が表示されます。
access to * by dn="cn=Manager,dc=oss,dc=dip,dc=jp" write
「/etc/openldap/slapd.conf」で上記のようなアクセス権を設定している場合は 以下のように変更して下さい。#管理者は書き込み可能、その他のユーザは読み取り専用 access to * by self write by * read
Q.slapcat実行時に警告が表示される
# slapcat bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
- A:
OpenLDAPをソースからインストールした場合、monitorがバックエンドとして有効になるため configureで無効にしてインストールして下さい。# ./configure --enable-monitor=no
Q.OpenLDAPのコンパイル時にBerkeleyDB version エラーとなる
# ./configure checking for Berkeley DB major version in db.h... 4 checking for Berkeley DB minor version in db.h... 3 checking if Berkeley DB version supported by BDB/HDB backends... no configure: error: BerkeleyDB version incompatible with BDB/HDB backends
- A:
BerkeleyDBのバージョンが古い可能性があります。
OpenLDAPのREADMEに記載のあるバージョンのBerkeleyDBをインストールして下さい。# vi openldap-2.4.21/README SLAPD: BDB and HDB backends require Oracle Berkeley DB 4.4, 4.5, 4.6, 4.7, or 4.8. It is highly recommended to apply the patches from Oracle for a given release.
Q: ldapsを利用したミラーリングで、ログに以下のような ldap_sasl_bind_s のエラーが表示される。
Mar 7 04:03:13 serv202 slapd[17466]: slap_client_connect: URI=ldaps://192.168.11.201 DN="cn=manager,dc=oss-d,dc= net" ldap_sasl_bind_s failed (-1)
- A:
slapd.confでTSL、ミラーリングの設定を見直す必要があります。
相手サーバとLDPASポート(636番)で通信が出来ており、URI、DNに間違いが無い場合は、
証明書の問題である可能性が高いです。
特に自己証明書を利用している場合は、証明書のチェックをしないよう
slapd.confでtls_reqcertの設定を行います。syncrepl rid=1 provider=ldaps://192.168.11.202 bindmethod=simple binddn="cn=Manager,dc=oss-d,dc=net" credentials=ldapadmin searchbase="dc=oss-d,dc=net" schemachecking=on type=refreshAndPersist retry="60 +" tls_reqcert=never #この部分を追加