やりたいこと
Linux へのログイン時に Windows ActiveDirectory のドメインユーザを使って認証させたい。
使うのは RedHat 推奨の sssd。(nss-pam-ldapd は非推奨)
Kerberos (GSS-API) で認証・認可を行い、LDAP でアカウントの属性値 (uid や gid 等) の情報連携を行う。
なお、LDAP は GSS-API+SASL により暗号化する。(LDAPs ではないが効果は似ている)
検証環境
以下の構成で検証しました。ssh 接続時のドメインユーザ認証を最終目標にしていますが、この構成で CentOS のコンソールからドメインユーザでのログインも可能です。
- Windows Server 2019
- CentOS Stream release 8 (minimal インストール)
- Windows10Home 20H2 + TeraTerm
検証手順
1. 仮想サーバでドメインコントローラとドメインユーザの準備
まずは Windows Server 2019 をインストールし、その後 ActiveDirectory ドメインサービスの役割をインストールし、ドメインコントローラへ昇格させます。
ここではドメインを example.com とします。
その後、ユーザを追加します。ここではドメインユーザ exusr01 と exusr02 を追加します。
2. 仮想サーバで CentOS Stream の準備
minimal (最小限) インストールをします。以下を参照。
3. CentOS のホスト名変更
デフォルト localhost.localdomain になっているホスト名を example.com を含む FQDN に変更します。ここではホスト名を home.example.com とします。
# hostnamectl set-hostname home.example.com
4. CentOS に必要パッケージを追加
# dnf -y install realmd oddjob oddjob-mkhomedir sssd adcli krb5-workstation
5. CentOS にてドメイン参加
# realm join example.com
ドメイン admin の ID / パスワードを使います。
6. id コマンドでユーザが引けることを確認
# id exusr01@example.com
uid=1900801103(exusr01@example.com) gid=1900800513(domain users@example.com) groups=1900800513(domain users@example.com)
チューニング
1. ユーザのドメイン指定をなくす
デフォルトだとドメインを指定しないとユーザを引けません。
# id exusr01
id: `exusr01': no such user
ドメイン指定をなくしたい場合は /etc/sssd/sssd.conf の use_fully_qualified_names を True から false に変更します。
# vi /etc/sssd/sssd.conf ~~~ # use_fully_qualified_names = True use_fully_qualified_names = false ~~~ wq: # systemctl restart sssd # id exusr01 uid=1900801103(exusr01) gid=1900800513(domain users) groups=1900800513(domain users)
2. uid と gid を指定したい
デフォルトだと uid と gid は自動採番されます。
指定したい場合は AD ドメインユーザの任意の属性に uid, gid を設定し、sssd.conf でその属性を指定するよう設定します。ここでは uidNumber, gidNumber を使います。
属性エディタを表示し、uidNumber をダブルクリックし 5001 を設定します。
gidNumber も同様に設定します。
属性エディタ―の表示の仕方は以下を参照下さい。
次に、CentOS 側の sssd.conf で ldap_id_mapping を True から false に変更し、さらに ldap_user_uid_number と ldap_user_gid_number を追加します。
# vi /etc/sssd/sssd.conf ~~~ #ldap_id_mapping = True ldap_id_mapping = false ldap_user_uid_number = uidNumber ldap_user_gid_number = gidNumber ~~~ :wq ~~~
これで sssd を再起動すれば id が指定通りになりますが、キャッシュが残っているため、キャッシュを削除してから再起動します。
# rm -f /var/lib/sss/db/* # systemctl restart sssd # id exusr01 uid=5001(exusr01) gid=5001 groups=5001
必要に応じて group (gid=5001) を作成します。
# groupadd --gid 5001 exg
3. homeディレクトリのパスを変更したい
ユーザ ssh ログイン時のホームディレクトリは、デフォルトだと /home/[ユーザ名]@[ドメイン名] となっています。
[exusr01@home ~]$ pwd
/home/exusr01@example.com
変更するにはやはり /etc/sssd/sssd.conf を修正します。例えば以下の例では @[ドメイン名]を取り払います。
# vi /etc/sssd/sssd.conf ~~~ #fallback_homedir = /home/%u@%d fallback_homedir = /home/%u ~~~ :wq
再び ssh 接続すると、home ディレクトリが変わっています。
[exusr01@home ~]$ pwd
/home/exusr01
/home 配下ではない場所にを変更する際は SELinux の設定に気を付けて下さい。(無効化するかルール追加)
kerberos/sssdのトラブルシュート
以下コマンドでトラブルシュートする際はそれなりに影響があります。スナップショットやファイルバックアップなどをしてから実行しましょう。
ホスト間通信に関するトラブル
home.example.com とドメインコントローラとの通信時の認証および暗号化 (セキュアチャネル) に関連する情報は /etc/krb5.keytab に含まれます。
ただし、これはバイナリファイルなので klist 等を使って中身を確認します。
# klist -kte /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
5 2021-02-05T15:00:10 HOME$@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 HOME$@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 host/HOME@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 host/HOME@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 host/home.example.com@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 host/home.example.com@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 RestrictedKrbHost/HOME@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 RestrictedKrbHost/HOME@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 RestrictedKrbHost/home.example.com@EXAMPLE.COM (aes128-cts-hmac-sha1-96)
5 2021-02-05T15:00:10 RestrictedKrbHost/home.example.com@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
ホスト間の通信が怪しいときは realm leave + realm join でドメイン再参加します。再参加時は sssd.conf がデフォルトに戻るのでバックアップを取っておきます。
# cp -av /etc/sssd/sssd.conf /root/sssd.conf # realm leave example.com # cp -av /root/sssd.conf /etc/sssd/sssd.conf # systemctl restart sssd
ユーザ認証・チケットに関するトラブル
ユーザの認証情報のキャッシュは ccache (Credential Cache) と呼ばれ、ドメイン単位でファイルに保持されます。例えば今回では "/var/lib/sss/db/ccache_EXAMPLE.COM" に含まれます。
また、ユーザのチケット (認可情報) については /var/lib/sss/secrets/secrets.ldb に含まれます。これは同じディレクトリにある .secrets.mkey がマスターキーになっており、root 権限で .ldb を復号し、チケットのキャッシュを取り出します。
ユーザ認証などで不具合があったら /var/lib/sss/db/* や /var/lib/sss/secrets/secrets.ldb を削除 (一般には mv 移動) して sssd , sssd-kcm を再起動すると治る可能性があります。
# mkdir /var/lib/sss/db_bak # mv /var/lib/sss/db/* /var/lib/sss/db_bak/ # systemctl restart sssd # mv /var/lib/sss/secrets/secrets.ldb /var/lib/sss/secrets/secrets.ldb_bak # systemctl restart sssd-kcm
コメント