openldap 2.4 でldapサーバーを構築する時のtips

# よく使うコマンド

### config確認

```
$ ldapsearch -L -Y EXTERNAL -H ldapi:/// -b cn=config dn

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
version: 1

#
# LDAPv3
# base <cn=config> with scope subtree
# filter: (objectclass=*)
# requesting: dn
#

# config
dn: cn=config

# schema, config
dn: cn=schema,cn=config

# {0}core, schema, config
dn: cn={0}core,cn=schema,cn=config

# {-1}frontend, config
dn: olcDatabase={-1}frontend,cn=config

# {0}config, config
dn: olcDatabase={0}config,cn=config

# {1}monitor, config
dn: olcDatabase={1}monitor,cn=config

# {2}hdb, config
dn: olcDatabase={2}hdb,cn=config

# search result

# numResponses: 8
# numEntries: 7
```

### データベースの確認

`olcDatabase={2}hdb,cn=config` の部分は、サーバーによって違うかもしれないので、configで確認する。

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'olcDatabase={2}hdb,cn=config'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcSuffix: dc=hogehoge,dc=or,dc=jp
olcRootDN: cn=Manager,dc=hogehoge,dc=or,dc=jp
olcRootPW: {SSHA}-----------------------
```

### 登録データの確認

```
# ldapsearch -H ldapi:/// -b 'ou=****, dc=***, dc=***'
```

# 全体の管理

ldifを実行する時には、`ldapadd -f /path/to/file.ldif` が基本。
ldapサーバー上のrootアカウントで作業をする時は、`-Y EXTERNAL` オプションをつけてパスワード入力をスキップできる。
`-H ldapi:///`だと、ローカルサーバに対して操作。
`$ ldapadd -Y EXTERNAL -H ldapi:/// -f /path/tofile.ldif`
のように実行できる。

### ldapサーバー(全体)の管理者のパスワードを変更する

`{SSHA}abcdefgabcdefgabcdefg` は slappasswd コマンドで用意しておく。

```ldif:hogehoge.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}abcdefgabcdefgabcdefgabcdefgabcdefg
```

### ベースDNを変更する

configで確認した {2}hdb に設定する場合。

```ldif:hogehoge.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=hogehoge,dc=or,dc=jp
```

### データベース管理者のDNを変更する

`cn=Manager,dc=hogehoge,dc=or,dc=jp'にする場合。

```ldif:hogehoge.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=hogehoge,dc=or,dc=jp
```


### データベース管理者のパスワードを変更する

`{SSHA}abcdefgabcdefgabcdefg` は slappasswd コマンドで用意しておく。

```ldif:hogehoge.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}abcdefgabcdefgabcdefg
```


# データベースの管理

これは、データベース管理者の権限で実行する必要があるので、`-D "cn=Manager,dc=hogehogee,dc=or,dc=jp" -W `をつけてldapaddを実行する。
(ダブルクオートの中は、データベース管理者のDN)

```
# ldapadd -H ldapi:/// -D "cn=Manager,dc=hogehoge,dc=or,dc=jp" -W -f /path/to/hogehoge.ldif
```

### トップ組織を作成する

```ldif:hogehoge.ldif
dn: dc=hogehoge,dc=or,dc=jp
objectClass: dcObject
objectClass: organization
dc: hogehoge
o: 組織名
```

### ユニットを作成する

peopleというユニットを作成する場合。

```ldif:hogehoge.ldif
dn: ou=people,dc=hogehoge,dc=or,dc=jp
objectClass: organizationalUnit
ou: people
```

# スキーマの管理

### 使えるスキーマの一覧

dnを指定してdnのみ表示させると見やすい。

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
(snip)
dn: cn=schema,cn=config

dn: cn={0}core,cn=schema,cn=config
```

### スキーマファイルからldifへの変換

参考 : [OpenLDAP Server 日本語訳](https://qiita.com/JhonnyBravo/items/b18341b4cf20b9d865e4) 

管理のためには、`/etc/openldap/schema/` ディレクトリの中に、.schemaと.ldifを保存しておくのが良いと思われる。

### スキーマの追加

```
ldapadd -H ldapi:/// -Y EXTERNAL -f /etc/openldap/schema/SOMETYPE.ldif
```
.schemaから.ldifに変換する時に必要だったldifファイルも追加しておくこと。
(例えば、inetOrgPersonを継承したクラスだったら、あらかじめinetOrgPersonスキーマを追加しておく。inetOrgPersonスキーマを追加するには、あらかじめcosineスキーマを追加しておく。)


# ユーザーデータの管理

### ldifファイルを使ってユーザーの追加

データベース管理者の権限で実行する

```
# ldapadd -H ldapi:/// -D "cn=Manager,dc=hogehoge,dc=or,dc=jp" -W -f /path/to/file.ldif
```

# CentOS 7.6 にインストールする方法

```
# yum install openldap openldap-servers openldap-clients

# systemctl start slapd

# systemctl enable slapd
```