OpenLDAP - Replication LDAP 設定

1、前言

Replication (複製) 即 Master LDAP Data Copy To Slave LDAP 動作稱之,目前實作的架構是 Master LDAP 負責 Mail 服務,而 Samba、FTP 服務在另一台主機 (Slave LDAP),不想要每次 Samba、FTP 需要認證時就跑去找 Master LDAP 所以便在 Samba、FTP 服務主機架設 Salver LDAP,因此此次的實作便開始了。


Replication (複製) LDAP 流程如下:

  1. 停止 Master LDAP slapd daemon
  2. 修改 Master LDAP slapd.conf 內容 (加入 replogfile、replica)
  3. Mzster LDAP 執行 db_checkpoint 後將 Master LDAP BDB Copy To Slaver LDAP
  4. 修改 Slaver LDAP slapd.conf 內容 (加入 updatedn、updateref)
  5. 啟動 Slaver LDAP slapd daemon
  6. 啟動 Master LDAP slapd daemon 
  7. 啟動 Master LDAP slurpd daemon (LDAP update replication daemon)





文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.停止 Master LDAP slapd Daemon
          步驟2.修改 Master LDAP slapd.conf 設定檔
          步驟3.將 Master LDAP BDB Copy To Slaver LDAP
          步驟4.修改 Slaver LDAP slapd.conf 內容
          步驟5.啟動 Slaver LDAP slapd Daemon
          步驟6.啟動 Master LDAP slapd daemon
          步驟7.啟動 Master LDAP slurpd Daemon
          步驟8.設定為 One-shot 方式進行 LDAP 同步
4、Replication (複製) 測試
          測試1.在 Master LDAP 端修改使用者 wei CN 資料後同步至 Slaver LDAP
          測試2.在 Master LDAP 建立新使用者帳號 test 之後同步至 Slaver LDAP
          測試3.在 Master LDAP 刪除使用者帳號 test 後同步至 Slaver LDAP
5、參考
6、Me FAQ
          Q1.啟動 Slaver LDAP slapd daemon 失敗?
          Q2.更新資料後 Master LDAP 怎麼沒有產生 slurpd.log?
          Q3.Slaver LDAP 出現 /etc/opiekeys: Permission denied 錯誤訊息?





2、實作環境

  • FreeBSD 6.1-STABLE
Master LDAP
  • HostName:masterldap.weithenn.org
  • IP Address:192.168.1.1
Slaver LDAP
  • HostName:slaverldap.weithenn.org
  • IP Address:192.168.1.2





3、安裝及設定

步驟1.停止 Master LDAP slapd Daemon

鍵入如下指令來停止 Master LDAP slapd 服務。
/usr/local/etc/rc.d/slapd stop



步驟2.修改 Master LDAP slapd.conf 設定檔

修改 Master LDAP 設定檔 slapd.conf。
vi /usr/local/etc/openldap/slapd.conf
 replogfile   /var/db/openldap-slurp/replica/slurpd.replog  //指定 slurpd 更新檔 Log 路徑
 replica   host=slaverldap.weithenn.org:389        //指定 Slaver LDAP 主機
           suffix="dc=weithenn,dc=org"             //更新的 DN
           binddn="cn=Manager2,dc=weithenn,dc=org" //能寫入Slaver LDAP使用者(一般為 Slaver LDAP RootDN)
           bindmethod=simple                       //認證方式
           credentials=MyPass                      //Slaver LDAP Manager2 的密碼 (注意須為明碼)
           tls=yes                                 //開啟 TLS 支援 




步驟3.將 Master LDAP BDB Copy To Slaver LDAP

在進行複製 Master LDAP BDB 到 Slaver LDAP 之前,記得在 Master LDAP 上先執行 db_checkpoint 確保所有資料已寫入 BDB 資料庫中,完成 db_checkpoint 後直接將 BDB 資料庫複製到 Slaver LDAP 的 BDB 資料庫路徑即可,當然您也可使用 slapcat 方式把資料匯出成 ldif 在匯入至 Slaver LDAP 內。
db_checkpoint-4.3 -1 -h /var/db/openldap-data/   //確保資料寫入資料庫中



步驟4.修改 Slaver LDAP slapd.conf 內容

