建立鏡像
假設只有一台 LDAP server,則一旦 crash 大家都無法登入了,故可以建立一個鏡像 server,不斷同步資料內容。這篇假設你已經建好前篇的 ldap.lab.csie.ntu.edu.tw,而想再建一個 ldapm.lab.csie.ntu.edu.tw。則在 clients 的設定可設為:
# /etc/ldap/ldap.conf
URI ldaps://ldap.lab.csie.ntu.edu.tw ldaps://ldapm.lab.csie.ntu.edu.tw
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
# /etc/nslcd.conf
uri ldaps://ldap.lab.csie.ntu.edu.tw
uri ldaps://ldapm.lab.csie.ntu.edu.tw
#ssl off
tls_reqcert demand
tls_cacertfile /etc/ssl/certs/ca-certificates.crt
初始安裝 Mirror Server
首先透過前一篇文章的作法安裝 ldapm.lab.csie.ntu.edu.tw 但跳過「轉移 NIS 資料」的部份。此外,需使用同一個 my_root
但卻須產生新的 server 憑證,並對應到新的網域名稱(注意 -set_serial
號碼與之前不同):
openssl genrsa -out ldapm_key.pem 1024
openssl req -new -key ldapm_key.pem -out ldapm_csr.pem
openssl x509 -req -days 36500 -in ldapm_csr.pem -CA my_root_crt.pem -CAkey my_root_key.pem -out ldapm_crt.pem -set_serial 2
同時設定 Master 和 Mirror Server
接下來,我們要在兩邊分別建立一個帳戶供 mirror 之用,首先建立一個密碼,比如說 1234
:
slappasswd -h {SSHA}
New password:
Re-enter new password:
{SSHA}oQ1Lw12oTHhdL9NwHQe2FoypBZX90QKx
echo -n {SSHA}oQ1Lw12oTHhdL9NwHQe2FoypBZX90QKx | base64
e1NTSEF9b1ExTHcxMm9USGhkTDlOd0hRZTJGb3lwQlpYOTBRS3g=
緊接著,分別在兩台 server 上建立 mirror.ldif
檔案:
dn: cn=mirrormode,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
changetype: add
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: mirrormode
description: Syncrepl user for mirrormode operation
userPassword:: e1NTSEF9b1ExTHcxMm9USGhkTDlOd0hRZTJGb3lwQlpYOTBRS3g=
執行
ldapmodify -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -W -f mirror.ldif
緊接著,分別在兩台 server 上建立 mirror_config.ldif
檔案:
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov
dn: olcDatabase={1}hdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" write by * none
-
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" write by dn="cn=mirrormode,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" read by * none
-
dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changeType: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
dn: olcDatabase={1}hdb,cn=config
changeType: modify
delete: olcDbIndex
olcDbIndex: objectClass eq
-
add: olcDbIndex
olcDbIndex: objectClass,entryCSN,entryUUID eq
-
執行
ldapmodify -Y EXTERNAL -H ldapi:/// -f mirror_config.ldif
最後在兩台機器上建立不同的兩個檔案 ldap.ldif
, ldapm.ldif
:
ldap.lab.csie.ntu.edu.tw:
dn: cn=config
changeType: modify
add: olcServerID
olcServerID: 0
-
dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcSyncrepl
olcSyncrepl: rid=001 provider=ldaps://ldapm.lab.csie.ntu.edu.tw bindmethod=simple binddn="cn=mirrormode,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" credentials=1234 searchbase="dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" schemachecking=on type=refreshAndPersist retry="60 +"
-
add: olcMirrorMode
olcMirrorMode: TRUE
-
執行
ldapmodify -Y EXTERNAL -H ldapi:/// -f ldap.ldif
ldapm.lab.csie.ntu.edu.tw:
dn: cn=config
changeType: modify
add: olcServerID
olcServerID: 1
-
dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcSyncrepl
olcSyncrepl: rid=001 provider=ldaps://ldap.lab.csie.ntu.edu.tw bindmethod=simple binddn="cn=mirrormode,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" credentials=1234 searchbase="dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" schemachecking=on type=refreshAndPersist retry="60 +"
-
add: olcMirrorMode
olcMirrorMode: TRUE
-
執行
ldapmodify -Y EXTERNAL -H ldapi:/// -f ldapm.ldif
注意 olcServerID
要用不同的編號,而 provider
要設成對方,credentials
則是剛剛選擇的密碼。
最後測試看看是否已經同步:
ldapsearch -x -h localhost
日常管理
建立使用者
ldapadd -x -W -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" <<EOF
dn: cn=$username,ou=Group,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
objectClass: posixGroup
objectClass: top
cn: $username
userPassword: {crypt}x
gidNumber: $userid
EOF
ldapadd -x -W -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" <<EOF
dn: uid=$username,ou=People,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
uid: $username
cn: $realname
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: $userid
gidNumber: $userid
homeDirectory: /home/$username
gecos: ,,,
EOF
ldappasswd -x -W -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -S uid=$username,ou=People,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
刪除使用者
ldapdelete -x -W -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" "cn=$username,ou=Group,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw"
ldapdelete -x -W -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" "uid=$username,ou=People,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw"
修改使用者的群組
# add
ldapmodify -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -W <<EOF
dn: cn=$groupname,ou=Group,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
changetype: modify
add: memberUid
memberUid: $username
EOF
# remove
ldapmodify -D "cn=admin,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw" -W <<EOF
dn: cn=$groupname,ou=Group,dc=lab,dc=csie,dc=ntu,dc=edu,dc=tw
changetype: modify
delete: memberUid
memberUid: $username
EOF
備份與還原
如果只有一個鏡像壞掉,只要再用這篇的方法建立一個鏡像就可以備份到另一個。否則可以用以下兩個指令,注意不同的鏡像設定也會被備份,所以不同台 server 可能不能直接用同一個備份檔還原:
slapcat > bak.ldif
slapadd -l bak.ldif