能書き
自宅サーバー構築譚:基本構想に基づく自宅サーバー構築、Ubuntu22.04LTSインストールその2の続きです。Hyper-Vに構築したクライアントマシンもどき(LubuntuではなくてXubuntu)も使用します。
LDAP と SSSD でログイン設定しようとした所、クライアントが Lubuntu の場合は上手くいきませんでした。ユーザー名を自由入力できないのでは手も足も出ません。
そこでクライアントマシンを Xubuntu にしたら上手くいったので、その手順を記録します。と言っても今までの記事からの抜粋ですが。記事2つに分散してしまったので、必要な情報だけをここに纏めます。
目標
- SSSD を利用したログイン
- その為の認証局の信頼
参考文献
-
自宅サーバー構築譚:LDAPサーバー OpenLDAP over TLS - Qiita
- この記事のサーバー側操作が完了している事が前提です。
-
自宅サーバー構築譚:LDAPサーバー OpenLDAP・SSSD を利用したログイン - Qiita
- LDAP サーバー構築後はユーザーを登録しておいて下さい。
スナップショット
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 インストールと設定
インストール
クライアントマシンに関連パッケージをインストールします。
sudo apt install -y sssd-ldap
/etc
は下記のように変化しました。
$ 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 登録します。
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 とします。
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
___
sudo chmod 600 /etc/sssd/sssd.conf
この後に SSSD サービスを開始する事を忘れないように。
sudo systemctl start sssd
起動を確認します。
systemctl status sssd
最後に、ホームディレクトリの自動作成を有効にします。
sudo pam-auth-update --enable mkhomedir
オレオレ認証局を信頼
鍵の配置
秘密鍵と公開鍵は、既に作ってあるという事にします。作り方は以前の記事を参照して下さい。
この手順に従うと、各鍵の配置は下記のようになります。
認証局:
- 秘密鍵
/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
内の、クライアントから操作できるサブディレクトリに置きます。ついでにファイル名を調整。
sudo cp -p /opt/CA/demoCA/pki/ca.crt /srv/publickey/publickey/demoCA.crt
cp コマンドに-p
オプションを付けると、更新日時などを元ファイルと同一にしてくれます。逆に指定しない場合は、コピーした日時が更新日時になってしまいます。大抵は問題無いと思いますけども。私は気になるので。
publickey ユーザーが操作できるように権限を調整します。
cd /srv/publickey/publickey/
sudo chgrp publickey demoCA.crt
sudo chmod g+r demoCA.crt
権限を確認。
# ls -l demoCA.crt
-rw-r----- 1 root publickey 1184 Mar 10 09:05 demoCA.crt
ここからクライアント側の操作になります。以前、公開鍵送付専用の sftp ユーザーを作成しましたので、それを使用してサーバー上の鍵publickey/demoCA.crt
を持ってきます。
まずは適当な作業用ディレクトリに移動して、それから sftp を起動。持ってきた後はクライアント側の責任で削除しておきましょう。公開鍵取得の印の代わりです。
cd
sftp publickey@secondary
cd publickey
get demoCA.crt
rm demoCA.crt
exit
ファイルの権限は取得したユーザーになっているので、これを一般的な/etc
内ファイルの権限に変えておきます。
sudo chown root:root demoCA.crt
sudo chmod 644 demoCA.crt
確認。
$ ls -l demoCA.crt
-rw-r--r-- 1 root root 1184 Apr 2 09:00 demoCA.crt
オレオレ認証局を信頼する
Ubuntuにおいて証明書の信頼とは、下記手順で操作する事、らしいです。
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
ディレクトリに設定されます。
ls -l /etc/ssl/certs/ | grep demoCA
ls -l /etc/ssl/certs/ca-certificates.crt
Ubuntu では、信頼する認証局の一覧表は既に設定済のようです。
grep TLS_CACERT /etc/ldap/ldap.conf
実行結果はこんな風になります。
$ grep TLS_CACERT /etc/ldap/ldap.conf
TLS_CACERT /etc/ssl/certs/ca-certificates.crt
クライアントマシン再起動
ここまで出来たらマシンを再起動します。GUI で操作するも良し、コマンドラインでreboot
するも良し。
動作確認
参考文献の LDAP へのユーザー登録手順に従っていると、ユーザー taro パスワード Ma9H%6jg となっています。これでログインできる事を確認します。
オンラインでログイン
最初に、今まで通りのユーザーでログインできる事を確認して下さい。ここがしくじっていると目も当てられません。
それから taro を認識している事を、下記コマンドで確認しましょう。
getent passwd taro
id taro
成功すれば下記のような結果になります。
$ getent passwd taro
taro:*:10000:10000:taro:/home/taro:/bin/bash
$ id taro
uid=10000(taro) gid=10000(taro) groups=10000(taro)
コンソールでログイン認証を確認。
sudo login
ここまで成功すれば大丈夫でしょう。一度ログアウトして、GUIで taro がログインできる事を確認します。
まずユーザー名、またはその右の▼ボタンをクリック。
表示されるドロップダウンメニューから「Other...」を選択。
ユーザー名とパスワードを入力して「Log In」ボタン、または Enter キーを押します。
ログイン成功。
一旦ログアウトします。
オフラインでログイン
SSSD が正しく利いていれば、LDAP サーバーとの通信が途絶してもログインできる筈です。
ログアウトした状態で、ホストマシンの操作などで通信を切断します。それからログインを試みてみましょう。
ここでは Hyper-V ゲスト設定の操作で、ネットワークを切断します。
Hyper-V ゲストマシンのメニュー > ファイル > 設定...
設定画面 > ハードウェア > ネットワークアダプター
仮想スイッチのドロップダウンメニューから「接続されていません」を選択して OK ボタン。
Xubuntu のログイン画面で、もう一度ログインします。
ログインできました!
ここで Xubuntu はネットワークが切断されている事を確認してみます。
Ctrl+Alt+T でターミナルを開いて、下記のコマンドを実行します(172.16.1.3 は LDAP サーバーの IP アドレス)
ping 172.16.1.3
実行結果はこうなる筈。
$ ping 172.16.1.3
ping: connect: Network is unreachable
確かにネットワークは接続されていません!
以上で、一度ログインしてしまえばオフラインでもログインできる事を確認できました。
仕舞い
動作確認できたので/etc
を Subversion コミットします。
sudo svn st /etc
実行結果。
$ 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
新規ファイルを追加してコミットします。
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 setting"
これで、クライアントマシンに SSSD が出来ました。ユーザーを LDAP で管理して、オフラインでもログインできるようになりました。やったね