389DSをTLS対応させる

前回でCockpitをTLS接続に変更したときに証明書を作ったので、その証明書を使って389DSの接続もTLSにしておきます。

前回

https://qiita.com/jp_ibis/items/f430eea2ba6e215e2e0a

基本は389DSとSSSDの設定の変更になりますが、Sambaも1行だけ修正が入ります。

なおオレオレルートCA証明書はOSに登録して丸っと信頼させることもできるようですが、お勉強のためアプリ個別に登録するようにしています。

といってもLDAP認証はSSSDが中継するので、今回はSSSDにルートCA証明書を登録するだけでした。

# 389DSに証明書を登録する

作業ディレクトリは389DSのインスタンス名と同じです。前回作ったserver.crtとserver.keyをコピーしておきましょう。

```bash
$ cd /etc/dirsrv/インスタンス名
$ cp 証明書置き場/server.crt .
$ cp 証明書置き場/server.key .
```

サーバに証明書を登録するときにPINを聞かれますがこれは作業ディレクトリの中に`pin.txt`という名前で入っています。`(Software) Token:`の後ろの文字列を使ってください。

```bash
$ cat pin.txt
Internal (Software) Token:xxx...
```

サーバ証明書の登録ですが登録前に変換が必要になります。前回作った証明書はテキスト(pem形式)なのですが、389DSへの登録はバイナリ形式の方を使います。

コマンドを実行するとPINを聞かれるので先ほど拾ったPINを使います。

```bash
# p12に変換(パスワードを設定しろと言われる)
$ openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -name <登録名>

# 登録(PINの後↑で設定したパスワードを聞かれる)
$ pk12util -i server.p12 -d . -n <登録名>
```

登録ができたか確認します。

```bash
$ certutil -L -d .
Certificate Nickname                                         Trust Attributes
                                                             SSL,S/MIME,JAR/XPI

Self-Signed-CA                                               CT,, 
Server-Cert                                                  u,u,u
<登録名>　                                                    u,u,u
```

登録名を失敗したりでやり直したいとき。

```bash
$ certutil -D -n <登録名> -d .
```

# 証明書を使うよう設定する

サーバ/サーバ設定/セキュリティのサーバ証明書の所に登録名のエントリが増えているのでそれを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/93a9ad2c-f3f3-4be1-a841-c774e9545f60.png)

そのまま下にスクロールすると`セキュアな接続を要求する`とあるのでチェックを入れて設定の保存ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/a4a8ee65-8434-4635-8218-490be821eb95.png)

サーバを再起動しろと言われるのでしておきましょう。

```bash
$ systemctl restart dirsrv@<インスタンス名>
```

TLS無しでつなごうとすると`requires a secure connection`と怒られるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140718/5f4b3455-686e-4c61-89e9-c86b374d46e8.png)

というわけでもうポートは閉じておきましょう。

```bash
$ firewall-cmd --remove-service=ldap --permanent
$ firewall-cmd --reload
```

# SSSDでTLS対応する

ldap接続でTLSを使わない(never)にしていたのを、ldaps接続でTLSを使う(demand)にします。

ldapのURIは前回はローカルホストのIPアドレスでしたが、TLSで接続する場合証明書と接続先ホスト名が違うとエラーになる場合があるので、URIにはホスト名の設定にしておきました。

併せてオレオレルートCA証明書も設定しておきます。

```bash
$ cp 証明書置き場/rootCA.crt /etc/sssd/
```

```conf:/etc/sssd/sssd.conf
#ldap_uri = ldap://127.0.0.1
#ldap_tls_reqcert = never
ldap_uri = ldaps://minipc.home:636
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/sssd/rootCA.crt
```

再起動したらTLS接続に切り替わります。

```bash
$ sss_cache -E
$ systemctl restart sssd
```

# Sambaの設定

backendの接続先を変更します。やはりURIはTLSに登録したホスト名にしています。

……証明書にlocalhsotとか::1を追加しておけばよかったかも O(:3 )~ ('､3_ヽ)_

```conf:/etc/samba/smb.conf
        # ldapsに変更
#       passdb backend = ldapsam:ldap://localhost
        passdb backend = ldapsam:ldaps://minipc.home:636

        # 以下変更なし
        ldap ssl = no
        ldap admin dn = cn=Directory Manager
        ldap suffix = dc=home
        ldap user suffix = ou=Users,dc=home
```

`ldap ssl`の設定はデフォルトが`start tls`っぽく消したらネゴシエーションに失敗します😇

ldaps接続自体がTLS接続なのでStartTLSの平文接続からTLSに昇格させる仕組みは不要です。なので`ldap ssl = no`の行はそのままおいておきます。

コンフィグを編集したら再起動しておきましょう。

```bash
$ systemctl restart smb
```

# OpenLDAPのコマンドにも対応しておく

ldapsearchとか使いたいやん\_(:3」∠)_

```bash
$ cp 証明書置き場/rootCA.crt /etc/openldap/certs/rootCA.crt

# ldapsearchを実行するユーザーが使うので一般ユーザーも読み取り可能にしておく
# 証明書(公開鍵)なので見られてもOK
$ chmod 644 /etc/openldap/certs/rootCA.crt
```

`TLS_REQCERT`を`demand`にするかコメントアウトして、`ldap.conf`の`TLS_CACERT`にオレオレルートCA証明書を設定しておきます。

```conf:/etc/openldap/ldap.conf
TLS_REQCERT demand
TLS_CACERT /etc/openldap/certs/rootCA.crt
```

これでladapsearchコマンドも使えるはずです。ただしTLSアクセスするときは証明書に登録したhost名でないとエラーがでます。

```bash
$ ldapsearch -x -H ldaps://minipc.home:636  -b "" -s base
```

# 他のLinuxPCからログインできるか試してみる

Fedora atomic(Sway Spin)からLDAPのユーザーでログインできるか試してみます。

まずはSSSDのインストール

```bash
$ rpm-ostree install sssd sssd-tools sssd-ldap
$ systemctl reboot
```

sssd.confの設定

```conf:/etc/sssd/sssd.conf
[sssd]
services = nss, pam
domains = default

[domain/default]
ldap_uri = ldaps://minipc.home:636
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/sssd/rootCA.crt
ldap_search_base = ou=Users,dc=home
ldap_default_bind_dn = cn=Directory Manager
id_provider = ldap
auth_provider = ldap
```

ldapアクセス用のパスワード設定

```bash
$ sss_obfuscate --domain=default
```

SSSDの起動

```
# パーミッションは600か640で
$ chmod 640 /etc/sssd/sssd.conf
$ systemctl start sssd
```

PAMに適用

```
$ authselect select sssd
$ systemctl reboot
```

LDAP経由でシステムにいないユーザーでログインできた！

けど、Swayでfootが上手く動きませんでした／(^o^)＼


# 証明書の更新

証明書の期限切れやホスト名を変更したときは証明書を更新する必要があります。

## CSR((サーバー証明書署名要求)の更新

RootCAの署名をもらうときに使うファイルで、LDAPサーバのホスト名の変更等があった場合は作り直します。

```ini:san.conf
[req]
req_extensions = v3_req
prompt = no
distinguished_name = req_distinguished_name

[req_distinguished_name]
C = JP
ST = Shimane
L = Masuda
O = MyHome
CN = minipc.home

[v3_req]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = minipc.home
DNS.2 = minipc-wifi.home
IP.1 = 192.168.x.x
```

```bash
$ openssl req -new -key server.key -out server.csr -config san.cnf
```

## Server証明書の更新

RootCAの署名をもらってServer証明書を作成します。

```bash
$ openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 365 -sha256 -extfi
le san.cnf -extensions v3_req
```

386DSで使うp12形式に変換します。

```
$ openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -name minipc-server
```

## 389DSに登録した証明書を更新

一旦古い証明書を削除してから登録し直します。削除しないと二重で登録されます。

```bash
# 確認
$ certutil -L -d /etc/dirsrv/<インスタンス名>

# 削除
$ certutil -D -n <登録名> -d /etc/dirsrv/<インスタンス名>

# 登録
$ pk12util -i server.p12 -d /etc/dirsrv/<インスタンス名> -n <登録名>
```

サーバを再起動すれば更新したものが有効になります。

```bash
$ systemctl restart dirsrv@<インスタンス名>
```