CentOS7.0でOpenLDAP構築

CentOS 7.0(RHEL 7.0)にはLDAP機能としてOpenLDAPを内包しています。
CentOS 6.0以降は設定方法が変わり、slapd.confを使わない新しい方法 OLC(On-Line Configuration）となりました。
その結果、取っつきにくくなりました。

redhatカスタマポータルには[ドキュメント](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-Directory_Servers.html)が用意されていますが、これを見ても何から始めたらいいのかわかりません。 :disappointed_relieved: 

fuketchさんがCentOS6.4で[OpenLDAP構築手順](https://fuketch.wordpress.com/2013/09/11/openldap%E3%81%AE%E6%A7%8B%E7%AF%89/)をプログに記載していました。
CentOS 7.0ではファイアウォール／シスログ／サービス等の仕組みが変更されていることから、その手順を参考に新しくCentOS 7.0版のOpenLDAP構築手順を整理してみました。

## 環境
- CentOS 7.0.1406
- OpenLDAP 2.4.39-3

## 前提条件
外部からldap接続する為にfirewalldの設定を変更しておきます。
ldapプロトコル（port:389）を許可します。

```shell-session
[root@jikken2 ~]# firewall-cmd --add-service=ldap --zone=public
success
※ 現在のファイアウォールにldap を追加します。

[root@jikken2 ~]# firewall-cmd --add-service=ldap --zone=public --permanent
success
※ 永続化設定のファイアウォールにldap を追加します。

[root@jikken2 ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client ldap ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

```
## OpenLDAPインストール

OpenLDAPのパッケージのインストールします。

```shell-session
[root@jikken2 ~]# yum -y install openldap openldap-clients openldap-servers
      :中略
完了しました!
```
Berkeley DBのDB設定ファイルをサンプルからコピーします。

```shell-session
[root@jikken2 ~]# cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
```

サーバ起動時にslapdサービスを自動起動するようにします。

```shell-session
[root@jikken2 ~]# systemctl enable  slapd
```

slapdサービスを起動します。

```shell-session
[root@jikken2 ~]# systemctl start  slapd
```

## slapd.dディレクトリの内容

OLCではslapd.confファイルの代わりに /etc/openldap/slapd.d 配下にあるldifファイルが設定内容となります。
ldifファイルを直接編集することは推奨されていません。オンラインでslapdが書き換えます。
各lidfファイルにはCRCで誤り検出の値が記載されている為、設定内容だけ書き換えてもslapd起動時にエラーとなります。
CRC値を削除してしまえば直接編集することは可能ですが。。。

```shell-session
[root@jikken2 ~]# cd /etc/openldap/slapd.d/
[root@jikken2 slapd.d]# ll
合計 8
drwxr-x---. 3 ldap ldap 4096  1月  4 10:19 cn=config
-rw-------. 1 ldap ldap  604  1月  4 11:15 cn=config.ldif
※ cn=config.ldif はグローバル設定のファイルです。

[root@jikken2 slapd.d]# cat cn\=config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 49cdd986  ⇚ CRC
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
             ：（中略）

[root@jikken2 slapd.d]# ll cn=config
合計 20
drwxr-x---. 2 ldap ldap  28  1月  4 09:52 cn=schema
-rw-------. 1 ldap ldap 378  1月  4 09:52 cn=schema.ldif
-rw-------. 1 ldap ldap 408  1月  4 09:52 olcDatabase={-1}frontend.ldif
-rw-------. 1 ldap ldap 580  1月  4 10:05 olcDatabase={0}config.ldif
-rw-------. 1 ldap ldap 561  1月  4 10:19 olcDatabase={1}monitor.ldif
-rw-------. 1 ldap ldap 626  1月  4 10:19 olcDatabase={2}hdb.ldif
※ CentOS7.0からは バックエンドのデータベースがBDBからHDBへ変更されています。
   HDBはBDBの改良版です。ldifファイルがolcDatabase={2}bdb.ldifから
   olcDatabase={2}hdb.ldifへ変更されています。

```
## slapd.dデータの編集
ldapデータを書き換える為の作業用ldifファイルを置く、作業用ディレクトリを作成します。

```shell-session
[root@jikken2 slapd.d]# cd ~
[root@jikken2 ~]# mkdir ./ldap_work
```

各パスワードへ設定するハッシュ値を生成します。元の平文パスワードは"secret"です。
ソルト付きSHAなので毎回生成される値は異なります。

```shell-session
[root@jikken2 ~]# slappasswd
New password:
Re-enter new password:
{SSHA}+SB7Dp2OD5Yt1/j+JVqPd5sHwGeEE1Yv
```

ネットワーク経由でRootユーザでアクセスする為にconfigデータベースのRootユーザのパスワードを変更します。
ここではパスワードsecretを平文で登録します。本来はslappasswdコマンドでハッシュ値を生成して登録すべきです。

```shell-session
[root@jikken2 ~]# vi ./ldap_work/add_rootPw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}+SB7Dp2OD5Yt1/j+JVqPd5sHwGeEE1Yv
```

ldapaddコマンドで、add_rootPw.ldifの内容と登録します。


```shell-session
[root@jikken2 ~]# ldapadd -Y EXTERNAL -H ldapi:// -f ./ldap_work/add_rootPw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

※ -Y EXTERNALとをつけることでローカル環境からパスワード無しでコマンドを実行できます。
```

## LDAPベースエントリの変更

インストール直後のBDBのベースDNはmy-domain,dc=comとなっています。
それを dc=example,dc=com へ変更します。

```shell-session
[root@jikken2 ~]#  vi ./ldap_work/change-domain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" 
  read by dn.base="cn=Manager,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}+SB7Dp2OD5Yt1/j+JVqPd5sHwGeEE1Yv


[root@jikken2 ~]# ldapmodify -x -D cn=config -w secret -f ./ldap_work/change-domain.ldif
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"

```

ベースエントリを登録します。

```shell-session
[root@jikken2 ~]# vi ./ldap_work/base.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

[root@jikken2 ~]# ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret -f ./ldap_work/base.ldif
```

## ログファイルの参照
ログファイルを参照します。
従来は tailコマンドでしたが、CentOS 7.0からは journalコマンドで参照します。

```shell-session
[root@jikken2 ~]# journalctl -u slapd  -f
-- Logs begin at 日 2015-01-04 11:38:41 JST. --
 1月 04 18:02:07 jikken2 slapd[5616]: conn=1013 op=0 RESULT tag=97 err=0 text=
 1月 04 18:02:07 jikken2 slapd[5616]: conn=1013 op=1 MOD dn="cn=config"
      :（中略）
```

デフォルトのログレベルはstats(256)です。
ログレベル変更はグローバルコンフィグエントリのolcLogLevelを書き換えます。
ログレベルを0に変更して一切ログが出力されないようにします。
他の値に変更する場合は下記を参照してください。
http://www.openldap.org/doc/admin24/slapdconf2.html

短いldifなので標準入力から直接投入します。

```shell-session
[root@jikken2 ~]# ldapmodify -x -D cn=config -w secret <<EOF
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: 0
EOF
```

２回目以降の書き換えはreplaceなので次のように実行します。

```shell-session
[root@jikken2 ~]# ldapmodify -x -D cn=config -w secret <<EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: 0
EOF
```

## 外部ホストから接続
ファイアウォールで389ポートをアクセス許可したので外部ホストのLDAPクライアントからアクセスすることが可能です。
今回はWindowsクライントのLDAP GUIツール JXplorerからアクセスしてみます。

* cn=configへのアクセス

![jxplorer1.PNG](https://qiita-image-store.s3.amazonaws.com/0/64720/6c2ed585-bd35-8093-8321-e6156c174c2d.png)

![jxplorer2.PNG](https://qiita-image-store.s3.amazonaws.com/0/64720/02ff4728-84bd-0cad-ba0b-8567bb780735.png)

JXplorerは空値の属性も列挙されているので、ldifで変更するよりも容易です。

* ベースエントリ dc=example,dc=comへのアクセス

![jxplorer3.PNG](https://qiita-image-store.s3.amazonaws.com/0/64720/2cb4a7cd-c35b-bb9d-b281-a975f25f15df.png)

![jxplorer4.PNG](https://qiita-image-store.s3.amazonaws.com/0/64720/0b0d5b88-94c9-1d00-1646-e0b030899254.png)


## 参考サイト
* [Blog on fuketch.net OpenLDAPの構築]
(https://fuketch.wordpress.com/2013/09/11/openldap%E3%81%AE%E6%A7%8B%E7%AF%89/)