修改 Slaver LDAP 設定檔 slapd.conf。
vi /usr/local/etc/openldap/slapd.conf
 rootdn      "cn=Manager2,dc=weithenn,dc=org"       //Slaver LDAP RootDN
 rootpw      {SSHA}SMKnFPO435G+QstIzNGb4RGjT0KLz2TV //Slaver LDAP Manager2密碼(為 MyPass經SSHA加密後)
 updatedn    "cn=Manager2,dc=weithenn,dc=org"       //指定 Master LDAP slurpd 用來複製的 DN
 updateref   ldap://masterldap.weithenn.org         //指定 Master LDAP (把更新要求送給 Master LDAP)




步驟5.啟動 Slaver LDAP slapd Daemon

鍵入如下指令來啟動 Slaver LDAP slapd 服務。
/usr/local/etc/rc.d/slapd start



步驟6.啟動 Master LDAP slapd daemon

鍵入如下指令來啟動 Master LDAP slapd 服務。
/usr/local/etc/rc.d/slapd start



步驟7.啟動 Master LDAP slurpd Daemon

slurpd 執行緒 (Process) 每隔 3 秒便會檢查一次變動日誌 (slurpd.replog),但此次實作中當啟動 slurpd 服務後雖然 Master LDAP 與 Slaver LDAP 已經達成資料同步,但怪事發生了? 因為 slurpd load 還是吃很重? 在找不到解決方式的情況下因為 LDAP 資料變動程度並不大所以決定使用單次模式 (One-shot) 來達成同步的需求。

當 slurpd 服務常駐時雖然 Master/Slaver LDAP 二邊資料已經同步完成但是 Loading 很重?
 PID   USERNAME       THR PRI NICE   SIZE   RES   STATE  C  TIME WCPU   COMMAND
 53077 root           3   20  0      4080K  2892K kserel 0  0:35 90.97% slurpd




步驟8.設定為 One-shot 方式進行 LDAP 同步

由於尚未找到如何解決 slurpd Loading 問題,目前使用單次模式 (One-shot) 來達成 LDAP 同步的需求 (設定於 Master LDAP 中)。
vi /etc/rc.conf
 slurpd_enable="YES"
 slurpd_flags="-r /var/db/openldap-slurp/replica/slurpd.replog -o"  //使用 One-shot 模式請加入此行

啟動 slurpd 服務。
/usr/local/etc/rc.d/slurpd start   //啟動 slurpd 服務
 Starting slurpd.
 Processing in one-shot mode:         //啟動 one-shot 模式
 0 total replication records in file, //因為沒變更任何資料所以是空的 (代表二邊資料已經是同步)
 0 replication records to process.

啟動 slurpd 服務後產生的相關檔案。
 slurpd.replog             //記錄更新內容 (當更新時才會產生此檔)
 slurpd.status             //記錄 slurpd 的狀態 (當 slurpd 啟動時產生)
 <hostname:port>.rej       //當 slurpd 無法變更或失敗時便會將資訊寫入此檔






4、Replication (複製) 測試

測試1.在 Master LDAP 端修改使用者 wei CN 資料後同步至 Slaver LDAP

在 Master LDAP 上利用 ldapbrowser 修改使用者 wei 的 CN 內容為 IT-TestAccount,修改完成後 slurpd.replog 便產生並記錄剛才變更的內容,我們來查看一下 slurpd.replog 內容,可看到 time 內容為定義日誌變更項目的時間 (自 1970 GMT 起算),當 Master LDAP 及 Slaver LDAP 進行同步後會將 slurpd.replog 最新的時間寫入至 slurpd.status 內,以避免重複處理已經同步過的 LDAP 資訊。
cat /var/db/openldap-slurp/replica/slurpd.replog
 replica: slaverldap.weithenn.org:389      //變更資訊應該傳給哪部主機 (Slaver LDAP)
 time: 1163402864                          //變更時間自 1970 GMT 起算(秒)
 dn: uid=wei,ou=People,dc=weithenn,dc=org  //處理的 DN 項目
 changetype: modify                        //更改的類別為【變更】
 replace: userPassword
 userPassword:: e2NyeXB0fUc0ckR4QndBMTdxWmc=
 -
 replace: cn                               //取代項目 CN
 cn: IT-TestAccount                        //更新 CN 內容為 IT-TestAccount
 -
 replace: entryCSN
 entryCSN: 20061113072744Z#000000#00#000000
 -
 replace: modifiersName                    //定義於 RFC2251 為 LDAP 自行維護用
 modifiersName: cn=Manager,dc=weithenn,dc=org
 -
 replace: modifyTimestamp                  //定義於 RFC2251 為 LDAP 自行維護用
 modifyTimestamp: 20061113072744Z


