Windows と unix 系OSでユーザー管理を共通化する方法として Active Directory を利用する方法がある。
ドメインコントローラ―には Windows server を使っても良いが、Samba を利用することもできる。
Samba
Active Directory Domain Controller および member サーバー
Samba の設定については、Samba Wiki の
Samba を Active Directory ドメインコントローラーとして設定する記事と、
メンバーサーバーとして設定する記事
でだいたいは足りると思われる。
winbind と pam によるユーザー認証
Samba を用いる場合、Samba についてくる winbindd で認証を行う。そのための pam の設定は FreeBSD では以下のようになる。
/etc/pam.d/system:
auth sufficient pam_winbind.so
auth required pam_unix.so no_warn try_first_pass nullok
account sufficient pam_winbind.so
account required pam_login_access.so
account required pam_unix.so
session required pam_lastlog.so no_fail
session required pam_xdg.so
password sufficient pam_winbind.so
password required pam_unix.so no_warn try_firstpass
Samba による認証の問題点
ここまでの設定だと DC がオンラインでないと認証ができない。
/usr/local/etc/smb4.conf に
winbind offline logon = yes
/etc/security/pam_winbind.conf に
cached_login = yes
を追加することで認証情報をキャッシュしてオフラインでもログオンできるようになるが、
FreeBSD forum の記事 によれば、オンラインだが DC が見つからない場合にログオンできない問題がある。
sssd
この問題に対応できるのが sssd で、現在 FreeBSD ports には security/sssd2 が入っている。
sssd は Kerberos の実装は MIT にしか対応していないため、Heimdal に設定してインストールしている ports があったら MIT でビルドしなおしてインストールする必要がある。
realmd を利用した初期設定
samba を利用して手動で設定することもできるが、
おすすめは net-mgmt/realmd を利用した自動設定である。
必須ではないが、realm discover コマンドでドメインが検出できるか確認する。
なお、realmd は dbus に依存しており、dbus サービスを動かしておく必要がある。
# realm discover EXAMPLE.COM
example.com
type: kerberos
realm-name: EXAMPLE.COM
domain-name: example.com
configured: no
server-software: active-directory
client-software: sssd
required-package: sssd2
required-package: adcli
required-package: samba416
required-package で設定および動作に必要なソフトウェアが示されているが、adcli と samba416 は
sssd2 の依存関係でインストールされているはずである。
その後、realm join コマンドでドメインに join するとともに、各種設定を済ませる。
# realm join EXAMPLE.COM
Active Directory の Administrator パスワードの入力が要求されるが、入力すると
/etc/krb5.conf、/etc/krb5.keytab、/usr/local/etc/sssd (とその下位ファイル)が生成されているはずである。
必要であれば、/usr/local/etc/sssd/sssd.conf を編集する。
例えば、私の場合は AD ドメインはひとつしか運用していないので、次のように変更を入れている。
generated:
[sssd]
domains = oikumene.ukehi.net
config_file_version = 2
services = nss, pam, ifp
[domain/oikumene.ukehi.net]
default_shell = /bin/sh
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = OIKUMENE.UKEHI.NET
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = oikumene.ukehi.net
編集後
[sssd]
domains = oikumene.ukehi.net
config_file_version = 2
services = nss, pam, ifp
[domain/oikumene.ukehi.net]
default_shell = /bin/sh
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = OIKUMENE.UKEHI.NET
realmd_tags = manages-system joined-with-adcli
id_provider = ad
auth_provider = ad
access_provider = ad
chpass_provider = ad
override_homedir = /home/%u
ad_domain = oikumene.ukehi.net
use_fully_qualified_names = False
ad_maximum_account_password_age = 0
ldap_id_mapping = True
ldap_schema = rfc2307
ldap_idmap_range_min = 10000
ldap_idmap_autorid_compat = True
以下、解説を少々。
cache_credentials:
True にすると認証情報をキャッシュするのでオフライン時も認証が可能である。
sssd を入れるのはこの設定ができるからと言っても過言ではない。
auth_provider, access_provider, chpass_provider:
よくわかんないけど、とりあえず ad にしておこう。詳しくは sssd-ad(8) を読んでね。
override_homedir:
これは、私の Active Directory RFC2307 なんちゃらの設定が古いのを残さざるを得なくて、
/usr/home となっているから上書きしている。
また、複数ドメインを運用している場合は @domain をつける必要があるかもしれないが、
私はそんなのはなくて良いので簡単のために単に /home/user にしている。
use_fully_qualified_names:
False に設定することで、getent などで表示されるユーザー名を user@domain から user
と短い形式にして unix ぽくできる。
ldap_ip_mapping と関連オプション:
Samba の設定の idmap config なんちゃらと同様の設定を行う。
ただし、全く同じにはできないので、マッピングされる uid、gid は winbind によるものとは通常異なる。
ldap_idmap_autorid_compat を True にするとより winbind っぽくなるが、全く同じには以下略。
sssd と pam によるユーザー認証
/etc/nsswitch.conf の以下の行を編集する
group: files sss
netgroup: files sss
passwd: files sss
services: files sss
FreeBSD ではドキュメントと異なり pam の設定は自動では変更されないので、/etc/pam.d/system と
/etc/pam.d/sshd を編集する。
pam_unix(8) の no_warn に対応するのが quiet であり、try_first_pass は実装されていないので
forward_pass または use_first_pass を使う。
どちらを使うかは単純で、auth 行で pam_sss.so が最初に来ていたら、forward_pass、
2番目以降なら use_first_pass を指定すればよい。
auth sufficient pam_sss.so quiet forward_pass
auth requied pam_unix.so no_warn try_first_pass
account sufficient pam_sss.so ignore_unknown_user
account required pam_login_access.so
account required pam_unix.so
session optional pam_sss.so
session required pam_lastlog.so no_fail
session required pam_xdg.so
password sufficient pam_sss.so quiet use_authtok
password required pam_unix.so no_warn try_first_pass
また、/etc/pam.d/login と /etc/pam.d/sshd あと必要なら /etc/pam.d/xdm に次の設定を追加する。
詳しくは [ホームディレクトリを自動で作成したい](https://cugel.hatenablog.com/entry/2020/08/10/232231] 参照のこと。
session optional pam_sss.so
session optional pam_mkhomedir.so
session required pam_lastlog.so no_fail
session required pam_xdg.so
テスト
getent passwd または id コマンドで情報が取れているかを確認後、su コマンドで su できるか確認するとよい。
ただし、root から su するとパスワードの入力がバイパスされるので、
shell が /bin/sh のシステムアカウントのどれかを経由する。
使わなくなった時の後始末
sssd は自分を DC として登録している(いないけど、なんかそんなことをしている)ので、
その PC を使わなくなった時は demote する必要がある。
この時も samba を利用する。
# samba-tool domain demote
しばしばあることではあるが、うっかり demote するのを忘れて PC を初期化するとか捨てるとかしてしまった場合は、他の DC で samba-tool を使って demote できる。
# samba-tool domain demote --remove-other-dead-server=COMPUTERNAME