#author("2024-10-01T12:08:30+00:00","default:sysosa","sysosa") #author("2024-10-01T12:10:28+00:00","default:sysosa","sysosa") samba-adのアカウント情報を利用してログイン認証できるようにしてみます. samba-adドメインに参加して krb5.keytab ファイルを得れば SSO(シングルサインオン) とかもできますが、ログイン認証のみ依存するなら krb5.keytab ファイルは必須ではないです. また samba-adをldapサーバと見做して接続することもできます. &ref(2024y10m01d_122304613.png,nolink,noborder); &size(10){参加していたドメインから撤退する [[samba/Linux離脱]]}; ***下準備 [#ufe78030] &color(magenta){chaperone};のsamba-adと連携させるLinuxマシンは下記とします。 |BGCOLOR(YELLOW):ホスト名|BGCOLOR(YELLOW):IPアドレス|BGCOLOR(YELLOW):OS|BGCOLOR(YELLOW):参照DNS|BGCOLOR(YELLOW):参照NTP| |samba-client|192.168.0.151|RokcyLinux 9.4|ad.chaperone.jp|ad.chaperone.jp| /etc/hostsファイルは、自身のIPを入れて、FQDNと短縮名 $(hostname -s) を入れる. &size(10){短縮名がないと「net ads join」の際にDNSに登録されない}; #code(nonumber){{ [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の調整を行います #code(nonumber){{ [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 ~]# }} ***ドメインへの参加 [#ib38591b] ドメイン自体への参加は「net ads join」コマンドで行います. その後、samba-adからユーザ情報の取得/認証は複数の選択肢(経路)があります. &size(10){設定自体はauthselect/authconfigコマンドで行います}; #code(nonumber){{ 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を採用する &size(10){ユーザ毎に/homeが/home1とか/home2とかになるならrfc2307. ユーザAはbash、ユーザBがzshとかならrfc2307が必要}; &size(10){ならrfc2307対応にしておけば?ってなるけど、それぞれ設定する必要があるのが面倒なら簡易なwinbind:ridが楽かな}; ~ ***winbindで参加させてみる(backendをridで) [#i12f9ae3] まずは「/etc/samba/smb.conf」を修正します. 下記はwinbind経由でbackendを「rid」にしてます #code(nonumber){{ [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 }} これで #code(nonumber){{ [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 }} っでユーザ情報を引いてみる #code(nonumber){{ [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」で矯正できる. ***winbindで参加させてみる(backendをadで) [#qcd53ec8] 変更の前に前段でのデータキャッシュをクリアさせます #code(nonumber){{ [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」で修正します #code(nonumber){{ [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を再起動させます #code(nonumber){{ [root@samba-client ~]# systemctl restart winbind }} っでアカウント情報は #code(nonumber){{ [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らが反映されました. ***sssdで参加(id_providerはad)なら [#e26f2978] samba-clientをドメインに参加させる際に「/etc/krb5.keytab」をsamba-adから頂けるようにします. &size(10){krb5.keytabがあればSSOとか使えます}; #code(nonumber){{ [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」で確認できます。 &size(10){「krb5-workstation」パッケージが必要}; そしてsssdの設定を施します sssdの設定ファイル( /etc/sssd/sssd.conf )を作り上げます. &color(red){*};&size(10){初めから用意されてません}; #code(nonumber){{ [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を有効にします #code(nonumber){{ [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 ~]# }} っで引けるか確認 #code(nonumber){{ [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 ~]# }} ***sssdで参加(id_providerはldap)なら [#r2eb66d1] こちらの場合、別にchaperone.jp ドメインに入ってなくても DNS が samba-ad 先でもなくても構わない. #code(nonumber){{ [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 サーバと見立てて認証依頼をさせてみる #code(nonumber){{ [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で個別に修正/追加する必要があるみたい... っで引けるか確認 #code(nonumber){{ [root@samba-client ~]# getent passwd illya illya:*:1002:2000:Illyasviel von Einzbern:/home/illya:/bin/bash [root@samba-client ~]# }} ***(番外)nslcdで接続 [#k76222e3] こちらはrockylinux9でnslcdがサポート外になったので使えないです... 参照[[samba/LDAP#wed2b142]] ***備考 [#p2e38ca0] sssdにはキャッシュがあり、キャッシュをクリアにするには sssd を止めてキャッシュデータベースを削除して、sssdを再起動する #code(nonumber){{ [root@c105 ~]# systemctl stop sssd [root@c105 ~]# rm -rf /var/lib/sss/db/* [root@c105 ~]# systemctl start sssd }} な感じで。 あるいは sss_cache なるコマンドで対処する sssdでは getent は #code(nonumber){{ (&(objectclass=user)(uid=*)(uidNumber=*)(gidNumber=*)) }} に適合したユーザが認証対象となる。またグループでは #code(nonumber){{ (&(objectclass=group)(cn=*)(&(gidNumber=*)(!(gidNumber=0)))) }} である。 ldapsearch を使えば誰がログインユーザとして拾われるかが分かる。 #code(nonumber){{ [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=*))' }} &color(red){*};&size(10){「-w *******」は、administratorのパスワード}; ***めも [#q4e2e60e] 「net ads join osName=rockyLinux osVer=9.2 -Uadministrator」の後にsamba-adで登録されたのかの確認は 「samba-tool computer list」 「samba-tool dns query ad chaperone.jp @ A」 で確認できる &color(white,blue){注意}; samba-internal dnsの正引きには登録されるが、逆引きはゾーンが用意されてても登録されない ***めも [#mf4383a7] 「net ads join osName=rockyLinux osVer=9.2 -Uadministrator」の後に #code(nonumber){{ 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にミスがあるかも. 「&color(red){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」からもエントリーが消える. これが原因?