OpenLDAP 構築メモ


[0 インストール](#0-インストール)
[1 設定確認](#1-設定確認)
[2 基本的なスキーマの追加](#2-基本的なスキーマの追加)
　[2.1 追加方法](#21-追加方法)
　[2.2 確認方法](#22-確認方法)
[3 パスワードポリシの追加](#3-パスワードポリシの追加)
　[3.1 スキーマの追加](#31-スキーマの追加)
　[3.2 確認方法](#32-確認方法)
[4 サーバ管理者パスワード設定](#4-サーバ管理者パスワード設定)
　[4.1 ファイル保存ディレクトリの作成](#41-ファイル保存ディレクトリの作成)
　[4.2 パスワードハッシュ値の生成](#42-パスワードハッシュ値の生成)
　[4.3 ファイルの作成](#43-ファイルの作成)
　[4.4 追加](#44-追加)
　[4.5 確認](#45-確認)
　[4.6 変更方法](#46-変更方法)
　　[4.6.1 パスワードハッシュ値の生成](#461-パスワードハッシュ値の生成)
　　[4.6.2 ファイルの作成](#462-ファイルの作成)
　　[4.6.3 確認](#463-確認)
[5 データ用ディレクトリの設定](#5-データ用ディレクトリの設定)
　[5.1 現在の設定確認](#51-現在の設定確認)
　[5.2 設定の変更（初期設定）](#52-設定の変更初期設定)
　　[5.2.1 ファイルの準備](#521-ファイルの準備)
　　[5.2.2 実行](#522-実行)
　　[5.2.3 変更後の設定確認](#523-変更後の設定確認)
　[5.3 設定の変更（ドメイン名の変更）](#53-設定の変更ドメイン名の変更)
　　[5.3.1 ファイルの準備](#531-ファイルの準備)
　　[5.3.2 実行](#532-実行)
　　[5.3.3 ドメイン変更後の設定確認](#533-ドメイン変更後の設定確認)
[6 基本組織・ユーザアカウントを管理する組織・グループを管理する組織の登録](#6-基本組織ユーザアカウントを管理する組織グループを管理する組織の登録)
　[6.1 ファイルの準備](#61-ファイルの準備)
　[6.2 登録](#62-登録)
　[6.3 確認](#63-確認)
[7 ネットワークの設定](#7-ネットワークの設定)
　[7.1 IPv4の設定](#71-ipv4の設定)
　[7.2 Firewallの設定](#72-firewallの設定)
　[7.3 ホスト名の設定](#73-ホスト名の設定)
　[7.4 簡易名前解決](#74-簡易名前解決)
　[7.5 暗号化](#75-暗号化)
　[7.6 クライアントマシンの設定](#76-クライアントマシンの設定)
[8 ユーザの追加方法](#8-ユーザの追加方法)
　[8.1 UNIXコマンドの実行](#81-unixコマンドの実行)
　[8.2 ファイルの準備](#82-ファイルの準備)
　[8.3 LDAPディレクトリへの追加](#83-ldapディレクトリへの追加)
　[8.4 ユーザパスワードの修正方法](#84-ユーザパスワードの修正方法)
　　[8.4.1 ファイルの準備](#841-ファイルの準備)
　　[8.4.2 実行](#842-実行)
　[8.5 ユーザパスワードを強制的に変更させる方法](#85-ユーザパスワードを強制的に変更させる方法)
　　[8.5.1 ファイルの準備](#851-ファイルの準備)
　　[8.5.2 実行](#852-実行)
[9 グループの追加](#9-グループの追加)
　[9.1 ファイルの準備](#91-ファイルの準備)
　[9.2 実行](#92-実行)
[10 パスワードポリシモジュールのロード](#10-パスワードポリシモジュールのロード)
　[10.1 パスワード用のorganizationalUnitの追加](#101-パスワード用のorganizationalunitの追加)
　[10.2 パスワードモジュールの追加](#102-パスワードモジュールの追加)
　[10.3 パスワードモジュールが追加されたかの確認](#103-パスワードモジュールが追加されたかの確認)
　[10.4 オーバレイの追加](#104-オーバレイの追加)
　　[10.4.1 データベース確認](#1041-データベース確認)
　　[10.4.2 ファイルの準備](#1042-ファイルの準備)
　　[10.4.3 オーバーレイ追加](#1043-オーバーレイ追加)
　[10.5 パスワードポリシの投入](#105-パスワードポリシの投入)
　　[10.5.1 内容の確認](#1051-内容の確認)
　　[10.5.2 ファイルの準備](#1052-ファイルの準備)
　　[10.5.3 実行](#1053-実行)
　　[10.5.4 確認](#1054-確認)
　　[10.5.5 設定変更](#1055-設定変更)
　　[10.5.6 パスワードポリシのテスト](#1056-パスワードポリシのテスト)
[11 パスワードロックの解除](#11-パスワードロックの解除)
　[11.1 ファイル](#111-ファイル)
　[11.2 解除方法](#112-解除方法)
[12 ファイルディスクリプタの上限を編集](#12-ファイルディスクリプタの上限を編集)
　[12.1 現在の設定確認](#121-現在の設定確認)
　[12.2 設定の変更](#122-設定の変更)
　[12.3 設定が反映されたかの確認](#123-設定が反映されたかの確認)
[13 ログローテートの設定](#13-ログローテートの設定)
　[13.1 rsyslog.confの編集](#131-rsyslogconfの編集)
　[13.2 rsyslogサービスの再起動](#132-rsyslogサービスの再起動)
　[13.3 logrotateの設定にslapdを追加](#133-logrotateの設定にslapdを追加)
[14 SELinuxの設定](#14-selinuxの設定)
[15 便利なコマンド](#15-便利なコマンド)
[16 参考情報](#16-参考情報)

目標：
セキュアな LDAP サーバを立てて、クライアントマシンからサーバの LDAP エントリを確認してみる。

ドメイン：intrajp-test.org, intrajp-test2.org
LDAPサーバ：ldap.intrajp-test.org
管理者：Manager
テスト用のLDAPクライアント：client.intrajp-test.org
構築環境：VirtualBox
ネットワーク：内部ネットワーク（172.30.1.0/24）
複数のユーザおよびそのグループを追加できること。
SELinux はセキュリティ向上のために有効にしておくこと。
ちなみに、OpenLDAP が提供する ldif ファイルは、/etc/openldap/schema に存在する。
注意事項：ldif ファイルの末尾にスペースが混入しているとエラーとなり、原因がわかりにくいので、投入前はよく確認すること。


# 0 インストール

```bash shell
# yum install openldap openldap-servers openldap-clients
# cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown ldap:ldap /var/lib/ldap/DB_CONFIG
# systemctl start slapd
# systemctl enable slapd
```

# 1 設定確認

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
（インストール直後の表示）
dn: cn=config
dn: cn={0}core,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}hdb,cn=config
```

# 2 基本的なスキーマの追加

## 2.1 追加方法

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
```
## 2.2 確認方法

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
（表示）
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
```

# 3 パスワードポリシの追加

## 3.1 スキーマの追加

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
```

## 3.2 確認方法

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
（表示）
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: cn={4}ppolicy,cn=schema,cn=config
```

# 4 サーバ管理者パスワード設定

## 4.1 ファイル保存ディレクトリの作成

```
# mkdir /root/ldif
```

## 4.2 パスワードハッシュ値の生成

```
# slappasswd
```

（出力されたハッシュ文字列をメモる）

## 4.3 ファイルの作成

注意：末尾に空白が含まれているとエラーになるのでよく確認すること。

```
# vim /root/ldif/ldaprootpasswd.ldif
====
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: <slappasswd により出力されたハッシュ文字列>
====
```

## 4.4 追加

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldif/ldaprootpasswd.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"

## 4.5 確認

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcRootPW
```

## 4.6 変更方法
### 4.6.1 パスワードハッシュ値の生成

```
# slappasswd
```

（出力されたハッシュ文字列をメモる）
### 4.6.2 ファイルの作成

```
# vim /root/ldif/ldaprootpasswd-replace.ldif
====
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: <slappasswd により出力されたハッシュ文字列>
====
```
### 4.6.3 確認

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcRootPW
```

# 5 データ用ディレクトリの設定
## 5.1 現在の設定確認

```
# ldapsearch -LLL -Y EXTERNAL -H Ldapi:/// -b 'olcDatabase={2}hdb,cn=config'
```

（表示）
dn: olcDatabase={2}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub

## 5.2 設定の変更（初期設定）

### 5.2.1 ファイルの準備

```
# vim /root/ldif/ldapdomain.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=intrajp-test,dc=org" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=intrajp-test,dc=org

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=intrajp-test,dc=org

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: <slappasswd により出力されたハッシュ文字列>

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="Manager,dc=intrajp-test,dc=org" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=intrajp-test,dc=org" write by * read
```

### 5.2.2 実行

```
# ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/ldif/ldapdomain.ldif
```

### 5.2.3 変更後の設定確認

```
# ldapsearch -LLL -Y EXTERNAL -H Ldapi:/// -b 'olcDatabase={2}hdb,cn=config'
```

（表示）
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=intrajp-test,dc=org
olcRootDN: cn=Manager,dc=intrajp-test,dc=org
olcRootPW: <HASH値>
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=intrajp-test,dc=org" write by anonymous auth by self write by * nonw
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=intrajp-test,dc=org" write by * read

## 5.3 設定の変更（ドメイン名の変更）

intrajp-test2.org に変更してみる。

### 5.3.1 ファイルの準備

```
# vim /root/ldif/ldapdomain-replace.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=intrajp-test2,dc=org" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=intrajp-test2,dc=org

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=intrajp-test2,dc=org

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: <slappasswd により出力されたハッシュ文字列>

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="Manager,dc=intrajp-test,dc=org" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=intrajp-test2,dc=org" write by * read
```

### 5.3.2 実行

```
# ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/ldif/ldapdomain-replace.ldif
```

### 5.3.3 ドメイン変更後の設定確認

（表示）
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=intrajp-test,dc=org
olcRootDN: cn=Manager,dc=intrajp-test2,dc=org
olcRootPW: <HASH値>
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=intrajp-test2,dc=org" write by anonymous auth by self write by * nonw
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=intrajp-test2,dc=org" write by * read

# 6 基本組織・ユーザアカウントを管理する組織・グループを管理する組織の登録
## 6.1 ファイルの準備

```
# vim /root/ldf/baseldapdomain.ldif

dn: dc=intrajp-test2,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: intrajp-test2 org
dc: intrajp-test2

dn: cn=Manager,dc=intrajp-test2,dc=org
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=intrajp-test2,dc=org
objectClass: organizationalUnit
ou: People

dn: ou=Goup,dc=intrajp-test2,dc=org
objectClass: organizationalUnit
ou: Group
```
## 6.2 登録

以下のコマンドで、上記エントリを LDAP ディレクトリに追加する。

```
# ldapadd -x -D cn=Manager,dc=intrajp-test2,dc=org -W -f /root/ldif/baseldapdomain.ldif
```

（表示）
Enter LDAP Password:
adding new entry "dc=intrajp-test2,dc=org"
adding new entry "cn=Manager,dc=intrajp-test2,dc=org"
adding new entry "ou=People,dc=intrajp-test2,dc=org"
adding new entry "ou=Group,dc=intrajp-test2,dc=org"

## 6.3 確認

```
# ldapsearch -x -LLL -b "dc=intrajp-test2,dc=org" "(objectClass=*)"
```

（表示）
dn: dc=intrajp-test2,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: intrajp-test2 org
dc: intrajp-test2

dn: cn=Manager,dc=intrajp-test2,dc=org
objctClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=People,dc=intrajp-test2,dc=org
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=intrajp-test2,dc=org
objectClass: organizationalUnit
ou: Group

# 7 ネットワークの設定

## 7.1 IPv4の設定

```
# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
====
...
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=172.30.1.2
NETMASK=255.255.255.0
...
====
```

```
# systemctl restart network
# ip a
```

IPアドレスが、172.30.1.2 であることを確認する。

## 7.2 Firewallの設定

```
# firewall-cmd --add-service=ldap --permanent
```

## 7.3 ホスト名の設定

```
# hostnamectl set-hostname --static shibbolethidp.intrajp-test2.org
```

一度シャットダウンして、ネットワークを「内部ネットワーク」にして、起動。

## 7.4 簡易名前解決

それぞれのマシンの /etc/hosts にそれぞれのマシン名を設定する。

```
# vim /etc/hosts
====
172.30.1.1 ldap.intrajp-test.org
172.30.1.2 shibbolethidp.intrajp-test2.org
172.30.1.101 client1.intrajp-test.org
====
```

## 7.5 暗号化

サーバで証明書をつくっていく。

秘密鍵作成

```
# cd /etc/pki/tls/certs/
# make ldaps.key
```

<パスワードを2回入力>

```
# openssl rsa -in ldaps.key -out ldaps.key
```

<先程のパスワードを入力>
これで、パスワードが空になった。

```
# ls -lt
```

（表示）
ldaps.key

要求書作成

```
# make ldaps.csr
```

JP
KANAGAWA
YOKOHAMA
Common Name:shibbolethidp.intrajp-test2.org

CSRができているか確認。

```
# ls -lt
```

証明書作成

```
# openssl req -x509 -days 3650 -in ldaps.csr -key ldaps.key -out ldaps.crt
```

証明書ができているか確認。

```
# ls -lt
```

ファイルの移動

```
# mv ldaps.* /etc/openldap/certs
# chown ldap:ldap /etc/openldap/certs/ldaps.*
```
ca-bundle もコピー。

```
# cp /etc/pki/tls/certs/ca-bundle.crt /etc/openldap/certs
```

ファイルの確認

```
# ls -lt /etc/openldap/certs
```
一度 config の確認

```
# ldapsearch -LLL -Y EXTERNAL ldapi:/// -b cn=config
```

設定ファイルの作成

```
# vim /root/ldif/ssl.ldif
```

```
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/certs/ca-bundle.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/ldaps.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/ldaps.key
```

設定

```
# ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/ldif/ssl.ldif
```

（表示）
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"

もし、ここで、以下のようなエラーが出力される場合は、証明書の権限誤りか、Common Name が FQDN になっていない（ここ間違えて、かなりはまった）。また、ca-bundle.crt をコピーするのを忘れると、同様のエラーとなるので注意。
（エラー表示が出力される場合）
ldap_modify: Other (e.g., implementation specific) error (80)


ldaps が使用できるようにする

```
# vim /etc/sysconfig/slapd
```

（変更前）
SLAPD_URLS="ldapi:/// ldap:///"
（変更後）
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"

```
# firewall-cmd --add-service=ldaps --permanent
```

サービス再起動

```
# systemctl restart slapd
```

## 7.6 クライアントマシンの設定

```
# hostnamectl set-hostname client1.intrajp-test.org
# yum install openldap openldap-clients nss-pam-ldapd
```

```
# vim /etc/sysconfig/network-scripts/ifcfg-enp0s3

#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=172.30.1.101
NETMASK=255.255.255.0
```

```
# vim /etc/hosts

172.30.1.1 ldap.intrajp-test.org
172.30.1.2. shibbolethidp.intrajp-test2.org
172.30.1.101 client1.intrajp-test.org
```

クライアントマシンからサーバに ping を打つ。

```
$ ping ldap.intrajp-test.org
$ ping shibbolethidp.intrajp-test2.org
```

```
# systemctl start oddjobd
# systemctl enable oddjobd
```

```
# vim /etc/openldap/ldap.conf
（以下を追加）
====
TLS_REQUEST allow
====
```

```
# authconfig --enableldap --enableldapauth --ldapserver=ldaps://shibbolethidp.intrajp-test2.org --ldapbasedn="dc=intrajp-test2,dc=org" --enablemkhomedir --update
```

上記コマンドにより、/etc/openldap/ldap.conf が編集されている。

```
# shutdown -r now
```

ところで、サーバを変更しても、サーバを停止しても intrajp-user5 ユーザでログインできるのはなぜ？キャッシュを読んでいるからか？

試しに、sssd を無効にしてみたら、ログインできなくなった。
sssd のキャッシュを読んでいるようである。
まあ、元に戻しておこう。

ここに書いてあるとおりに、キャッシュファイルを削除することでも、サーバを停止しておけばログインはできなくなった。
https://www.rootusers.com/how-to-clear-the-sssd-cache-in-linux/

先程、shibbolethidp.intrajp-test2.org サーバを LDAP サーバに設定してそこには intrajp-user5 ユーザが存在しないにもかかわらずクライアントマシンでログインできたのは、sssd のキャッシュを読んでいたからであった。クライアントマシンのキャッシュファイルを全て削除したら、intrajp-user5 ユーザではログインできなくなった。では、LDAP サーバの設定を、元の ldap.intrajp-test.org サーバに戻しておこう。

```
# authconfig --enableldap --enableldapauth --ldapserver=ldaps://ldap.intrajp-test.org --ldapbasedn="dc=intrajp-test,dc=org" --enablemkhomedir --update
```

これで、またクライアントマシンから intrajp-user5 ユーザでログインできるようになった。

# 8 ユーザの追加方法
## 8.1 UNIXコマンドの実行

```
# useradd <ユーザ名>
# passwd <ユーザ名>
# less /etc/passwd | grep <ユーザ名>
```

（uidNumber を覚えておく）

```
# slappasswd
```

（SHAの出力をコピーしておく）

## 8.2 ファイルの準備

```
# vim /root/ldif/ldapuser.ldif
====
dn: uid=<ユーザ名>,ou=People,dc=intrajp-test,dc=org
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: <ユーザ名>
uid: <ユーザ名>
uidNumber: <idナンバー>
gidNumber: <同上>
homeDirectory: /home/<ユーザ名>
userPassword: <コピーしておいたSHA>
loginShell: /bin/bash
gecos: <ユーザ名>
ShadowLastChange: 0
ShadowMax: 0
ShadowWarning: 0
pwdReset: TRUE
====
```

## 8.3 LDAPディレクトリへの追加

```
# ldapadd -x -D cn=Manager,dc=intrajp-test,dc=org -W -f /root/ldif/ldapuser.ldif
```

## 8.4 ユーザパスワードの修正方法
### 8.4.1 ファイルの準備

```
# vim /root/ldif/ldapuser-replace.ldif
====
dn: uid=intrajp-user1,ou=People,dc=intrajp-test,dc=org
changetype: modify
replace: userPassword
userPassword: <slappasswd で出力された文字列>
====
```

### 8.4.2 実行

```
# ldapmodify -x -D cn=Manager,dc=intrajp-test,dc=org -W -f /root/ldif/ldapuser-replace.ldif
```

## 8.5 ユーザパスワードを強制的に変更させる方法
### 8.5.1 ファイルの準備

```
# vim /root/ldif/ldapuser-replace-pwdreset.ldif
====
dn: uid=intrajp-user1,ou=People,dc=intrajp-test,dc=org
changetype: modify
replace: pwdReset
pwdReset: TRUE
====
```

### 8.5.2 実行

```
# ldapmodify -x -D cn=Manager,dc=intrajp-test,dc=org -W -f /root/ldif/ldapuser-replace-pwdreset.ldif
```

# 9 グループの追加
## 9.1 ファイルの準備

```
# vim /root/ldif/ldapgroup.ldif
====
dn: cn=<グループ名>,ou=Group,dc=intrajp-test.dc=org
objectClass: posixGroup
cn: <グループ名>
gidNUMBER: <idナンバー>
====
```

## 9.2 実行

```
# ldapadd -x -D cn=Manager,dc=intrajp-test,dc=org -W -f /root/ldif/ldapgroup.ldif
```

# 10 パスワードポリシモジュールのロード
## 10.1 パスワード用のorganizationalUnitの追加

policies という organaizationalUnit を追加して、そこにパスワードポリシを含ませてみる。


```
# vim /root/ldif/oupolicy.ldif
====
dn: ou=policies,dc=intrajp-test,dc=org
objectClass: top
objectClass: organizationalUnit
ou: policies
description: Password plicy
====
```

```
# ldapadd -x -W -D cn=Manager,dc=intrajp-test,dc=org -f /root/ldif/oupolicy.ldif
```

## 10.2 パスワードモジュールの追加

モジュール追加用LDIFファイル作成

```
# vim /root/ldif/ppolicymodule.ldif
====
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: ppolicy.la
====
```

追加する。

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldif/ppolicymodule.ldif
```

以下も参考にした。
https://kifarunix.com/implement-openldap-password-policies/amp/
https://meddeb.net/pqchecker/

ppolicy.la モジュールが LDAP データベースにロードされているかを確認する。

## 10.3 パスワードモジュールが追加されたかの確認

```
# slapcat -n 0 | grep -i module
```

（表示）
...(snip)...
olcModuleLoad: {0}ppolicy.la
olcModuleLoad: {1}ppolicy
...(snip)...

## 10.4 オーバーレイの追加

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

```
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b  cn=config olcDatabase
```

{2}hdb でいく。

### 10.4.2 ファイルの準備

```
# vim /root/ldif/ppolicyoverlay.ldif
dn: olcOverlay=ppolicy,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=intrajp-test,dc=org
```

### 10.4.3 オーバーレイ追加

```
# ldapadd -Y EXTERNAL -H ldapi:/// -f /root/ldif/ppolicyoverlay.ldif
```

## 10.5 パスワードポリシの投入
### 10.5.1 内容の確認

```
# man slapo-ppolicy
```

ここも参考にすること(pwdMinAge とかの説明がある)。

https://tools.ietf.org/id/draft-behera-ldap-password-policy-10.html

### 10.5.2 ファイルの準備

```
# vim /root/ldif/ppolicy_only.ldif
dn: cn=default,ou=policies,dc=intrajp-test,dc=org
cn: default
objectClass: top
objectClass: device
objectClass: pwdPolicy
objectClass: pwdPolicyChecker
pwdCheckModule: check_password.so
pwdAttribute: userPassword
pwdLockout: TRUE
pwdMaxFailure: 5
pwdLockoutDuration: 300
pwdCheckQuality: 1
pwdMinLength: 8
pwdSafeModify: FALSE
pwdMaxAge: 7776000
pwdExpireWarning: 604800
pwdInHistory: 2
pwdGraceAuthNLimit: 0
pwdMustChange: TRUE
pwdAllowUserChange: TRUE
pwdReset TRUE
```

### 10.5.3 実行

```
# ldapadd -x -W -D cn=Manager,dc=intrajp-test,dc=org -f /root/ldif/ppolicy.ldif
（確認）
```

### 10.5.4 確認

```
# ldapsearch -x -H ldap:/// -D cn=Manager,dc=domain,dc=local -W -b dc=domain,dc=local "(objectClass=pwdPolicy)" -LLL
```

### 10.5.5 設定変更

```
# vim /etc/openldap/check_password.conf
（以下の値に変更）
====
useCracklib 1
minPoints 3
minUpper 1
minLower 1
minDigit 1
minPunct 1
====
```

それぞれの値の意味は以下のとおり。

```
useCracklib : integer. Default value : 1. Set it to 0 to disable cracklib verification. It has no effect if cracklib is not included at compile time.
minPoints : integer. Default value: 3. Minimum number of quality points a new password must have to be accepted. One quality point is awarded for each character class used in the password.
minUpper: integer. Defaut value: 0. Minimum upper characters expected.
minLower: integer. Defaut value: 0. Minimum lower characters expected.
minDigit: integer. Defaut value: 0. Minimum digit characters expected.
minPunct: integer. Defaut value: 0. Minimum punctuation characters expected.
```

### 10.5.6 パスワードポリシのテスト

```
# ldappasswd -H ldapi:/// -Y EXTERNAL -S "uid=intrajp-user1,ou=people,dc=intrajp-test,dc=org"
New password: password
Re-enter new password: password
...
Result: Constraint violation (19)
```

うまくいったみたいだ。

クライアントから、5回以上パスワードを間違って、ロックさせてみる。
サーバで確認する。

```
# ldapsearch -x -W -H ldap:/// -D "cn=Manager,dc=intrajp-test,dc=org" -b "dc=intrajp-test,dc=org" pwdAccountLockedTime=* pwdAccountLockedTime
（表示）
...
# intrajp-user1, People, intrajp-test.org
dn: uid=intrajp-user1,ou=People,dc=intrajp-test,dc=org
pwdAccountLockedTime: 20210103084740Z
```

ロック解除のファイルを作成、適用

```
# vim /root/ldif/ppolicy-unlock.ldif
dn:uid=intrajp-user1,ou=people,dc=intrajp-test,dc=org
changetype:modify
delete: pwdAccountLockedTime
```

```
# ldapmodify -x -D "cn=Manager,dc=intrajp-test,dc=org" -W -f /root/ldif/ppolicy-unlock.ldif
```

もう一度、確認すると、ロックは解除されていた。

# 11 パスワードロックの解除
## 11.1 ファイル

```
# vim /root/ldif/ppolicy-unlock.ldif
====
dn:uid=intrajp-user1,ou=people,dc=intrajp-test,dc=org
changetype:modify
delete: pwdAccountLockedTime
====
```

## 11.2 解除方法

```
# ldapmodify -x -D "cn=Manager,dc=intrajp-test,dc=org" -W -f /root/ldif/ppolicy-unlock.ldif
```

# 12 ファイルディスクリプタの上限を編集
## 12.1 現在の設定確認

```
# grep "Max open files" /proc/$(pidof slapd)/limits
```

(表示)
Max open files 1024 4096 files

## 12.2 設定の変更

```
# mkdir /etc/systmd/system/slapd.service.d
# vim /etc/systemd/system/slapd.service.d/override.conf
====
[Service]
LimitNOFILE=65536
LimitNPROC=65536
====

# systemctl daemon-reload
# systemctl restart slapd
# grep "Max oprn files" /proc/$(pidof slapd)/limits
```

(表示)
Max open files 65536 65536 files

## 12.3 設定が反映されたかの確認

```
# shutdown -r now
# grep "Max open files" /proc/$(pidof slapd)/limits
```

(表示)
Max open files 65536 65536 files

# 13 ログローテートの設定
## 13.1 rsyslog.confの編集

rsyslog が slapd のログを吐くようにします。

```
# vim /etc/rsyslog.conf
以下を追記
====
local4.* /var/log/slapd/slapd.log
====
```

## 13.2 rsyslogサービスの再起動

```
# systemctl restart rsyslog
```

## 13.3 logrotateの設定にslapdを追加

```
# vim /etc/logrotate.d/syslog
====
以下を追記
/var/log/slapd/slapd.log
====
```

# 14 SELinuxの設定

SELinux は、セキュリティ向上のために、Enforcing としておく。

確認

```
# sestatus
```

（表示）
enforcing

# 15 便利なコマンド

```
# ldapsearch -x -LLL -b dc=intrajp-test,dc=org
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b  cn=config olcDatabase
スキーマの確認
# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn
# slapcat -n 0
ロードされているモジュールの確認
# slapcat -n 0 | grep -i module
# ldapsearch -x -H ldap:/// -D cn=Manager,dc=intrajp-test,dc=org -W -b dc=intrajp-test,dc=org
# ldapsearch -h localhost -x -W -D "cn=Manager,dc=intrajp-test,dc=org" -b 'ou=People,dc=intrajp-test,dc=org'
```

# 16 参考情報

（主に参考にしたところ）
 https://www.tecmint.com/install-openldap-server-for-centralized-authentication/
（その他参考）
https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024
https://qiita.com/gzock/items/f1ac346304653a92c8cb
https://qiita.com/pa_pa_paper/items/c3d7f4a28729045167d2
http://kawakamasu.hatenablog.com/entry/2017/06/08/011422
https://www.conversion.co.jp/technology/blog/-/detail/=/blog_id=5836119
https://www.openldap.org/doc/admin24/slapdconf2.html
https://nonylene.hatenablog.jp/entry/2017/08/19/022137
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system-level_authentication_guide/openldap
（クライアントマシンについて）
https://www.tecmint.com/configure-ldap-client-to-connect-external-authentication/
（参考）
https://www.server-world.info/query?os=CentOS_7&p=openldap&f=4
（参考2）
https://www.nedia.ne.jp/blog/tech/2015/09/08/5570
（さらなる参考）
https://www.unix-power.net/networking/post-748