CentOS7 Virtualbox OpenLDAPを構築したみた

# はじめに
業務でOpenLDAPを使用することになり、CentOS7でOpenLDAPを構築してみたため、
記事にしました。

以下のサイトから参考にしております。
https://infracollege.vamdemicsystem.black/linux/

以下のサイトも参考にしました。
https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024

LDAPサーバー側でldap389 ポートを空ける必要があります。

# 構築手順
## 1 LDAPサーバー構築
### SElinuxを無効にする
```
vi /etc/selinux/config

SELINUX=disabled
```
### 再起動する
```
reboot
```
### OpenLDAPインストールする
```
yum -y install openldap-servers openldap-clients
```

### DB設定ファイルをセット
openldapをインストールした時に自動的に作成されたDB_CONFIG.example
のデータベースをコピーしてldapのデータベースを作成する
```
cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
```
### slapdサービスを起動する
```
systemctl start slapd
systemctl enable slapd
```
### 管理者アカウントのパスワード設定
データベース全体の管理者のパスワードになります。
```
slappasswd
```
※パスワードは暗号化した文字列で生成されます。
同じパスワードでも時間も含めた暗号化アルゴリズムになっているため、暗号化の文字列になりません。

ldifファイル作成 olcRootPWにslappasswdコマンドで出力されたパスワードを入れる
```
vi chrootpw.ldif
```
```
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxx <slappasswd>で出力したパスワードを設定する>
```
ldifファイルをldapに追加する
ldapのデータベースにldifファイルの定義内容を流し込んでいます。
```
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
```
※-Y EXTERNALオプションでrootパスワード入力をスキップ

### 標準スキーマの追加
ユーザーに持たせる属性を定義したものがスキーマです。
ldapをインストールしたらインストールされる標準的なスキーマをldapに登録する。

以下は一般的ななスキーマになります。

以下のサイトに標準スキーマの説明が記載されていたため、引用しました。
https://qiita.com/leomaro7/items/f87fe43e372d48f739b7

```
# COSINEとInternet X.500では必須のスキーマ
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
 
# UNIXアカウントを扱うために使用するスキーマ
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
 
# 組織に関連する人を表すオブジェクトクラスを定義するスキーマ
組織で運用する時によく使われる標準的なスキーマ
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
```
### Managerアカウントパスワード変更
adminアカウントに該当するものです。
```
slappasswd
```
olcRootPW に生成したディレクトリマネージャーのパスワードを指定する
```
vi chdomain.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}**********＜Managerアカウントパスワードを入れる＞

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=example,dc=com" write by * read
```
ldapに上記のldifを登録する
```
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
```

### OU作成

```
vi basedomain.ldif
```

```
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: example
dc: example

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager

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

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group
```
上記のldifをldapに登録する
```
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f basedomain.ldif
```
### ファイアウォールでldapのポートを許可
```
firewall-cmd --add-service=ldap --permanent
firewall-cmd --reload
```

### ユーザー作成
```
slappasswd
```
```
vi ldapuser.ldif
```
```
dn: uid=test,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: test
sn: Linux
userPassword: {SSHA}********<ユーザーのパスワード>
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test
 
dn: cn=system,ou=Group,dc=example,dc=com
objectClass: posixGroup
cn: system
gidNumber: 1000
memberUid: test
```
上記のldifをldapに登録する
```
ldapadd -x -D cn=Manager,dc=example,dc=com -W -f ldapuser.ldif
```

testユーザーがレスポンスでかえってくること
```
ldapsearch -x -b "ou=Group,dc=example,dc=com" cn=system
```

```
# system, Group, example.com
dn: cn=system,ou=Group,dc=example,dc=com
objectClass: posixGroup
cn: system
gidNumber: 1000
memberUid: test

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
```
### ldapsearchを試してみた
-D バインドDN ログインユーザー
-b dc=example,dc=comのobjectclassで検索する。
```
ldapsearch -LLL -x -h localhost -D "cn=Manager,dc=example,dc=com" -w 'パスワード' -b dc=example,dc=com objectclass
```
出力結果
```
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole

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

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

dn: uid=test,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount

dn: cn=system,ou=Group,dc=example,dc=com
objectClass: posixGroup
```
# まとめ
OpenLDAPについて構築することでイメージを付けることが出来ました。
複数の各サーバーでOSユーザーを作成するよりはOpenLDAPでユーザー作成した方が
認証情報が管理出来て手間が少ないです。