此時在 Master LDAP 我們執行 One-Shot 模式來同步修改過的資料至 Slaver LDAP。
/usr/local/etc/rc.d/slurpd start
 Starting slurpd.
 Processing in one-shot mode:
 1 total replication records in file,      //顯示同步一個記錄 (也就是剛才所修改的記錄)
 1 replication records to process.

執行完 One-Shot 同步後查看 Slaver LDAP 端 ldap.log 檢查是否有接收到來自 Master LDAP 同步要求。
tail /var/log/ldap.log
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 fd=11 ACCEPT from IP=192.168.1.1:53029 (IP=0.0.0.0:389)   //允許 Master LDAP 要求
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=0 STARTTLS
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=0 RESULT oid= err=0 text=
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 fd=11 TLS established  tls_ssf=256 ssf=256  //啟動 TLS
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 BIND dn="cn=Manager2,dc=weithenn,dc=org" method=128
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 BIND dn="cn=Manager2,dc=weithenn,dc=org" mech=SIMPLE ssf=0
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 RESULT tag=97 err=0 text=
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 MOD dn="uid=wei,ou=People,dc=weithenn,dc=org"        //更改使用者 wei 的 DN 項目
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 MOD attr=userPassword cn entryCSN modifiersName modifyTimestamp
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 RESULT tag=103 err=0 text=




測試2.在 Master LDAP 建立新使用者帳號 test 之後同步至 Slaver LDAP

在 Master LDAP 使用匯入 ldif 檔案的方式建立新使用者帳號 test 完成之後,我們來查看一下 slurpd.replog 內容。
cat /var/db/openldap-slurp/replica/slurpd.replog
 replica: slaverldap.weithenn.org:389       //變更資訊應該傳給哪部主機
 time: 1163409106                           //變更時間自 1970 GMT 起算(秒)
 dn: uid=test,ou=People,dc=weithenn,dc=org  //處理的 DN 項目
 changetype: add                            //更改的類別為【新增】
 ...................................
 ...略...(此段為 user test ldif 內容)
 ...................................
 structuralObjectClass: inetOrgPerson
 entryUUID: bb274c52-0742-102b-8f4f-8b2c88f2f77c
 creatorsName: cn=Manager,dc=weithenn,dc=org
 createTimestamp: 20061113091146Z
 entryCSN: 20061113091146Z#000000#00#000000
 modifiersName: cn=Manager,dc=weithenn,dc=org
 modifyTimestamp: 20061113091146Z

此時在 Master LDAP 我們執行 One-Shot 模式來同步資料至 Slaver LDAP,執行完 One-Shot 同步後查看 Slaver LDAP 端 ldap.log 看是否有接收到 Master LDAP 同步要求。
tail /var/log/ldap.log
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 fd=11 ACCEPT from IP=192.168.1.1:53029 (IP=0.0.0.0:389)     //允許 Master LDAP 要求
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=0 STARTTLS
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=0 RESULT oid= err=0 text=
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 fd=11 TLS established  tls_ssf=256 ssf=256  //啟動 TLS
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 BIND dn="cn=Manager2,dc=weithenn,dc=org" method=128
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 BIND dn="cn=Manager2,dc=weithenn,dc=org" mech=SIMPLE ssf=0
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 RESULT tag=97 err=0 text=
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 ADD dn="uid=test,ou=People,dc=weithenn,dc=org"  //新增使用者帳號 test 的 DN 項目
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 RESULT tag=103 err=0 text=




測試3.在 Master LDAP 刪除使用者帳號 test 後同步至 Slaver LDAP

在 Master LDAP 刪除使用者帳號 test 完成後,我們來查看一下 slurpd.replog 內容。
cat /var/db/openldap-slurp/replica/slurpd.replog
 replica: slaverldap.weithenn.org:389       //變更資訊應該傳給哪部主機
 time: 1163409450                           //變更時間自 1970 GMT 起算(秒)
 dn: uid=test,ou=People,dc=weithenn,dc=org  //處理的 DN 項目
 changetype: delete                         //更改的類別為【刪除】

