Dhcp и ad/samba4

Материал из OpenWiki
Перейти к: навигация, поиск

Затронутые темы: dhcp, kerberos, nsupdate, samba-tool

ВАЖНО: bind крайне желательно пересобрать по статье Samba4 named или доставить нужные пакеты (в debian - dlz-ldap-enum)

Особых проблем с установкой samba4 нет, но обновление DNS было серьезной проблемой…

(по мотивам http://blog.michael.kuron-germany.de/tag/active-directory/)

В MS AD зону предполагается обновлять используя kerberos, в samba4 это аккуратно переняли.

Начну с того, что для samba нужно добавить в конфиг:

[global]
 ...
 nsupdate command = /usr/bin/nsupdate -g
 ...
В samba4 можно теоретически создать обратную зону
samba-tool dns zonecreate <server> 1.168.192.in-addr.arpa
(https://lists.samba.org/archive/samba/2012-April/166820.html).

ISC DHCP по умолчанию не умеет работать с kerberos, но этому не сложно его научить.

  • переназначим действия для новых хостов в dhcp.conf:
subnet x.x.x.x netmask x.x.x.x {
...
on commit {
set noname = concat("dhcp-", binary-to-ascii(10, 8, "-", leased-address));
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
set ClientName = pick-first-value(option host-name, host-decl-name, config-option host-name, noname);
log(concat("Commit: IP: ", ClientIP, " Mac: ", ClientMac, " Name: ", ClientName));

execute("/usr/local/sbin/dhcp-dyndns.sh", "add", ClientIP, ClientName, ClientMac);
}
#################
on release {
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
set ClientMac = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
log(concat("Release: IP: ", ClientIP, " Mac: ", ClientMac));
# cannot get a ClientName here, for some reason that always fails

execute("/usr/local/sbin/dhcp-dyndns.sh", "delete", ClientIP, "", ClientMac);
}
#################
on expiry {
set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
# cannot get a ClientMac here, apparently this only works when actually receiving a packet
log(concat("Expired: IP: ", ClientIP));
# cannot get a ClientName here, for some reason that always fails


execute("/usr/local/sbin/dhcp-dyndns.sh", "delete", ClientIP, "", "0");
}
...
}

пишем /usr/local/etc/dhcp-dyndns.conf

server=сервер samba4
realm=REALM samba4 (тот же domain, но REALM - большими буквами)
domain=домен (domain пишется меленькими буквами)
keytab=/var/lib/samba/private/dns.keytab
time=3600
kname=dns-$hostname (имя создается по приципу dns-<host>, но его можно увидеть командой: "ktutil -k /var/lib/samba/private/dns.keytab list")

/var/lib/samba/private/dns.keytab - это файл появляется после создания домена (samba-tool domain provides ....), специально для этих целей

пишем /usr/local/sbin/dhcp-dyndns.sh:

#!/bin/sh
action=$1
ip=$2
host=$(echo $3 | awk -F '.' '{print $1}')
mac=$4
. /usr/local/etc/dhcp-dyndns.conf
ptr=$(echo $ip | awk -F '.' '{print $4"."$3"."$2"."$1".in-addr.arpa"}')
/usr/bin/kinit -k -t $keytab $kname@$realm
case "$action" in
add)
echo "server $server
update delete $host.$domain $time A
update add $host.$domain $time A $ip
send"|nsupdate -g

echo "server $server
update delete $ptr $time PTR
update add $ptr $time PTR $host.$domain
send"|nsupdate -g
;;

delete)
echo "server $server
update delete $host.$domain $time A
send"|nsupdate -g

echo "server $server
update delete $ptr $time PTR
send"|nsupdate -g
;;
esac

Не самое последнее, добавить в секцию options:

options {
...
tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab";
}

получаем keytab (нужно создать пользователя dhcp c правами DnsUpdateProxy):

/usr/local/samba/bin/samba-tool user add dhcp --random-password
/usr/local/samba/bin/samba-tool group addmembers DnsUpdateProxy dhcp
/usr/local/samba/bin/samba-tool domain exportkeytab --princ 'dhcp@REALM' -N /var/lib/dhcp/dhcp.keytab # вместо REALM укажите свой
ls -l /var/lib/dhcp/dhcp.keytab
chown dhcpd:dhcpd /var/lib/dhcp/dhcp.keytab

PS: если что не так, то лучше проверить права и пути к файлам для пользователя dhcpd - проделать всё от dhcp (su dhcpd - -s /bin/sh)