---
# System prepended metadata

title: 3. Config OpenLdap Master-Slave
tags: [LDAP-Series, ' Configure', ' Tutorial']

---

---
slideOptions:
  transition: slide
  theme: night
tags: LDAP-Series, Configure, Tutorial
type: 
title: 3. Config OpenLdap Master-Slave
---
<style>
    .reveal section img {
        background: transparent!important;
        border: none!important;
        box-shadow: none!important;
    }
</style>

# Cấu hình triển khai OpenLdap theo mô hình Master-Slave

## Tổng quan

Khi triển khai LDAP trong môi trường thực tế, chúng ta phải quan tâm tới giải pháp backup, tăng tính sẵn sàng cho dịch vụ LDAP. Bên cạnh đó là việc mở rộng LDAP (Scale) đáp ứng lưu lượng cao, bảo đảm hiệu năng, tính sẵn sàng dịch vụ. Để giải quyết vấn đề trên, LDAP cung cấp cơ chế replication để backup cũng như tăng tính sẵn sàng cho dịch vụ.

Replication là tiến trình được cấu hình từ 2 hoặc nhiều hơn service LDAP với mục đích chia sẻ chung nội dung dữ liệu được lưu trữ trong LDAP và giữ cho nội dung lưu trữ được đồng bộ, từ đó có thể cải thiện hiệu năng đọc (có nhiều node cho phép đọc dữ liệu từ LDAP, như master node, các replicate node).

Mô hình thông thường bao gồm 1 node master (Master DAS (Directory Server Agent) hoặc node provider). Node sẽ chịu trách nhiệm duy trì phiên bản dữ liệu chuẩn nhất của dịch vụ thư mục.

Bên cạnh master node là 1 hoặc nhiều shadow server (có thể gọi là consumer, replica, slave). các shadow server giữ dữ liệu của master server. Người dùng có thể kết nối vào shadow server để thực hiện search thông tin cây (DIT)
    
![](https://i.imgur.com/E6kK6CO.png)

## Mô hình

![](https://i.imgur.com/tXFuRPr.png)

## Chuẩn bị
- Cài trên 2 server tương đương với 2 node với cấu hình như sau:
    - <b>Node 1:</b>
    > HostName: ldap-01(Master)
    > CPU: 2 cores
    > Ram: 2Gb
    > Disk: 30Gb
    > Network: eth0: Network access (10.10.10.94)
    - <b>Node 2:</b>
    > HostName: ldap-02(Master)
    > CPU: 2 cores
    > Ram: 2Gb
    > Disk: 30Gb
    > Network: eth0: Network access (10.10.10.96)

----

## Cài đặt

### Cài đặt OpenLdap
- Cài đặt OpenLdap theo hướng dẫn tại đây: [Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-openldap-and-phpldapadmin-on-ubuntu-16-04) | [Windows](https://www.maxcrc.de/userbooster/)

----

### Tại Node Master
- Bước 1: Kích hoạt <b><i>module syncprov</i></b>
```ssh
echo '
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la' > mod_syncprov.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module,cn=config"
```
- Bước 2: Cho phép <b><i>module syncprov</i></b> hoạt động trên DB LDAP
```ssh
echo '
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100' > syncprov.ldif

ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"
```
----

### Tại Node Slave
- Bước 1: Thiết lập <b><i>module syncrepl</i></b>

```ssh
cat <<EOF > syncrepl.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://10.10.10.94:389/
  bindmethod=simple
  binddn="cn=Manager,dc=nhanhoa,dc=local"
  credentials=Cloud365a@123
  searchbase="dc=nhanhoa,dc=local"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 5 300 3"
  interval=00:00:05:00
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f syncrepl.ldif 
```
Kết quả:
```ssh
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
```

<b><u>Lưu ý:</u></b>
    - ```provider```: Địa chỉ và port tới dịch vụ thư mục LDAP Master
    - ```bìndmethod```: Loại xác thực
    - ```binddn```: DN tài khoản xác thực
    - ```credentials```: Mật khẩu tài khoản xác thực
    - ```searchbase```: Đồng bộ các Entry theo filter
    - ```type```: Phương thức đồng bộ
    
----

## Kiểm tra

### Bổ sung Entry mới vào Node Master
Thêm mới ou
```ssh
echo '
dn: ou=Tests,dc=nhanhoa,dc=local
ou: Tests
objectclass: organizationalUnit' > test_structure.ldif

ldapadd -x -D cn=Manager,dc=nhanhoa,dc=local -W -f test_structure.ldif
```
Kết quả:
```ssh
adding new entry "ou=Tests,dc=nhanhoa,dc=local"
```

Bổ sung user
```ssh
echo '
dn: cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba@test.com
userPassword:: b3BlbnN0YWNr
cn: thanhbaba
sn: thanhbaba' > user_test_thanhbaba.ldif

ldapadd -x -D cn=Manager,dc=nhanhoa,dc=local -W -f user_test_thanhbaba.ldif
```
Kết quả
```ssh
adding new entry "cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local"
```

### Kiểm tra lại Slave
```ssh
ldapsearch -x -h 10.10.10.96 -b "dc=nhanhoa,dc=local" -s sub "(objectclass=person)"
```
Kết quả
```ssh
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (objectclass=person)
# requesting: ALL
#

# thanhbaba, Tests, nhanhoa.local
dn: cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba@test.com
cn: thanhbaba
sn: thanhbaba

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```

### Tắt node Master, kiểm tra lại node Slave
Tại node Master
```ssh
[root@ldap_94 ~]# init 0
```
Tại node Slave
```ssh
ldapsearch -x -h 10.10.10.96 -b "dc=nhanhoa,dc=local" -s sub "(objectclass=person)"
```
Kết quả
```ssh
# extended LDIF
#
# LDAPv3
# base <dc=nhanhoa,dc=local> with scope subtree
# filter: (objectclass=person)
# requesting: ALL
#

# thanhbaba, Tests, nhanhoa.local
dn: cn=thanhbaba,ou=Tests,dc=nhanhoa,dc=local
objectClass: person
objectClass: inetOrgPerson
mail: thanhbaba@test.com
cn: thanhbaba
sn: thanhbaba

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```
<b><u>Lưu ý:</u></b> Với mô hình LDAP Master-Slave chỉ có thể ghi duy nhất tại Master, tại node Slave dữ liệu chỉ có thể đọc, không thể ghi

----

## Tổng kết
Như vậy ngoài mô hình LDAP master-master thì trong bài viết này mình đã triển khai mô hình LDAP master-slave. Ở bài viết tiếp theo mình sẽ hướng dẫn cách cấu hình LDAP với keepalive để tăng khả năng chịu lỗi của hệ thống.

---

## Tài liệu tham khảo
https://www.server-world.info/en/note?os=CentOS_7&p=openldap&f=5

