Начальные условия а) AD домен (для определенности FOO.EXAMPLE) с единственным контроллером на samba 4.8.5, б) клиенсткая машина с ALT (sisyphus или p8), для определенности ее имя cl3 Действия На клиентской машине 1) установливаем необходимые пакеты: sudo apt-get install -y task-auth-ad-sssd 2) создаем /etc/krb5.conf вида [libdefaults] dns_lookup_kdc = true dns_lookup_realm = false rdns = false default_realm = FOO.EXAMPLE ticket_lifetime = 24h renew_lifetime = 7d forwardable = true default_ccache_name = KEYRING:persistent:%{uid} 3) создаем /etc/resolv.conf такого вида domain foo.example nameserver ${DC_IP} где ${DC_IP} -- IPv4 адрес контроллера домена 4) создаем /etc/samba/smb.conf такого содержания [global] security = ads realm = FOO.EXAMPLE workgroup = FOO netbios name = CL3 kerberos method = system keytab wins support = no template shell = /bin/bash idmap config * : range = 10000-20000000 idmap config * : backend = tdb 5) задаем имя хоста sudo hostname cl3.foo.example 6) выполняем команду sudo system-auth write ad FOO.EXAMPLE cl3 FOO administrator $ADMIN_PASSWD где $ADMIN_PASSWD -- пароль администратора домена Ожидаемый результат: (кроме всего прочего) в DNS добавляется A запись для клиентской машины Наблюдаемый результат: # host cl3.foo.example Host cl3.doo.example not found: 3(NXDOMAIN) При этом nss и kerberos аутентификация работает: # getent passwd administrator administrator:*:597600500:597600513:Administrator:/home/FOO.EXAMPLE/administrator:/bin/bash Предполагаемая причина Точнее, их две 1) system-auth игнорирует ошибки `net ads join` (см. [1]): $net_cmd ads join -U"$user%$password" | grep -v '^Using short domain name' shell вернет код выхода grep, а не net 2) следующий за этим фрагмент кода (см. [2]) заведомо неработоспособен: if [ -n "$host_name" ]; then $net_cmd ads dns register -U"$user%$password" "$FQDN" fi Переменная FQDN не определена в текущей функции. Она определена в функции set_hostname как local, см. [3] [1] http://git.altlinux.org/gears/a/alterator-auth.git?p=alterator-auth.git;a=blob;f=alterator-auth/sbin/system-auth;h=d0f2a068a7a80effcee6c22190f03e83b4f57f73;hb=8c9920918c2f4617cbe1e208850b5af586fb0da0#l516 [2] http://git.altlinux.org/gears/a/alterator-auth.git?p=alterator-auth.git;a=blob;f=alterator-auth/sbin/system-auth;h=d0f2a068a7a80effcee6c22190f03e83b4f57f73;hb=8c9920918c2f4617cbe1e208850b5af586fb0da0#l523 [3] http://git.altlinux.org/gears/a/alterator-auth.git?p=alterator-auth.git;a=blob;f=alterator-auth/sbin/system-auth;h=d0f2a068a7a80effcee6c22190f03e83b4f57f73;hb=8c9920918c2f4617cbe1e208850b5af586fb0da0#l454 Проверка гипотезы # net ads leave -Uadministrator%t0psecret # hostname cl3.foo.example # net ads join -Uadministrator%t0psecret Enter administrator's password: ldb: unable to stat module /usr/lib64/samba/ldb : No such file or directory Using short domain name -- FOO Joined 'CL3' to dns domain 'foo.example' DNS Update for cl3.foo.example failed: ERROR_DNS_UPDATE_FAILED DNS update failed: NT_STATUS_UNSUCCESSFUL # echo $? 0 (ага, NT_STATUS_UNSUCCESSFUL, но exit 0) Заметим, что в выхлопе `net ads join` кроме строки 'Using short domain name' есть еще что-то, поэтому grep -q '^Using short domain name' вернет 0, и далее выполнится net ads dns register -Uadministrator%t0psecret "" которая завершится с ошибкой No DNS domain configured for . Unable to perform DNS Update. DNS update failed! (которую успешно проигнорирует system-auth)
net_ads_join вызывает _net_ads_join_dns_updates [1] чтобы создать/обновить (A) DNS запись хоста. net_update_dns_ext /* iplist = NULL, num_addrs = 0, remove_host = false */ net_update_dns /* hostname = NULL */ _net_ads_join_dns_updates net_ads_join net_update_dns_ext пытается определить имя хоста из netbios name [2]. Как правило netbios name совпадает с кратким именем хоста (максимальная длина netbios name -- 15 байт, не всякое допустимое DNS имя влезет), потому net_update_dns_ext пытается "угадать" полное (FQDN) имя. Делает это функция name_to_fqdn [3], которая использует getaddrinfo, а следовательно, DNS. Но в DNS еще нет A записи для клиентского хоста, ее как раз и должна создать net_update_dns_ext. Потому net_update_dns_ext пытается использовать краткое имя хоста, из-за чего net_update_dns_internal возвращает ошибку NT_STATUS_INVALID_PARAMETER [4] Т.к. у `net ads join` нет аргумента, позволяющего явно указать FQDN хоста, то попытка `net ads join` создать (A) DNS запись обречена на провал. Есть 2 возможных решения: 1) запускать `net ads join --no-dns-updates`, а затем `net ads dns register` 2) научить `net ads join` использовать имя Kerberos домена в качестве DNS домена, если не удалось угадать DNS домен другим образом. 2) займет явно больше времени (правки в `source3/` upstream принимает крайне неохотно, только для исправления каких-то серьезных проблем) [1] http://git.altlinux.org/gears/s/samba-DC.git?p=samba-DC.git;a=blob;f=source3/utils/net_ads.c;h=c83aced9f812380df85682c08e29de48a1794d6b;hb=ec86b464b83e7e5d6163f54fca6869d855a32910#l1632 [2] http://git.altlinux.org/gears/s/samba-DC.git?p=samba-DC.git;a=blob;f=source3/utils/net_ads.c;h=c83aced9f812380df85682c08e29de48a1794d6b;hb=ec86b464b83e7e5d6163f54fca6869d855a32910#l1296 [3] http://git.altlinux.org/gears/s/samba-DC.git?p=samba-DC.git;a=blob;f=source3/lib/util.c;h=5f786f95d3e2eccd113a39eec585d195713c5747;hb=ec86b464b83e7e5d6163f54fca6869d855a32910#l1682 [4] http://git.altlinux.org/gears/s/samba-DC.git?p=samba-DC.git;a=blob;f=source3/utils/net_ads.c;h=c83aced9f812380df85682c08e29de48a1794d6b;hb=ec86b464b83e7e5d6163f54fca6869d855a32910#l1156
Created attachment 7796 [details] patch
task 214012 (http://git.altlinux.org/tasks/214012/logs/events.1.1.log)
Исправлено в 0.37-alt1.