自宅サーバー構築譚：LDAPサーバー OpenLDAP・インストールとログ出力

# 能書き

[自宅サーバー構築譚：基本構想](https://qiita.com/katz_engineer/items/cb592be44daa28a51d9b)に基づく自宅サーバー構築、[Ubuntu22.04LTSインストールその2](https://qiita.com/katz_engineer/items/033471b69143bf76650e)の続きです。

CentOS方面の話ですが、現在、OpenLDAPは非推奨になっているようです。

参考文献：[9.2. OPENLDAP - 9. LDAP サーバー - II. ID と認証ストア - システムレベルの認証ガイド - Product Documentation for Red Hat Enterprise Linux 7](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system-level_authentication_guide/openldap)

代わりに 389 Directory Server （通称 389-ds）というソフトが標準となるようです。理由は明示されてませんが、OpenLDAPは重いからじゃないかという意見も。調査によっては動作が4倍以上遅いとかいう数字も見かけました。

しかし Ubuntu 20.04 の頃の話ですが、 389-ds をインストールしようとすると依存パッケージが山程出てきてちょっと不気味。良く見ると Apache まで入ってるように見えました。見間違いでしょうか？しかしこれで使う気が失せました。

それにしても LDAP という規格は参考文献が少なくて苦労しました。ネットで幾ら調べても、ごく大雑把な概念説明と、こうやったら上手くいきましたというノウハウしか出てこなくて。その間を埋める知識がわかりません。仕方が無いので本を買いました。それも2007年の本、新品ではなくて古本屋での購入です。関係者の皆様スミマセン。

どうやら LDAP は、エンタープライズでの利用が一般的なせいかあんまり記事がありませんな。誰か中級者向け記事を書いてください（切実）

本記事もノウハウ寄りになります。理論は参考書を購入して勉強して下さい。古～い規格なので、十数年前の古～い参考書も現役で役に立ちます。

と言う訳で Ubuntu に OpenLDAP をインストールします。[以前も試みました](https://qiita.com/katz_engineer/items/729645f6bca28f4a3708)が、今回は Ubuntu 22.04 です。ログ出力も追加したので、新しく記事を起こす事にしました。

# 目標

LDAPを良く分かっていないので、一気に作業を進めるのは危険と判断しました。関連する作業内容を下記4つに分割し、1つずつ進めていきます。

1. LDAPインストール。そしてログを rsyslog に出力する設定。
1. LDAP over TLS を設定。そしてサーバーマシンとは別のクライアントマシンから ldaps アクセス。
1. クライアントマシンに sssd をインストールしてログイン。LDAP でのアカウント管理を実現。
1. SSH の公開鍵接続。公開鍵の LDAP 管理を実現。クライアントマシンから SSH 接続。

今回は 1. LDAP インストールとログ出力設定 を実施します。

# 参考文献

## 基本的なインストールと設定

- [自宅サーバー構築譚：LDAPサーバー OpenLDAP - Qiita](https://qiita.com/katz_engineer/items/729645f6bca28f4a3708) … 拙作記事です。これをベースに作業します。
- [OpenLDAP Server - Ubuntu Server](https://ubuntu.com/server/docs/service-ldap) … 今時はブラウザが自動翻訳してくれたりします。英語の文献でも怖くありません。良い時代になりましたな。
- [OpenLDAP : LDAP サーバーの設定 - Server World](https://www.server-world.info/query?os=Ubuntu_20.04&p=openldap)
- [Ubuntu 20.04 LTS にOpenLDAPサーバーを構築したい - Qiita](https://qiita.com/cffnpwr/items/be903005e291d0ece514)

## ログ出力設定

- [Logging - Changing the configuration - Install LDAP - OpenLDAP Server - Ubuntu Server](https://ubuntu.com/server/docs/service-ldap)
- [5.2.1.2. olcLogLevel: <level> - 5.2.1. cn=config - 5.2. Configuration Directives - 5. Configuring slapd - OpenLDAP Software 2.4 Administrator's Guide](https://openldap.org/doc/admin24/slapdconf2.html#cn=config)

## ログの読み方

- [OpenLDAP のログの見方、確認、解析方法 - 【図解】ネットワーク/サーバ/セキュリティの基礎から応用まで](https://milestone-of-se.nesuke.com/l7protocol/ldap/openldap-log/)

## LDAP 一般論

- [OpenLDAPで社内サービスのユーザ情報を一元管理する - Qiita](https://qiita.com/jca02266/items/bf00acf88fde8bc29775) … LDAP 利用における実践的内容の紹介です。参考になります。

# インストール

## root 化

今回も殆どの作業が root になるので、最初に root になっておきます。

```console
sudo -i
```

## スナップショット

[スナップショットだいじ。超だいじ。](https://qiita.com/katz_engineer/items/f3bd2f7af2ba49db156c#%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)

```console
zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_rsyslog
zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_rsyslog
zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_rsyslog
```

## インストール

```console
apt install -y slapd ldap-utils
```

インストール中に LDAP 管理者のパスワードを求められました。管理者パスワードなので root 並にしっかりした物にしましょう。

```console
┌─────────────────────────┤ Configuring slapd ├─────────────────────────┐
│ Please enter the password for the admin entry in your LDAP directory. │
│                                                                       │
│ Administrator password:                                               │
│                                                                       │
│ _____________________________________________________________________ │
│                                                                       │
│                                 <Ok>                                  │
│                                                                       │
└───────────────────────────────────────────────────────────────────────┘
```

同じパスワードをもう一回入力します。

```console
┌─────────────────────────────────────┤ Configuring slapd ├────────────────────────────────────────────┐
│ Please enter the password for your LDAP directory again to verify that you hanve typed it correctly. │
│                                                                                                      │
│ Confirm password:                                                                                    │
│                                                                                                      │
│ ____________________________________________________________________________________________________ │
│                                                                                                      │
│                                             <Ok>                                                     │
│                                                                                                      │
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘
```

これで最後までインストールが完了します。

インストール直後の ```/etc``` をバージョン管理します。まずは確認。

```console
svn st /etc
```

こう表示されました。

```console
# svn st /etc
?       /etc/apparmor.d/local/usr.sbin.slapd
?       /etc/apparmor.d/usr.sbin.slapd
?       /etc/default/slapd
M       /etc/group
M       /etc/gshadow
?       /etc/init.d/slapd
M       /etc/ld.so.cache
?       /etc/ldap/sasl2
?       /etc/ldap/schema
?       /etc/ldap/slapd.d
M       /etc/passwd
?       /etc/perl
?       /etc/rc0.d/K01slapd
?       /etc/rc1.d/K01slapd
?       /etc/rc2.d/S01slapd
?       /etc/rc3.d/S01slapd
?       /etc/rc4.d/S01slapd
?       /etc/rc5.d/S01slapd
?       /etc/rc6.d/K01slapd
M       /etc/shadow
?       /etc/ufw/applications.d/slapd
```

```svn commit```します。

```console
svn st /etc | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -t svn add
svn ci /etc -m"installed OpenLDAP"
```

それから DIT サフィックス(dc)を設定します。インストール直後に設定されているのは nodomain ですので、[Unbound を立てた時に決めた家庭内ドメイン](https://qiita.com/katz_engineer/items/4e29b954e0290621c1ab#%E5%AE%B6%E5%BA%AD%E5%86%85%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3)へと変更します。我が家の場合は home ですな。

また、同時に組織単位(ou)も登録します。というかこのコマンドを実行すると組織単位の設定も要求されます。
下記の参考文献に則って、ここでは infra を作成します。

参考文献：[LDAPディレクトリの構成、ACLについて - CentOS7でOpenldap構築 - 1.Openldapの仕組み - Qiita](https://qiita.com/y-araki-qiita/items/0c954c3ae25d4ed9dbb8#ldap%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E6%A7%8B%E6%88%90acl%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)

```console
dpkg-reconfigure slapd
```

設定できたら```svn commit```しましょう。

```console
svn st /etc
svn ci /etc -m"OpenLDAP initial setting"
```

## ファイルディスクリプタ上限値の設定

家庭向け小規模システムなので、このチューニングは実施しません。[メインの参考文献](https://ubuntu.com/server/docs/service-ldap)にも書かれていませんし。
関連する参考文献の提示だけにしておきます。

参考文献：[ファイルディスクリプタ上限値の設定 - LDAPサーバ構築 - CentOS7でOpenldap構築 - 2.LDAPサーバ構築手順](https://qiita.com/y-araki-qiita/items/6b2dcbf1a39a969d8024#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF%E4%B8%8A%E9%99%90%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
参考文献：[Linux ファイル・ディスクリプタ制限のチューニング - Oji-Cloud](https://oji-cloud.net/2022/03/16/post-6951/)
参考文献：[5.4 運用時に必要なシステム資源(Linux) - 第5章 チューニング - Interstage HTTP Server 2.2 運用ガイド](https://software.fujitsu.com/jp/manual/manualfiles/m170006/b1ws1309/01z200/index.html)

# ログ設定

```*.ldif```ファイルは```/opt/ldap```に置く事にします。そう決めました！

```console
mkdir /opt/ldap
cd /opt/ldap
```

```logging.ldif``` ファイルを作成。

```console
cat >logging.ldif <<___
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
___
```

変更を実装します。

```console
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f logging.ldif
```

rsyslog を設定します。

```console
cat >/etc/rsyslog.d/90-ldap.conf <<___
local4.*  /var/log/ldap.log
___
systemctl restart rsyslog
systemctl status rsyslog
```

logrotate を設定します。

```console
cat >/etc/logrotate.d/ldap <<___
/var/log/ldap.log {
  rotate 4
  weekly
  missingok
  compress
  notifempty
}
___
```

ログファイルを用意します。

```console
cd /var/log
touch ldap.log
chown syslog:adm ldap.log
```

ここまでで root ユーザーによる作業は終わりです。

```console
exit
```

# 動作確認

私は誰でしょう。

```console
ldapwhoami -x
```

この結果は anonymous と表示されます。匿名ユーザーです。

```console
$ ldapwhoami -x
anonymous
```

ログを確認してみます。

```console
cat /var/log/ldap.log
```

確認結果は下記のようになりました。

```console
$ cat ldap.log
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 fd=12 ACCEPT from IP=[::1]:59236 (IP=[::]:389)
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 op=0 BIND dn="" method=128
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 op=0 RESULT tag=97 err=0 qtime=0.000024 etime=0.000083 text=
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 op=1 EXT oid=1.3.6.1.4.1.4203.1.11.3
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 op=1 WHOAMI
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 op=1 RESULT oid= err=0 qtime=0.000010 etime=0.000069 text=
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 op=2 UNBIND
Mar 15 20:48:01 secondary slapd[116254]: conn=1003 fd=12 closed
```

意味する所は何となくわかるようなわからないような、モヤモヤする感じですが。取り敢えず何かは出力されるようです。
量が多いですけども。

この匿名ユーザがアクセス可能な範囲で、home ドメインに登録されている情報を表示してみます。

```console
ldapsearch -x -LLL -H ldapi:/// -b dc=home
```

実行結果は下記のようになります。

```console
$ ldapsearch -x -LLL -H ldapi:/// -b dc=home
dn: dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: infra
dc: home

```

ログの様子は下記のようになりました。

```console
$ tail -n7 ldap.log
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 fd=12 ACCEPT from PATH=/var/run/slapd/ldapi (PATH=/var/run/slapd/ldapi)
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 op=0 BIND dn="" method=128
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 op=0 RESULT tag=97 err=0 qtime=0.000023 etime=0.000067 text=
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 op=1 SRCH base="dc=home" scope=2 deref=0 filter="(objectClass=*)"
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 op=1 SEARCH RESULT tag=101 err=0 qtime=0.000022 etime=0.001015 nentries=1 text=
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 op=2 UNBIND
Mar 15 20:55:55 secondary slapd[116254]: conn=1004 fd=12 closed
```

# 仕舞い

例によって```/etc```の変更をバージョン管理しましょう。

```console
sudo -i
```
```console
svn st /etc | grep "^?" | cut -b9- | xargs -I{} find {} -type f -or -type d -or -type l | xargs -t svn add
svn ci /etc -m"ldap log settings"
exit
```

作業は以上です。

まずは ldap をインストールして、ログを記録させる事に成功しました。きちんとしたドメイン管理へ第一歩です。やったね:thumbsup_tone1: