自宅サーバー構築譚：LDAPサーバー OpenLDAP・SSSD を利用したログイン・Xubuntu 22.04 LTS

# 能書き

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

[LDAP と SSSD でログイン設定しようとした所、クライアントが Lubuntu の場合は上手くいきませんでした](https://qiita.com/katz_engineer/items/693ab241fc6aa8452b0d#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)。ユーザー名を自由入力できないのでは手も足も出ません。

そこで[クライアントマシンを Xubuntu にした](https://qiita.com/katz_engineer/items/f02604adc8b523c5d645)ら上手くいったので、その手順を記録します。と言っても今までの記事からの抜粋ですが。記事2つに分散してしまったので、必要な情報だけをここに纏めます。

# 目標

- SSSD を利用したログイン
- その為の認証局の信頼

# 参考文献

- [自宅サーバー構築譚：LDAPサーバー OpenLDAP over TLS - Qiita](https://qiita.com/katz_engineer/items/c7445176881900120d03)
   - [この記事のサーバー側操作](https://qiita.com/katz_engineer/items/c7445176881900120d03#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E5%81%B4%E6%93%8D%E4%BD%9C)が完了している事が前提です。
- [自宅サーバー構築譚：LDAPサーバー OpenLDAP・SSSD を利用したログイン - Qiita](https://qiita.com/katz_engineer/items/693ab241fc6aa8452b0d)
   - LDAP サーバー構築後は[ユーザーを登録](https://qiita.com/katz_engineer/items/693ab241fc6aa8452b0d#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2)しておいて下さい。

# スナップショット

[クライアントマシン](https://qiita.com/katz_engineer/items/f02604adc8b523c5d645)でも[スナップショットだいじ。超だいじ](https://qiita.com/katz_engineer/items/693ab241fc6aa8452b0d)。

```console:クライアント
sudo zfs snapshot tank/ROOT/ubuntu@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_SSSD
```
```
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/apt@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_SSSD
```
```
sudo zfs snapshot tank/ROOT/ubuntu/var/lib/dpkg@$(date +%Y%m%d_%H%M%S)_before_OpenLDAP_SSSD
```

# SSSD インストールと設定

## インストール

[クライアントマシン](https://qiita.com/katz_engineer/items/f02604adc8b523c5d645)に関連パッケージをインストールします。

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

```/etc```は下記のように変化しました。

```console:クライアント
$ sudo svn st /etc
$ sudo svn st /etc
?       /etc/apparmor.d/force-complain/usr.sbin.sssd
?       /etc/apparmor.d/local/usr.sbin.sssd
?       /etc/apparmor.d/usr.sbin.sssd
M       /etc/cups/subscriptions.conf
M       /etc/cups/subscriptions.conf.O
?       /etc/default/sssd
M       /etc/group
M       /etc/gshadow
?       /etc/init.d/sssd
M       /etc/ld.so.cache
?       /etc/logrotate.d/sssd-common
M       /etc/nsswitch.conf
M       /etc/pam.d/common-account
M       /etc/pam.d/common-auth
M       /etc/pam.d/common-password
M       /etc/pam.d/common-session
?       /etc/pam.d/sssd-shadowutils
M       /etc/passwd
?       /etc/rc0.d/K01sssd
?       /etc/rc1.d/K01sssd
?       /etc/rc2.d/S01sssd
?       /etc/rc3.d/S01sssd
?       /etc/rc4.d/S01sssd
?       /etc/rc5.d/S01sssd
?       /etc/rc6.d/K01sssd
M       /etc/shadow
?       /etc/sssd
?       /etc/systemd/system/multi-user.target.wants/sssd.service
?       /etc/systemd/system/sssd.service.wants
M       /etc/zfs/zpool.cache
```

これらの検討は、今回はしません。面倒臭いし。このまま Subversion 登録します。

```console:クライアント
sudo svn st /etc | grep "^?" | cut -b9- | xargs -I{} sudo find {} -type f -or -type d -or -type l | xargs -t sudo svn add
```
```
sudo svn ci /etc -m"SSSD initial settings"
```

## 初期設定

```/etc/sssd/sssd.conf```を作成し、パーミッションを 0600、所有権を root:root にします。
なお LDAP サーバー は secondary.home とします。

```console:クライアント
cat <<___ | sudo tee /etc/sssd/sssd.conf >/dev/null
[sssd]
config_file_version = 2
domains = home

[domain/home]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldaps://secondary.home
cache_credentials = True
ldap_search_base = dc=home
___
```

```console
sudo chmod 600 /etc/sssd/sssd.conf
```

この後に SSSD サービスを開始する事を忘れないように。

```console:クライアント
sudo systemctl start sssd
```

起動を確認します。

```console:クライアント
systemctl status sssd
```

最後に、ホームディレクトリの自動作成を有効にします。

```console:クライアント
sudo pam-auth-update --enable mkhomedir
```

# オレオレ認証局を信頼

## 鍵の配置

秘密鍵と公開鍵は、既に作ってあるという事にします。作り方は以前の記事を参照して下さい。

- [自宅サーバー構築譚：オレオレ認証局 - Qiita](https://qiita.com/katz_engineer/items/ada7b08e7c0254e39126)
- [自宅サーバー構築譚：オレオレ認証局が認証する証明書 - Qiita](https://qiita.com/katz_engineer/items/1bb165f5f59c43c0ab6a)

この手順に従うと、各鍵の配置は下記のようになります。

認証局：

- 秘密鍵 ```/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```

クライアントへ送付する鍵は```ca.crt```（認証局の公開鍵）のみになります。

## オレオレ認証局の公開鍵を送付

サーバー側での操作です。

```ca.crt```（認証局の公開鍵）を送信用ディレクトリ```/srv/publickey```内の、クライアントから操作できるサブディレクトリに置きます。ついでにファイル名を調整。

```console:サーバー
sudo cp -p /opt/CA/demoCA/pki/ca.crt /srv/publickey/publickey/demoCA.crt
```

cp コマンドに```-p```オプションを付けると、更新日時などを元ファイルと同一にしてくれます。逆に指定しない場合は、コピーした日時が更新日時になってしまいます。大抵は問題無いと思いますけども。私は気になるので。

publickey ユーザーが操作できるように権限を調整します。

```console:サーバー
cd /srv/publickey/publickey/
```
```
sudo chgrp publickey demoCA.crt
```
```
sudo chmod g+r demoCA.crt
```

権限を確認。

```console:サーバー
# ls -l demoCA.crt
-rw-r----- 1 root publickey 1184 Mar 10 09:05 demoCA.crt
```

ここからクライアント側の操作になります。[以前、公開鍵送付専用の sftp ユーザーを作成しました](https://qiita.com/katz_engineer/items/8c0dcbb985d4493200d2)ので、それを使用してサーバー上の鍵```publickey/demoCA.crt```を持ってきます。

まずは適当な作業用ディレクトリに移動して、それから sftp を起動。持ってきた後はクライアント側の責任で削除しておきましょう。公開鍵取得の印の代わりです。

```console:クライアント
cd
sftp publickey@secondary
```

```console:クライアント：sftp操作
cd publickey
get demoCA.crt
rm demoCA.crt
exit
```

ファイルの権限は取得したユーザーになっているので、これを一般的な```/etc```内ファイルの権限に変えておきます。

```console:クライアント
sudo chown root:root demoCA.crt
```
```
sudo chmod 644 demoCA.crt
```

確認。

```console:クライアント
$ ls -l demoCA.crt
-rw-r--r-- 1 root root 1184 Apr  2 09:00 demoCA.crt
```

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

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

```console:クライアント
sudo mkdir /usr/share/ca-certificates/demoCA
```
```
sudo mv demoCA.crt /usr/share/ca-certificates/demoCA/
```
```
echo demoCA/demoCA.crt | sudo tee -a /etc/ca-certificates.conf >/dev/null
```
```
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
```

# クライアントマシン再起動

ここまで出来たらマシンを再起動します。GUI で操作するも良し、コマンドラインで```reboot```するも良し。

# 動作確認

[参考文献の LDAP へのユーザー登録手順](https://qiita.com/katz_engineer/items/693ab241fc6aa8452b0d#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2)に従っていると、ユーザー taro パスワード Ma9H%6jg となっています。これでログインできる事を確認します。

## オンラインでログイン

最初に、今まで通りのユーザーでログインできる事を確認して下さい。ここがしくじっていると目も当てられません。

それから taro を認識している事を、下記コマンドで確認しましょう。

```console:クライアント
getent passwd taro
id taro
```

成功すれば下記のような結果になります。

```console:クライアント
$ getent passwd taro
taro:*:10000:10000:taro:/home/taro:/bin/bash
$ id taro
uid=10000(taro) gid=10000(taro) groups=10000(taro)
```

コンソールでログイン認証を確認。

```console:クライアント
sudo login
```

ここまで成功すれば大丈夫でしょう。一度ログアウトして、GUIで taro がログインできる事を確認します。

まずユーザー名、またはその右の▼ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/586e33ee-bbc2-ac65-24fe-14bbf3a1b8ff.png)

表示されるドロップダウンメニューから「Other...」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/0c0ec5b3-9c7c-a00b-ed3a-5fcbc77becf4.png)

ユーザー名とパスワードを入力して「Log In」ボタン、または Enter キーを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/0bcf841a-50d3-c50c-0cf9-9f230b710df9.png)

ログイン成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/2c63aaff-a0b3-f9b9-0d78-6bffcfb4bf24.png)

一旦ログアウトします。

## オフラインでログイン

SSSD が正しく利いていれば、LDAP サーバーとの通信が途絶してもログインできる筈です。

ログアウトした状態で、ホストマシンの操作などで通信を切断します。それからログインを試みてみましょう。

ここでは Hyper-V ゲスト設定の操作で、ネットワークを切断します。

Hyper-V ゲストマシンのメニュー > ファイル > 設定...
設定画面 > ハードウェア > ネットワークアダプター
仮想スイッチのドロップダウンメニューから「接続されていません」を選択して OK ボタン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/6a87d434-6953-32df-8791-1b0039e5a1c9.png)

Xubuntu のログイン画面で、もう一度ログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/0436d410-3d1d-af72-51ad-3afd0da4a8fc.png)

ログインできました！

ここで Xubuntu はネットワークが切断されている事を確認してみます。
Ctrl+Alt+T でターミナルを開いて、下記のコマンドを実行します（172.16.1.3 は LDAP サーバーの IP アドレス）

```console:クライアント
ping 172.16.1.3
```

実行結果はこうなる筈。

```console:クライアント
$ ping 172.16.1.3
ping: connect: Network is unreachable
```

確かにネットワークは接続されていません！
以上で、一度ログインしてしまえばオフラインでもログインできる事を確認できました。

# 仕舞い

動作確認できたので```/etc```を Subversion コミットします。

```console:クライアント
sudo svn st /etc
```

実行結果。

```console:クライアント
$ sudo svn st /etc
[sudo] password for admin:
M       /etc/ca-certificates.conf
M       /etc/cups/subscriptions.conf
M       /etc/cups/subscriptions.conf.O
M       /etc/pam.d/common-session
?       /etc/ssl/certs/b4da1397.0
M       /etc/ssl/certs/ca-certificates.crt
?       /etc/ssl/certs/demoCA.pem
?       /etc/sssd/sssd.conf
M       /etc/zfs/zpool.cache
```

新規ファイルを追加してコミットします。

```console:クライアント
sudo svn st /etc | grep "^?" | cut -b9- | xargs -I{} sudo find {} -type f -or -type d -or -type l | xargs -t sudo svn add
```

```console
sudo svn ci /etc -m"SSSD setting"
```

これで、クライアントマシンに SSSD が出来ました。ユーザーを LDAP で管理して、オフラインでもログインできるようになりました。やったね:thumbsup_tone1: