OpenLDAPのミラーモードを2台のサーバで構築する手順。2台のOpenLDAPサーバに同時に更新を行うと問題が発生する場合がある為、keepalived で VIPを使用できるように設定する。セットアップは 1台目と2台目のサーバで全く同じコマンドを実行する。
・環境
Network Interface | IPアドレス |
1台目:eth1 | 192.168.0.11/24 |
2台目:eth1 | 192.168.0.12/24 |
VIP | 192.168.0.10/24 |
1. firewalld のセットアップ
#-- eth1 への IPアドレスは事前に設定してあること
#-- eth1 への通信を許可
firewall-cmd --add-interface=eth1 --permanent --zone=trusted
firewall-cmd --reload
2. keepalived のセットアップ
#-- keepalived のインストール
yum install -y keepalived
systemctl enable keepalived
#-- VIPの設定
cat <<_EOF_> /etc/keepalived/keepalived.conf
vrrp_sync_group VG1 {
group {
SERVICE
}
}
vrrp_instance SERVICE {
state BACKUP
interface eth1
virtual_router_id 1
priority 100
advert_int 5
virtual_ipaddress {
192.168.0.10
}
}
_EOF_
#-- keepalived の起動
systemctl start keepalived
#-- これで VIP がどちらかのサーバに設定される
3. openldap のセットアップ
#-- rsyslog に slapd のログ出力設定を追加
echo "local4.* /var/log/openldaplog" > /etc/rsyslog.d/openldap.conf
sed -i '1s#^#/var/log/openldaplog\n#' /etc/logrotate.d/syslog
systemctl restart rsyslog
#-- パスワードを変数にセット
ROOT_PASSWORD="YourPassword"
ROOT_PW=$(slappasswd -s ${ROOT_PASSWORD})
#-- openldap のインストール (sendmail.schema が必要ない場合、sendmail-cf はインストールしない)
yum install -y openldap-servers openldap-clients sendmail-cf
#-- sendmail schema を保存
cp -p /usr/share/sendmail-cf/sendmail.schema /etc/openldap/schema/
#-- slapd.conf を作成 (schemaは、ミラーモードに 必要なもの + sendmail.schema のみ有効)
cat <<_EOL_> /etc/openldap/slapd.conf
loglevel 256
sizelimit -1
#include /etc/openldap/schema/corba.schema
#include /etc/openldap/schema/duaconf.schema
#include /etc/openldap/schema/java.schema
#include /etc/openldap/schema/nis.schema
#include /etc/openldap/schema/ppolicy.schema
#include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/sendmail.schema
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
moduleload syncprov.la
moduleload back_hdb.la
backend hdb
#-- config 用データベースに対するアクセス制限
database config
rootdn "cn=config"
rootpw "${ROOT_PW}"
access to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by dn="cn=manager" manage
by * none
overlay syncprov
#-- monitor データベースに対するアクセス制限
# ROOT_DN のみ read 可能
# 確認コマンド ldapsearch -x -D "cn=config" -W +
database monitor
access to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by * none
#-- user データベース
database hdb
suffix ""
rootdn "cn=manager"
rootpw "${ROOT_PW}"
#--- userPassword に対するアクセス制限
# 自分自身は書き換え可能
# ROOT_DN は書き換え可能
# 匿名接続ならば、認証したときにこの属性が使える
access to attrs=UserPassword
by self write
by anonymous auth
by * none
#-- Termed は ROOT_DN のみ書き換え可能
access to dn.regex="uid=.*,ou=Termed,dc=.*"
by * none
#-- その他の属性は ROOT_DN のみ書き換え可能
# ROOT_DN 以外は read のみ可能
access to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * read
checkpoint 1024 15
directory /var/lib/ldap
index entryCSN,entryUUID eq
index objectClass eq,pres
index uid eq,pres,sub
index mailHost,mailRoutingAddress,mailLocalAddress,sendmailMTAHost eq,pres
overlay syncprov
_EOL_
#-- slapd.conf から olc に設定を変換する為の前処理
rm -rf /etc/openldap/slapd.d/* /var/lib/ldap/*
mv /etc/openldap/slapd.d /etc/openldap/slapd.d.org
#-- DB_CONFIGの設定
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
cat <<'_EOL_'> /var/lib/ldap/DB_CONFIG
set_cachesize 0 10485760 1
set_flags DB_LOG_AUTOREMOVE
set_lg_regionmax 262144
set_lg_bsize 2097152
_EOL_
#-- DBの初期化など
systemctl start slapd
systemctl stop slapd
mv /etc/openldap/slapd.d.org /etc/openldap/slapd.d
#-- slapd.conf から olc に設定を変換
sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
#-- slapd の起動
systemctl enable slapd
systemctl start slapd
#-- ミラーモードの ldif 作成
cat <<_EOL_> /tmp/ldap_mirror.ldif
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 001 ldap://192.168.0.11
-
add: olcServerID
olcServerID: 002 ldap://192.168.0.12
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://192.168.0.12/ binddn="cn=manager" bindmethod=simple credentials=${ROOT_PASSWORD} searchbase="" type=refreshAndPersist retry="5 10 60 +" timeout=1 scope=sub starttls=no schemachecking=ok
olcSyncRepl: rid=002 provider=ldap://192.168.0.11/ binddn="cn=manager" bindmethod=simple credentials=${ROOT_PASSWORD} searchbase="" type=refreshAndPersist retry="5 10 60 +" timeout=1 scope=sub starttls=no schemachecking=ok
-
add: olcMirrorMode
olcMirrorMode: TRUE
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://192.168.0.12/ binddn="cn=config" bindmethod=simple credentials=${ROOT_PASSWORD} searchbase="cn=config" type=refreshAndPersist retry="5 10 300 +" timeout=1
olcSyncRepl: rid=002 provider=ldap://192.168.0.11/ binddn="cn=config" bindmethod=simple credentials=${ROOT_PASSWORD} searchbase="cn=config" type=refreshAndPersist retry="5 10 300 +" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE
_EOL_
#-- ミラーモードの設定投入
ldapadd -D "cn=config" -w ${ROOT_PASSWORD} -f /tmp/ldap_mirror.ldif
# これで VIP に対して更新処理を行えば、もう一方のサーバにも更新内容が反映される