CentOS Stream9にLDAP(389 Directory Server)を導入する

LDAPでアカウント管理を検証するためにまずはLDAPサーバを導入してみる。

```bash:導入先OSバージョン
$ uname -a
Linux centos9-1 5.14.0-319.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu May 25 19:53:58 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
```
```bash:389-ds-baseパッケージのインストール
$ sudo dnf install -y 389-ds-base
```
# インスタンス定義の作成
[slapd]セクションでinstance_nameが定義されていない場合、localhostが適用される。インスタンスが作成されオブジェクト検索ができることをテストするためにサンプルも合わせて作成することにする(sample_entries = yes)。
```bash:インスタンス定義を作成する
$ tee instance.inf<<EOF
[general]
config_version = 2

[slapd]
root_password = YOUR_ADMIN_PASSWORD_HERE

[backend-userroot]
sample_entries = yes
suffix = dc=example,dc=jp
```
# LDAPインスタンスを作成する
```bash:インスタンス作成
$ sudo dscreate from-file instance.inf 
Starting installation ...
Validate installation settings ...
Create file system structures ...
Create self-signed certificate database ...
Perform SELinux labeling ...
Create database backend: dc=example,dc=jp ...
Perform post-installation tasks ...
Completed installation for instance: slapd-localhost
```
# インスタンス起動状態を確認する
Activeがactive (running)にと出力されている事をが確認できた。
```bash:サービス状態確認
$ systemctl status dirsrv@localhost
● dirsrv@localhost.service - 389 Directory Server localhost.
     Loaded: loaded (/usr/lib/systemd/system/dirsrv@.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/dirsrv@.service.d
             └─custom.conf
     Active: active (running) since Thu 2023-08-31 04:43:10 JST; 16min ago
    Process: 20384 ExecStartPre=/usr/libexec/dirsrv/ds_systemd_ask_password_acl /etc/dirsrv/slapd-localhost/dse.ldif (code=exited, status=0/SUCCESS)
    Process: 20389 ExecStartPre=/usr/libexec/dirsrv/ds_selinux_restorecon.sh /etc/dirsrv/slapd-localhost/dse.ldif (code=exited, status=0/SUCCESS)
   Main PID: 20394 (ns-slapd)
     Status: "slapd started: Ready to process requests"
      Tasks: 29 (limit: 48922)
     Memory: 130.7M
        CPU: 2.804s
     CGroup: /system.slice/system-dirsrv.slice/dirsrv@localhost.service
             └─20394 /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-localhost -i /run/dirsrv/slapd-localhost.pid
```
# オブジェクト検索のテスト
インスタンス作成時に合わせて作成したサンプルオブジェクトが色々と出力されているので導入できたようだ。
```bash:サンプルエントリー出力
$ ldapsearch -x -LLL
dn: dc=example,dc=jp
objectClass: top
objectClass: domain
dc: example
description: dc=example,dc=jp

dn: ou=groups,dc=example,dc=jp
objectClass: top
objectClass: organizationalunit
ou: groups

dn: ou=people,dc=example,dc=jp
objectClass: top
objectClass: organizationalunit
ou: people

dn: ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: organizationalunit
ou: permissions

dn: ou=services,dc=example,dc=jp
objectClass: top
objectClass: organizationalunit
ou: services

dn: uid=demo_user,ou=people,dc=example,dc=jp
objectClass: top
objectClass: nsPerson
objectClass: nsAccount
objectClass: nsOrgPerson
objectClass: posixAccount
uid: demo_user
cn: Demo User
displayName: Demo User
legalName: Demo User Name
uidNumber: 99998
gidNumber: 99998
homeDirectory: /var/empty
loginShell: /bin/false

dn: cn=demo_group,ou=Groups,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: posixGroup
objectClass: nsMemberOf
cn: demo_group
gidNumber: 99999

dn: cn=group_admin,ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: nsMemberOf
cn: group_admin

dn: cn=group_modify,ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: nsMemberOf
cn: group_modify

dn: cn=user_admin,ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: nsMemberOf
cn: user_admin

dn: cn=user_modify,ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: nsMemberOf
cn: user_modify

dn: cn=user_passwd_reset,ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: nsMemberOf
cn: user_passwd_reset

dn: cn=user_private_read,ou=permissions,dc=example,dc=jp
objectClass: top
objectClass: groupOfNames
objectClass: nsMemberOf
cn: user_private_read
```
# 確認が終わったインスタンスを削除してみる
```bash:インスタンス削除
$ sudo dsctl localhost remove --do-it
Removing instance ...
Completed instance removal
```
# 削除後のインスタンス起動状態を確認してみる
Activeがinactive (dead)となっているので、インスタンスは停止され削除されているようだ。
```bash:サービス状態確認
$ systemctl status dirsrv@localhost
○ dirsrv@localhost.service - 389 Directory Server localhost.
     Loaded: loaded (/usr/lib/systemd/system/dirsrv@.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/dirsrv@.service.d
             └─custom.conf
     Active: inactive (dead)
$ 
```
インスタンス名を指定したインスタンス定義を作成してみる
[slapd]セクションにinstance_nameを定義することで任意のインスタンス名を指定できる。
```bash:インスタンス名定義
$ tee instance.inf<<EOF
[general]
config_version = 2

[slapd]
instance_name = ldap1instance
root_password = YOUR_ADMIN_PASSWORD_HERE

[backend-userroot]
sample_entries = yes
suffix = dc=example,dc=jp
```
# LDAPインスタンスを再度作成してみる
インスタンス名が「slapd-」とinstance_nameで指定した文字列「ldap1instance」で構成されるようだ。
```bash
$ sudo dscreate from-file instance.inf 
Starting installation ...
Validate installation settings ...
Create file system structures ...
Create self-signed certificate database ...
Perform SELinux labeling ...
Create database backend: dc=example,dc=jp ...
Perform post-installation tasks ...
Completed installation for instance: slapd-ldap1instance
$ 
```
# インスタンス起動状態を確認する
Active: active (running)であることを確認できた。
```
$ systemctl status dirsrv@ldap1instance
● dirsrv@ldap1instance.service - 389 Directory Server ldap1instance.
     Loaded: loaded (/usr/lib/systemd/system/dirsrv@.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/dirsrv@.service.d
             └─custom.conf
     Active: active (running) since Thu 2023-08-31 05:17:26 JST; 53s ago
    Process: 21063 ExecStartPre=/usr/libexec/dirsrv/ds_systemd_ask_password_acl /etc/dirsrv/slapd-ldap1instance/dse.ldif (code=exited, status=0/SUCCESS)
    Process: 21068 ExecStartPre=/usr/libexec/dirsrv/ds_selinux_restorecon.sh /etc/dirsrv/slapd-ldap1instance/dse.ldif (code=exited, status=0/SUCCESS)
   Main PID: 21073 (ns-slapd)
     Status: "slapd started: Ready to process requests"
      Tasks: 29 (limit: 48922)
     Memory: 117.4M
        CPU: 515ms
     CGroup: /system.slice/system-dirsrv.slice/dirsrv@ldap1instance.service
             └─21073 /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-ldap1instance -i /run/dirsrv/slapd-ldap1instance.pid
$ 
```