【OpenLDAP】今あるLDAPサーバーのレプリケーションサーバーをササッと作る

# なにこれ
- OpenLDAPのサーバーがある
- 冗長化のためにレプリケーションサーバーを立てたくなる

## 出来ること
- ササッと脳死でLDAPレプリケーション環境が立つ
- schema? 何も考えないで脳死コピー出来る
- *OpenLDAP完全に理解したおじさん*になれる

## 環境
- Ubuntu:18.04
- OpenLDAP: 2.4.42
    - ```slapd.conf```が無い程度に新しいやつですあしからず。
        - 古いopenldapの人は早く更新してください。
- マルチマスターではなく、簡単なマスター・スレーブ構成。

## 注意
- 用語の解説などはしません。
- とんでもなくササッとやりたい人がコピペする用だと思って下さい。

# 手順
## 1. マスターのサーバーでレプリケーションする準備を整える


### ldifを書く
- コピペする。パラメーターはウチの場合。アテにはしないように。
- ```olcDatabase={1}hdb,cn=config```の部分に関して
    - DBがhdbじゃない人、微妙に数字が違う人も居ると思う。適宜変更。

#### モジュール読み込み部分
```ldif:mod_syncprov.ldif
n: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la

```

ldapaddで導入する。

```bash:~/
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif 
```


#### モジュールの使用を宣言する部分

```ldif:add_sync.ldif
dn: olcOverlay={0}syncprov,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: {0}syncprov
olcSpCheckpoint: 20 10
olcSpSessionlog: 100
structuralObjectClass: olcSyncProvConfig

```

ldapaddで導入する。

```bash:~/
ldapadd -Y EXTERNAL -H ldapi:/// -f add_sync.ldif
```


## 2. マスターのサーバーからconfigをぶっこ抜く
マスターのLDAPサーバーのコンフィグをぶっこ抜いて、スレーブサーバー用に一部改変する。

```bash:~/
slapcat -b cn=config > ldap_config_bak.ldif
```


### 主な改変ポイント

- ```dn: olcOverlay={0}syncprov,olcDatabase={1}hdb,cn=config```
    - さっき入れたばっかだけど消しとく。
- ```dn: cn=config```以下の```olcTLSCertificateFile, olcTLSCertificateKeyFile```
    - スレーブ側の正しい証明書のパスに変えとく


改変した```ldap_config_bak.ldif```は何らかの手段で新しいスレーブサーバーに転送する。

## 3. スレーブのサーバーを構築する
基本的なサーバーの初期設定は当然済ませておく。


### 3.1 依存系・slapdのインストール
```
# apt-get install slapd ssl-cert
# dpkg-reconfigure slapd
```
- dpkg-configureで求められるパスワードは空文字で。どうせ上書きするからなんでも良いです。
- データベースの種類のみ、必ず**マスターサーバーと揃える。**


### 3.2 /etc/default
`/etc/default/ldap.conf`をマスターのサーバーと同じ内容にしておく。


### 3.3 ldap_config_bak.ldifを打ち込む

#### 3.3.1 初期データの削除
新しいldap1上で、まずはslapdを止める。

```bash:~/
service slapd stop
```

自動生成されるslapd.dを削除し、新しく作ってパーミッションを直しとく

```bash:~/
rm -fr /etc/ldap/slapd.d
mkdir -m 700 /etc/ldap/slapd.d
chown openldap:openldap /etc/ldap/slapd.d
```

DBの削除 もともと入ってるDB_CONFIGというファイルを再利用したいので退避させて使う。

```bash:~/
cd /var/lib
mv ldap ldap.bak
mkdir ldap
cp ldap.bak/DB_CONFIG ldap/
chown -R openldap:openldap ldap
rm -fr ldap.bak
```

#### 3.3.1 持ってきたConfigをインポートする。
さっき持ってきたldifファイルをインポートする。
configのldifのみ。

```
# slapadd -n0 -F /etc/ldap/slapd.d -l ldap-config-bak.ldif 
```


最後に再度パーミッションをオーナを変更

```
# chown -R openldap:openldap /etc/ldap/slapd.d

# chown -R openldap:openldap /var/lib/ldap
```

## 3.4 スレーブサーバーにレプリケーションの設定を仕込む。

以下のファイルを作成する。
パラメーターはアテにしないで欲しいですが、とりあえずうちでは問題なく動いています。 もっとちゃんとしたドキュメントを参考に、環境にあわせてパラメーターを調整してください。


- 注意点
    - `rid=102`の部分は各サーバーで一意になるなんらかの三桁の数。
    - `"cn=admin,dc=example.com"`はレプリケーションに使う、マスター側のレコードにある何らかのユーザー。
        - adminとは別にレプリケーション用のユーザーを別に作成するべき。
   

```ldif:change_sync_2019.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncRepl: rid=102
  provider=ldap://ldap0.example.com:389/
  bindmethod=simple
  binddn="cn=admin,dc=example,dc=com"
  credentials=PASSWORD!!!!!
  searchbase="dc=example,dc=com"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="30 5 300 3"
  interval=00:00:05:00

```

## 3.5
起動して確認する。
マスターサーバーと同じ結果になっていれば成功。
ある程度までのエントリであれば数十秒で終わるはず。

```bash:~/
service slapd start
slapcat
```









# 参考文献
- [How to configure OpenLDAP Master-Slave Replication
](https://www.itzgeek.com/how-tos/linux/configure-openldap-master-slave-replication.html)
- [OpenLDAP : OpenLDAP レプリケーション](https://www.server-world.info/query?os=CentOS_7&p=openldap&f=5)
- [Openldap Quickstart Guide](https://www.openldap.org/doc/admin24/quickstart.html)