自宅サーバー構築譚：LDAPサーバー OpenLDAP over TLS

# 能書き

[自宅サーバー構築譚：基本構想](https://qiita.com/katz_engineer/items/cb592be44daa28a51d9b)に基づく自宅サーバー構築、[Ubuntu22.04LTSインストールその2](https://qiita.com/katz_engineer/items/033471b69143bf76650e)の続きです。[Hyper-Vに構築したクライアントマシンもどき](https://qiita.com/katz_engineer/items/bf9299e8f9afd19975e8)も使用します。

[前回](https://qiita.com/katz_engineer/items/0e2c299f943a7b13e2c4)は、[サーバーマシン](https://qiita.com/katz_engineer/items/033471b69143bf76650e)に OpenLDAP をインストールしました。今回はその続きです。

# 目標

[前回](https://qiita.com/katz_engineer/items/0e2c299f943a7b13e2c4)掲げた作業の題目を再掲します。

1. [LDAPインストール。そしてログを rsyslog に出力する設定。](https://qiita.com/katz_engineer/items/0e2c299f943a7b13e2c4) ←完了
1. LDAP over TLS を設定。そして[サーバーマシン](https://qiita.com/katz_engineer/items/033471b69143bf76650e)とは別の[クライアントマシン](https://qiita.com/katz_engineer/items/bf9299e8f9afd19975e8)から ldaps アクセス。 **←イマココ**
1. クライアントマシンに sssd をインストールしてログイン。LDAP でのアカウント管理を実現。
1. SSH の公開鍵接続。公開鍵の LDAP 管理を実現。クライアントマシンから SSH 接続。

と言う訳で今回は LDAP の通信路を暗号化し、[クライアントマシン](https://qiita.com/katz_engineer/items/bf9299e8f9afd19975e8)から問い合わせを実施してみます。

# 参考文献

今回は、一発でコレ！という参考文献がありませんでした。幾つかの記事から使える手順を継ぎ接ぎした形になります。

- [Ubuntu 22.04 LDAPクライアント - 手当たり次第に書くんだ](https://www.si1230.com/?p=46200)
- [Ubuntu 22.04 TLS 証明書の信頼設定 - 手当たり次第に書くんだ](https://www.si1230.com/?p=45601)
- [使用する各端末にCAの公開鍵(ca.crt)をルート証明書としてインポート - easy-rsaでプライベートCA(認証局)を作ってオレオレ証明書ではないローカル用TLS証明書の管理をする - R O HEAD -yajiri-](https://r-o-head.tk/post/private-ca-with-easy-rsa/#%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%90%84%E7%AB%AF%E6%9C%AB%E3%81%ABca%E3%81%AE%E5%85%AC%E9%96%8B%E9%8D%B5-ca-crt-%E3%82%92%E3%83%AB%E3%83%BC%E3%83%88%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%A8%E3%81%97%E3%81%A6%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)
- [LDAP and Transport Layer Security (TLS) - ubuntu server](https://ubuntu.com/server/docs/service-ldap-with-tls)

# サーバー側操作

[以前、rsyslog を設定・確認した際](https://qiita.com/katz_engineer/items/72c4018f960c9c2c0491)に、認証局と証明書を作成しています。そしてオレオレ認証局を[クライアントマシン](https://qiita.com/katz_engineer/items/bf9299e8f9afd19975e8)へ送付済です。それを再利用します。

## スナップショット

[スナップショットだいじ。超だいじ。](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:サーバー
sudo zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_TLS
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_TLS
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_TLS
```

## 認証局と証明書の鍵を配置

認証局：
- 秘密鍵 ```/opt/CA/demoCA/pki/private/ca.key```
- 公開鍵 ```/opt/CA/demoCA/pki/ca.crt```

サーバーマシン secondary.home の証明書：
- 秘密鍵 ```/opt/CA/demoCA/pki/private/secondary.home.key```
- 公開鍵 ```/opt/CA/demoCA/pki/issued/secondary.home.crt```


```console:サーバー
cd /etc/ldap/sasl2/
sudo cp -p /opt/CA/demoCA/pki/ca.crt demoCA.crt
sudo cp -p /opt/CA/demoCA/pki/private/secondary.home.key .
sudo cp -p /opt/CA/demoCA/pki/issued/secondary.home.crt .
sudo chown openldap demoCA.crt secondary.home.*
```

## TLS 設定

```console:サーバー
sudo -i
cat >/opt/ldap/mod_ssl.ldif <<___
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/sasl2/demoCA.crt
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/sasl2/secondary.home.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/sasl2/secondary.home.key
___
ldapmodify -Y EXTERNAL -H ldapi:/// -f /opt/ldap/mod_ssl.ldif
exit
```

プロトコルも変更します。
ここでは ldap:// を停止して、ldaps:// と ldapi:// の2つを許可するようにしました。

```console:サーバー
sudo sed -i -e'/^SLAPD_SERVICES=/c SLAPD_SERVICES="ldaps:/// ldapi:///"' /etc/default/slapd
```

LDAP を再起動します。

```console:サーバー
sudo systemctl restart slapd
```

# クライアント側でオレオレ認証局を信頼

## スナップショット

[スナップショットだいじ。超だいじ。](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:クライアント
sudo zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_TLS
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_TLS
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_TLS
```

## LDAP クライアントをインストール

```console:クライアント
sudo apt install -y ldap-utils
```

## オレオレ認証局の受け取り

[以前、rsyslog を設定・確認した際](https://qiita.com/katz_engineer/items/72c4018f960c9c2c0491)に[クライアントマシン](https://qiita.com/katz_engineer/items/bf9299e8f9afd19975e8)へ送信したオレオレ認証局の公開鍵が、```/etc/rsyslog.d/tls/demoCA.crt```に存在します。これを再利用します。

## オレオレ認証局を信頼

Ubuntuにおいて証明書の信頼とは、下記手順で操作する事、らしいです。

```console:クライアント
sudo mkdir /usr/share/ca-certificates/demoCA
sudo cp -p /etc/rsyslog.d/tls/demoCA.crt /usr/share/ca-certificates/demoCA/
echo demoCA/demoCA.crt | sudo tee -a /etc/ca-certificates.conf
sudo update-ca-certificates
```

上記操作によって```/etc/ssl/certs```ディレクトリに必要なファイルが設定されます。

```console:クライアント
ls -l /etc/ssl/certs/ | grep demoCA
ls -l /etc/ssl/certs/ca-certificates.crt
```

Ubuntu では、信頼する認証局の一覧表は既に設定済のようです。

```console:クライアント
grep TLS_CACERT /etc/ldap/ldap.conf
```

実行結果。

```console:クライアント
$ grep TLS_CACERT /etc/ldap/ldap.conf
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt
```

# 動作確認

クライアント側でコマンドを実行。ここでは「.home」は省略できません。FQDN をしっかり指定しましょう。

```console:クライアント
ldapsearch -x -LLL -H ldaps://secondary.home -b dc=home
```

成功したら、何らかの結果が表示されます。

```console:クライアント
$ ldapsearch -x -LLL -H ldaps://secondary.home -b dc=home
dn: dc=home
objectClass: top
objectClass: dcObject
objectClass: organization
o: infra
dc: home
```

なお TLS ではない ldap:// は禁止しました。指定すると通信に失敗します。

```console:クライアント
$ ldapsearch -x -LLL -H ldap://secondary.home -b dc=home
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
```

# 仕舞い

成功したら```/etc```をコミットしましょう。

まずはサーバー側を確認。

```console:サーバー
$ sudo svn st /etc
M       /etc/default/slapd
M       /etc/ldap/ldap.conf
?       /etc/ldap/sasl2/demoCA.crt
?       /etc/ldap/sasl2/secondary.home.crt
?       /etc/ldap/sasl2/secondary.home.key
M       /etc/ldap/slapd.d/cn=config.ldif
```

コミットします。

```console:サーバー
sudo -i
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 over TLS"
exit
```

次にクライアント側を確認。

```console:クライアント
$ sudo svn st /etc
M       /etc/ca-certificates.conf
M       /etc/cups/subscriptions.conf
M       /etc/cups/subscriptions.conf.O
M       /etc/ldap/ldap.conf
?       /etc/ssl/certs/b4da1397.0
M       /etc/ssl/certs/ca-certificates.crt
?       /etc/ssl/certs/demoCA.pem
M       /etc/zfs/zpool.cache
```

なぜか```zpool.cache```に差分が出ました。何だろう。まぁいいか。このままコミットします。

```console:クライアント
sudo -i
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 over TLS"
exit
```

これで OpenLDAP over TLS の設定が終わりました。クライアントからの問合せと回答が暗号化されます。やったね:thumbsup_tone1: