samba-adのアカウント情報を利用してログイン認証できるようにしてみます.
samba-adドメインに参加して krb5.keytab ファイルを得れば SSO(シングルサインオン) とかもできますが、ログイン認証のみ依存するなら
krb5.keytab ファイルは必須ではないです. また samba-adをldapサーバと見做して接続することもできます.
参加していたドメインから撤退する samba/Linux離脱
chaperoneのsamba-adと連携させるLinuxマシンは下記とします。
ホスト名 | IPアドレス | OS | 参照DNS | 参照NTP |
samba-client | 192.168.0.151 | RokcyLinux 9.4 | ad.chaperone.jp | ad.chaperone.jp |
/etc/hostsファイルは、自身のIPを入れて、FQDNと短縮名 $(hostname -s) を入れる. 短縮名がないと「net ads join」の際にDNSに登録されない
[root@samba-client ~]# echo `hostname -I` `hostname`.chaperone.jp `hostname -s` >> /etc/hosts
[root@samba-client ~]# echo "192.168.0.131 ad.chaperone.jp ad" >> /etc/hosts
[root@samba-client ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.151 samba-client.chaperone.jp samba-client
192.168.0.131 ad.chaperone.jp ad
[root@samba-client ~]#
次に時計合わせとkerberosの調整を行います
[root@samba-client ~]# echo "pool ad iburst" > /etc/chrony.conf
[root@samba-client ~]# systemctl restart chronyd
[root@samba-client ~]# mv /etc/krb5.conf /etc/krb5.conf.old
[root@samba-client ~]# vi /etc/krb5.conf
[libdefaults]
default_realm = CHAPERONE.JP
dns_lookup_realm = false
dns_lookup_kdc = true
[root@samba-client ~]#
ドメイン自体への参加は「net ads join」コマンドで行います.
その後、samba-adからユーザ情報の取得/認証は複数の選択肢(経路)があります. 設定自体はauthselect/authconfigコマンドで行います
samba-ad
+--- sssd --> /etc/sss/sssd.conf を修正 sssd を起動
| +-- id_provider = ad
| +-- id_provider = ldap <-- samba-adをLDAPサーバと見做す
|
+--- winbind --> /etc/samba/smb.confを修正 winbindd を起動
+-- backend:ad <-- rfc2307が使える
+-- backend:rid <-- rfc2307なし
samba-adのrfc2307(uid/gid/homedir/loginShellら)を有効活用するならsssd系かwinbidでbackendにadを採用する
rfc2307を利用しない(ホームディレクトリは/homeに集約、loginShellは皆共通)ならwinbindでbackendにridを採用する
ユーザ毎に/homeが/home1とか/home2とかになるならrfc2307. ユーザAはbash、ユーザBがzshとかならrfc2307が必要
ならrfc2307対応にしておけば?ってなるけど、それぞれ設定する必要があるのが面倒なら簡易なwinbind:ridが楽かな
まずは「/etc/samba/smb.conf」を修正します. 下記はwinbind経由でbackendを「rid」にしてます
[root@samba-client ~]# dnf install samba-winbind samba-common samba-common-tools
[root@samba-client ~]# vi /etc/samba/smb.conf
[global]
workgroup = CHAPERONE
security = ADS
realm = CHAPERONE.JP
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config CHAPERONE : backend = rid
idmap config CHAPERONE : range = 10000-999999
winbind use default domain = true
これで
[root@samba-client ~]# net ads join osName=rockyLinux osVer=9.4 -Uadministrator
[root@samba-client ~]# authselect current
No existing configuration detected.
[root@samba-client ~]#
[root@samba-client ~]# authselect select winbind --force
[root@samba-client ~]# systemctl enable winbind --now
っでユーザ情報を引いてみる
[root@samba-client ~]# id illya
uid=11111(illya) gid=10513(domain users) groups=10513(domain users),11111(illya)
[root@samba-client ~]# getent passwd illya
illya:*:11111:10513::/home/CHAPERONE/illya:/bin/false
[root@samba-client ~]#
samba/ユーザ登録で登録したuid/gidが適用されていない. 加えてホームディレクトリは「/home/$DOMAIN/<user>」でlogin shellが「/bin/false」となる。
後半2つはsamba-clientの「/etc/samba/smb.conf」にて「template shell = /bin/bash」「template homedir = /home/%U」で矯正できる.
変更の前に前段でのデータキャッシュをクリアさせます
[root@samba-client ~]# systemctl stop winbind
[root@samba-client ~]# net cache flush
[root@samba-client ~]# rm -f /var/lib/samba/*.tdb
[root@samba-client ~]# rm -f /var/lib/samba/group_mapping.ldb
っで「/etc/samba/smb.conf」を「backend:ad」で修正します
[root@samba-client ~]# vi /etc/samba/smb.conf
[global]
workgroup = CHAPERONE
security = ADS
realm = CHAPERONE.JP
idmap config * : backend = tdb
idmap config * : range = 30001-30010
idmap config CHAPERONE:backend = ad
idmap config CHAPERONE:schema_mode = rfc2307
idmap config CHAPERONE:range = 1000-30000
idmap config CHAPERONE:unix_nss_info = yes
idmap config CHAPERONE:unix_primary_group = yes
winbind use default domain = true
っでwinbindを再起動させます
[root@samba-client ~]# systemctl restart winbind
っでアカウント情報は
[root@samba-client ~]# id illya
uid=1002(illya) gid=2000(fate) groups=2000(fate)
[root@samba-client ~]# getent passwd illya
illya:*:1002:2000:Illyasviel von Einzbern:/home/illya:/bin/bash
[root@samba-client ~]#
っとsamba-adで指定したuid/gidやらホームディレクトリ、login shellらが反映されました.
samba-clientをドメインに参加させる際に「/etc/krb5.keytab」をsamba-adから頂けるようにします. krb5.keytabがあればSSOとか使えます
[root@samba-client ~]# dnf install sssd-ad samba-common samba-common-tools
[root@samba-client ~]# cat /etc/samba/smb.conf
[global]
workgroup = CHAPERONE
security = ADS
realm = CHAPERONE.JP
kerberos method = secrets and keytab
[root@samba-client ~]# net ads join osName=rockyLinux osVer=9.4 -Uadministrator
[root@samba-client ~]# ls -l /etc/krb5.keytab
-rw-------. 1 root root 1318 Jun 23 02:03 /etc/krb5.keytab
[root@samba-client ~]#
中身は「klist -ke」で確認できます。 「krb5-workstation」パッケージが必要
そしてsssdの設定を施します
sssdの設定ファイル( /etc/sssd/sssd.conf )を作り上げます. *初めから用意されてません
[root@samba-client ~]# cat << _EOT_ > /etc/sssd/sssd.conf
[sssd]
services = nss, pam
config_file_version = 2
domains = chaperone.jp
[domain/chaperone.jp]
id_provider = ad
auth_provider = ad
access_provider = ad
dyndns_update = false
enumerate = True
krb5_keytab = /etc/krb5.keytab
ldap_id_mapping = False
ldap_sasl_authid = samba-client\$@CHAPERONE.JP
_EOT_
[root@samba-client ~]#
[root@samba-client ~]# chmod 600 /etc/sssd/sssd.conf
っでathselectでsssdを有効にします
[root@samba-client ~]# authselect select sssd --force
[root@samba-client ~]# ps -ef |grep sss
root 10774 1 0 02:37 ? 00:00:00 /usr/libexec/sssd/sssd_kcm --uid 0 --gid 0 --logger=files
root 10784 915 0 02:40 pts/0 00:00:00 grep --color=auto sss
[root@samba-client ~]#
っで引けるか確認
[root@samba-client ~]# id illya
uid=1002(illya) gid=2000(fate) groups=2000(fate)
[root@samba-client ~]# getent passwd illya
illya:*:1002:2000:Illyasviel von Einzbern:/home/illya:/bin/bash
[root@samba-client ~]#
こちらの場合、別にchaperone.jp ドメインに入ってなくても DNS が samba-ad 先でもなくても構わない.
[root@samba-client ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search sybyl.local
nameserver 192.168.0.3
[root@samba-client ~]# hostname -f
samba-client.sybyl.local
[root@samba-client ~]#
っとdns参照先も所属ドメインも全く異なります。
これで samba-ad を ldap サーバと見立てて認証依頼をさせてみる
[root@samba-client ~]# dnf install sssd-ldap sssd-tools
[root@samba-client ~]# vi /etc/sssd/sssd.conf
[sssd]
services = nss, pam
domains = default
[nss]
[domain/default]
id_provider = ldap
ldap_uri = ldaps://192.168.0.131
ldap_search_base = dc=chaperone,dc=jp
ldap_id_use_start_tls = True
ldap_tls_reqcert = never
ldap_default_bind_dn = cn=administrator,cn=Users,dc=chaperone,dc=jp <-- 別のアカウントでも大丈夫.
ldap_schema = rfc2307bis
ldap_user_home_directory = unixHomeDirectory
[root@samba-client ~]# chmod 600 /etc/sssd/sssd.conf
[root@samba-client ~]# sss_obfuscate -d default <--この「default」はsssd.confの[domain/default]を意図します
Enter password: <-- cn=administrator,cn=Users,dc=chaperone,dc=jp のパスワードが必要です
Re-enter password:
[root@samba-client ~]# systemctl start sssd
これで完了ですが、ここで引けるユーザには「posixAccount」と言われる objectclass が必要です.
これを持っていないユーザは認証されないです。
「posixAccount」を設けるには...ldapAdminで個別に修正/追加する必要があるみたい...
っで引けるか確認
[root@samba-client ~]# getent passwd illya
illya:*:1002:2000:Illyasviel von Einzbern:/home/illya:/bin/bash
[root@samba-client ~]#
こちらはrockylinux9でnslcdがサポート外になったので使えないです...
参照samba/LDAP#wed2b142
sssdにはキャッシュがあり、キャッシュをクリアにするには
sssd を止めてキャッシュデータベースを削除して、sssdを再起動する
[root@c105 ~]# systemctl stop sssd
[root@c105 ~]# rm -rf /var/lib/sss/db/*
[root@c105 ~]# systemctl start sssd
な感じで。
あるいは sss_cache なるコマンドで対処する
sssdでは getent は
(&(objectclass=user)(uid=*)(uidNumber=*)(gidNumber=*))
に適合したユーザが認証対象となる。またグループでは
(&(objectclass=group)(cn=*)(&(gidNumber=*)(!(gidNumber=0))))
である。
ldapsearch を使えば誰がログインユーザとして拾われるかが分かる。
[root@c105 ~]# yum install openldap-clients
[root@c105 ~]# ldapsearch -h c.sybyl.local -D "CN=administrator,CN=Users,DC=SYBYL,dc=local" -w ******* \
-b "dc=sybyl,dc=local" '(&(objectclass=user)(uid=*)(uidNumber=*)(gidNumber=*))'
*「-w *******」は、administratorのパスワード
「net ads join osName=rockyLinux osVer=9.2 -Uadministrator」の後にsamba-adで登録されたのかの確認は
「samba-tool computer list」
「samba-tool dns query ad chaperone.jp @ A」
で確認できる
注意 samba-internal dnsの正引きには登録されるが、逆引きはゾーンが用意されてても登録されない
「net ads join osName=rockyLinux osVer=9.2 -Uadministrator」の後に
DNS Update samba-nfs.chaperone.jp failed: ERROR_DNS_UPDATE_FAILED
DNS update failed: NT_STATUS_UNSUCCESSFUL
とメッセージが表示されることがある。これはsamba-ad(samba-internal dns)に既にエントリーがあるか、samba-client側のFQDNにミスがあるかも.
「failed」と表記されるが、「Active Directory ユーザとコンピュータ」には登録される
FQDNのミスは「/etc/hosts」ファイルに「`hostname -i` `hostname -f` `hostname -s`」とすると回避される
samba-ad側で「samba-tool computer delete xxx」の後に再度クライアント側で「net ads join」操作すると発生します.
解消方法は一度samba-ad側で「samba-tool dns add」で手動でsamba-clientを追加して「samba-tool dns delete」で削除します. その後「net ads join」操作は問題なくなる.
「samba-tool computer delete xxx」とすると「samba-tool dns query ad chaperone.jp @ A」からもエントリーが消える. これが原因?