此時在 Master LDAP 我們執行 One-Shot 模式來同步資料至 Slaver LDAP,執行完 One-Shot 同步後查看 Slaver LDAP 端 ldap.log 看是否有接收到 Master LDAP 同步要求。
tail /var/log/ldap.log
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 fd=11 ACCEPT from IP=192.168.1.1:53029 (IP=0.0.0.0:389)    //允許 Master LDAP 要求
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=0 STARTTLS
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=0 RESULT oid= err=0 text=
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 fd=11 TLS established  tls_ssf=256 ssf=256  //啟動 TLS
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 BIND dn="cn=Manager2,dc=weithenn,dc=org" method=128
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 BIND dn="cn=Manager2,dc=weithenn,dc=org" mech=SIMPLE ssf=0
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=1 RESULT tag=97 err=0 text=
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 DEL dn="uid=test,ou=People,dc=weithenn,dc=org"   //刪除使用者帳號 test 的 DN 項目
 Nov 13 15:27:46 slaverldap slapd53279: conn=0 op=2 RESULT tag=103 err=0 text=






5、參考






6、Me FAQ

Q1.啟動 Slaver LDAP slapd daemon 失敗?

Error Message:
啟動 Slaver LDAP slapd daemon 失敗,查看後發現錯誤訊息如下?
Nov 11 14:07:03 slaverldap slapd46207: connections_destroy: nothing to destroy.
Nov 11 14:07:03 slaverldap slapd46207: /usr/local/etc/openldap/slapd.conf: line 18: frontend database cannot be shadow.
Nov 11 14:07:57 slaverldap slapd46230: slapd stopped.

Ans:
line 18 就是在 Slaver LDAP 設定檔 slapd.conf 中 updatedn 那一行,將 updatedn、updateref 這二行移到 rootpw 下面後在重新啟動 slapd daemon 就成功了。修改 Slaver LDAP 設定檔 slapd.conf 內容如下:
vi /usr/local/etc/openldap/slapd.conf
 rootdn          "cn=Manager2,dc=weithenn,dc=org"        //Slaver LDAP RootDN
 rootpw          {SSHA}SMKnFPO435G+QstIzNGb4RGjT0KLz2TV  //Slaver LDAP Manager2 的密碼 (為 MyPass 經 SSHA 加密後)
 updatedn        "cn=Manager2,dc=weithenn,dc=org"  //指定 Master LDAP slurpd 用來複製的 DN
 updateref       ldap://masterldap.weithenn.org    //指定 Master LDAP (把更新要求送給 Master LDAP)




Q2.更新資料後 Master LDAP 怎麼沒有產生 slurpd.log?

Error Message:
更新資料後 Master LDAP 怎麼沒有產生 slurpd.log? 查看 ldap.log 後發現如下訊息?
Nov 13 14:17:10 ldap slapd49162: could not open "/var/db/openldap-slurp/replica/slurpd.log.lock"
Nov 13 14:22:15 ldap slapd49162: could not open "/var/db/openldap-slurp/replica/slurpd.log.lock"

Ans:
結果為 openldap-slurp 權限設定不正確 (owner 應設定為 ldap); 沒將 owner 改為 ldap 是因為當我執行 slurpd 後有產生 slurpd.status 檔,想說權限應該沒問題試了好久都沒有產生更新檔,後來把權限改為 ldap 後就順利產生 slurpd.log
chown -R ldap:ldap /var/db/openldap-slurp



Q3.Slaver LDAP 出現 /etc/opiekeys: Permission denied 錯誤訊息?

Error Message:
Slaver LDAP 在運作幾天之後 /var/log/message 出現如下錯誤訊息?
Jan 16 10:05:33 slaverldap slapd34554: OTP unavailable because can't read/write key database /etc/opiekeys: Permission denied
Ans:
一樣是權限設定問題所造成,將 /etc/opiekeys 的 owner 改成 ldap 後 slapd 服務便可存取該檔案之後也未出現錯誤訊息
chown ldap:ldap /etc/opiekeys