Bug 35453 - system-auth write ad: не создаются (A) DNS записи для хоста
Summary: system-auth write ad: не создаются (A) DNS записи для хоста
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: alterator-auth (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: Anton V. Boyarshinov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-09-28 14:42 MSK by Alexey Sheplyakov
Modified: 2019-02-27 18:12 MSK (History)
2 users (show)

See Also:


Attachments
patch (3.24 KB, patch)
2018-10-02 16:51 MSK, Alexey Sheplyakov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Alexey Sheplyakov 2018-09-28 14:42:58 MSK
Начальные условия

а) 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)
Comment 1 Alexey Sheplyakov 2018-10-01 16:55:54 MSK
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
Comment 2 Alexey Sheplyakov 2018-10-02 16:51:02 MSK
Created attachment 7796 [details]
patch
Comment 3 Alexey Sheplyakov 2018-10-03 17:33:24 MSK
task 214012 (http://git.altlinux.org/tasks/214012/logs/events.1.1.log)
Comment 4 Andrey Cherepanov 2019-02-27 18:12:25 MSK
Исправлено в 0.37-alt1.