建立 LDAP 鏡像、及日常管理指令集

By Shaform, Sun 14 December 2014, in category Notes

Debian, LDAP, linux

建立鏡像

假設只有一台 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