Установка резервного контролера домена SAMBA AD-DC

Резервный контроллер домена — это дополнительный сервер в сети, который реплицирует данные с основного контроллера и готов взять на себя его функции в случае отказа или недоступности основного, обеспечивая тем самым отказоустойчивость и непрерывность работы домена. Его основная задача — перехватить управление аутентификацией, авторизацией и другими службами домена, чтобы пользователи могли продолжать работать без сбоев. 

Запуск одного контроллера домена (DC) достаточна для работающего леса Active Directory (AD). Тем не менее, по причинам избыточности и балансировки нагрузки, вы должны добавить дополнительные DC в ваш AD лес.

Присоединение дополнительной Samba DC к существующему AD отличается от инициализации первого DC в лесу. Если вы настраиваете новый AD лес, см. Настройку SAMBA в качестве контроллера домена Active Directory.

При установке дополнительного DC не нужно делать инициализацию контролера домена и потом его присоединять к существующему домену, это не сработает, вместо этого достаточно будет выполнить команду

samba-tool domain join

которая добавит компьютер к существующему домену.

Разворачивать Samba AD-DC будем на базе Ubuntu 24.04

После установки и предварительных настроек Ubuntu 24.04 перейдем к установке и настройке Samba.

Начальная установка ничем не отличается от установки SAMBA в качестве контролера домена, до момента инициализации (provisioning) контролера домена.

Устанавливаем и предварительно настраиваем BIND

в файле /etc/bind/named.conf.options меняем значение адреса локального сервера

	listen-on port 53 {
		10.0.0.253; // IP of our DC and BIND Server
		127.0.0.1;
		::1;
	};

После установки BIND продолжаем настраивать SAMBA

sudo nano /etc/resolv.conf
search ladm.lazyadmin.ru
nameserver 10.0.0.254
nameserver 10.0.0.253

nameserver 1.1.1.1
sudo mv /etc/krb5.conf /etc/krb5.conf.orig
sudo nano /etc/krb5.conf
[libdefaults]
    dns_lookup_realm = false
    dns_lookup_kdc = true
    default_realm = LADM.LAZYADMIN.RU

Теперь можно присоединять компьютер к существующему домену.

Опять обращаем внимание на сетевые интерфейсы

sudo samba-tool domain join ladm.lazyadmin.ru DC -U"LADM\administrator" --dns-backend=BIND9_DLZ --option="interfaces=lo ens18" --option="bind interfaces only=yes"
...
 Joined domain LADM (SID [SID HASH HERE]) as a DC
sudo systemctl start samba-ad-dc.service
sudo systemctl status samba-ad-dc.service
sudo nano /etc/bind/named.conf.options

раскомментируем строку

tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab";
sudo systemctl start bind9.service
sudo systemctl status bind9.service
host -t A vmdc02.ladm.lazyadmin.ru
vmdc02.ladm.lazyadmin.ru has address 10.0.0.253
sudo apt install ldb-tools
sudo ldbsearch -H /var/lib/samba/private/sam.ldb '(invocationId=*)' --cross-ncs objectguid
# record 1
dn: CN=NTDS Settings,CN=VMDC02,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ladm,DC=lazyadmin,DC=ru
objectGUID: 00000000-0000-0000-0000-000000000000

# record 2
dn: CN=NTDS Settings,CN=VMDC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=ladm,DC=lazyadmin,DC=ru
objectGUID: 00000000-0000-0000-0000-000000000000

# returned 2 records
# 2 entries
# 0 referrals
host -t CNAME 00000000-0000-0000-0000-000000000000._msdcs.ladm.lazyadmin.ru
00000000-0000-0000-0000-000000000000._msdcs.ladm.lazyadmin.ru is an alias for VMDC02.ladm.lazyadmin.ru.

Устанавливаем isc-dhcp-server

sudo apt install isc-dhcp-server -y
sudo samba-tool domain exportkeytab --principal=dhcpduser@LADM.LAZYADMIN.RU /etc/dhcpduser.keytab
sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig
sudo nano /etc/dhcp/dhcpd.conf

Ключ OMAPI берем с основного DHCP сервера, после того как сгенерируем его

authoritative;
ddns-update-style none;

omapi-port 7911;
omapi-key omapi_key;
key "omapi_key" {
	  algorithm hmac-md5;
	  secret "##### KEY HERE FROM DC01 ######";
};

failover peer "dhcp-failover" {
	secondary;
	address vmdc02.ladm.lazyadmin.ru;
	peer address vmdc01.ladm.lazyadmin.ru;
	max-response-delay 60;
	max-unacked-updates 10;
	load balance max seconds 3;
}

subnet 10.0.0.0 netmask 255.255.255.0 {
	option subnet-mask 255.255.255.0;
	option broadcast-address 10.0.0.255;
	option time-offset 0;
	option routers 10.0.0.1;
	option domain-name "ladm.lazyadmin.ru";
	option domain-name-servers 10.0.0.253, 10.0.0.254;
	option ntp-servers 10.0.0.253, 10.0.0.254, 10.0.0.1;
	pool {
		failover peer "dhcp-failover";
		max-lease-time 1800; # 30 minutes
		range 10.0.0.100 10.0.0.199;
	}
}

on commit {
	set noname = concat("dhcp-", binary-to-ascii(10, 8, "-", leased-address));
	set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
	set ClientDHCID = concat (
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
	);
	set ClientName = pick-first-value(option host-name, config-option host-name, client-name, noname);
	log(concat("Commit: IP: ", ClientIP, " DHCID: ", ClientDHCID, " Name: ", ClientName));
	execute("/usr/local/bin/dhcp-dyndns.sh", "add", ClientIP, ClientDHCID, ClientName);
}

on release {
	set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
	set ClientDHCID = concat (
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,1,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,2,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,3,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,4,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,5,1))),2), ":",
		suffix (concat ("0", binary-to-ascii (16, 8, "", substring(hardware,6,1))),2)
	);
	log(concat("Release: IP: ", ClientIP));
	execute("/usr/local/bin/dhcp-dyndns.sh", "delete", ClientIP, ClientDHCID);
}

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
	# however the dhcp update script will obtain the short hostname.
	execute("/usr/local/bin/dhcp-dyndns.sh", "delete", ClientIP, "", "0");
}
sudo systemctl restart bind9
sudo systemctl status bind9

sudo systemctl restart isc-dhcp-server
sudo systemctl status isc-dhcp-server

Проверяем и донастраиваем apparmor

Настройка репликации