ActiveDirectory

【図解】Linux(CentOS)のsssdでKerberos認証+LDAP ~ssh認証の構成例とトラブルシュート~

やりたいこと

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 (最小限) インストールをします。以下を参照。

【図解】CentOS8 Streamのboot.isoでのminimalインストール with [VirtualBOX Guest Additions]
CentOSはバージョン8で終了、今後は CentOS Stream へシフトす...
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 も同様に設定します。

属性エディタ―の表示の仕方は以下を参照下さい。

【属性エディタ】Active DirectoryのDNやSID等の属性を一覧表示,取得する方法
Active Directory の属性エディタ ActiveDirector...

次に、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

コメント

タイトルとURLをコピーしました