Актуализировал тему по настройке Samba 4 в качестве контроллера домена. Ранее я разворачивал Samba в Docker, но в версии 4.11 возникли нюансы с диапазоном пробрасываемых портов со стороны iptables, поэтому использовал классическую установку.
Перед началом надо кратко и просто пояснить основные моменты: что, зачем и почему для базового понимания в процессе настройки.
Службы каталогов
В любой организации наступает период, когда появляется множество клиентов, серверов, сервисов – всё это требует сложности администрирования: разделение прав, создание\удаление учетных записей. Чем больше народу приходит в компанию, тем больше болит голова у админа. Очевидным решением становится использование службы каталогов – средства иерархического представления ресурсов с централизованным управлением. К сведению, первые службы каталогов появились ещё в 1984 году и продолжили своё развитие в различных вариациях. А когда Microsoft выпустила NTDS (в дальнейшем переименован в Active Directory), то данный инструмент стал негласным стандартом и одним из самых распространенных в своём классе.
LDAP – протокол, который лёг в основу служб каталогов и используется в различных LDAP-совместимых реализациях служб каталогов. К примеру, таковыми являются (самые популярные и известные):
- Active Directory;
- OpenLDAP;
- Samba Domain;
- И прочие другие коммерческие.
Все записи LDAP представляются атрибутами в следующем виде:
cn=petrov,ou=office,dc=example,dc=com
где “petrov” – уникальная запись в Object Unit “office” домена example.com
Samba как DC
Но за всё надо платить, ибо самый популярный для таких целей Windows Server с Active Direcory на борту не бесплатный, а потому в последнее время с развитием пакета программ Samba 4 есть возможность использования Samba в качестве контроллера домена с применением групповых политик. О Samba 4 и последующей настройке и будет дальнейшее содержание данной статьи.
По своей сути Samba 4 есть Open-Source реализация Active Directory и, согласно документации, является стабильным вариантом применения в качестве домен-контроллера в production-среде.
Одним из минусов является отсутствие поддержки репликации Sysvol через DFS-R (условно говоря, sysvol – это директория с параметрами групповых политик, сценариев входа\выхода из системы и при использовании нескольких контроллеров домена, должна быть реплицирована на все имеющиеся контроллеры в домене). Samba пока что так не умеет, а потому есть решения с использованием rsync или более сложные и гибкие варианты. Но об этом в данном материале рассказано не будет.
В ранних версиях было ограничение размера БД до 4 гб в Samba при использовании в качестве контроллера домена, но данный вопрос был решён в версии 4.9 – реализован бэкенд LDB (экспериментальный), основанный на библиотеке LMDB, что в итоге позволяет создавать базы данных объемом свыше 4 гб. Для включения данного параметра нужно использовать ключ –backend-store=mdb. В данной статье, дабы не усложнять материал, обойдемся без данного ключа.
Перед установкой
Наименование домена
Перед началом инсталляции необходимо определиться с именем сервера и домена. В рамках данной статьи сервер с Samba на борту будет иметь полное имя (FQDN) dc0.ad.rmn-lux.ru, а сам домен – ad.rmn-lux.ru.
Кратко поясню, почему выбран именно такой формат именования.
- Никаких названий а-ля PDC или BDC использовать не стоит – это пережитки прошлого;
- Также не стоит использовать test.local и т.п. домены:
- подобные имена противоречат rfc 6762
- для такого домена не получится получить публичный TLS-сертификат
- такое имя будет недоступно из внешней сети
- Можно было бы назвать AD домен также, как основной домен сайта. Для примера, в таком случае имя домена было бы как и домен моего сайта – it-lux.ru. Это правильно, но в таком случае пришлось бы следить за публичной и внутренней зоной DNS, что не всегда удобно, т.к. может возникнуть рассинхрон.
- В качестве имени можно выбрать домен из другой зоны, который не будет конфликтовать с основным доменом. В моём случае это может быть, например, it-lux.online или аналогичный домен в другой доменной зоне.
Исходя из вышесказанного, наиболее правильным, как мне кажется, использовать поддомен ad.rmn-lux.ru для названия домена AD, т.к. это будет консолидировано в рамках одного домена.
AD Schema
По своей сути схема включает в себя описания всех объектов, хранящихся в службе каталогов (пользователи, группы и т.д.)
Информация с оф. сайта Samba по поддержке AD схем:
Windows Server Version | Directory Schema Version |
---|---|
Windows Server 2016 | 87 |
Windows Server 2012R2 | 69 |
Windows Server 2012 | 56 |
Windows Server 2008R2 | 47 |
Samba Version | Highest Supported Schema Version |
---|---|
4.11 and later | 69 |
4.5 – 4.10 | 69 * |
4.0 – 4.4 | 47 |
Последняя стабильно поддерживаемая AD схема в Samba на момент написания данного материала – 69, а подходящая версия Samba для этого – 4.11 и выше.
Одним из нюансов является то, что в стабильных репозиториях Debian 10 доступна Samba версии только 4.9. Но хотелось бы использовать последние доступные возможности схемы домена, поэтому я на свой страх и риск подключил тестовые репозитории и произвёл дальнейшую установку Samba 4.11.3 из них:
Нажмите для раскрытия sources.list
deb http://ftp.ru.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.ru.debian.org/debian/ testing main contrib non-free
deb http://ftp.ru.debian.org/debian/ testing-updates main contrib non-free
deb-src http://ftp.ru.debian.org/debian/ testing-updates main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-free
deb-src http://security.debian.org/ testing/updates main contrib non-free
DNS
Для домена необходимо использование DNS-сервера. Я остановился на распространённом варианте – использование встроенного в Samba DNS Internal. Допустимо использование BIND, но в рамках данной статьи его применение рассматриваться не будет.
Samba Internal DNS имеет следующие недостатки:
- нельзя использовать как кеширующий сервер
- не поддерживает рекурсивные запросы
- нет shared-key transaction signature (TSIG)
- нет зоны-заглушки
- не поддерживает zone transfers
- нет Round Robin балансировки между DC’s
Не смотря на вышеперечисленное, на практике это не доставляет проблем.
Подразумевается, что в сети, где разворачивается Samba AD, уже используется один или более DNS-серверов (например, тот же BIND, который не связан с Samba или внешние гугл\яндекс сервера). На этот DNS-сервер будут перенаправляться запросы клиентов Samba, т.е. он будет выбран в качестве forwarder.
Настройка hosts
Также сервер dc0.ad.rmn-lux.ru должен иметь статический IP-адрес и файл /etc/hosts со следующим содержимым:
127.0.0.1 localhost
172.16.0.16 dc0.ad.it-lux.ru dc0
Удаление существующих файлов
Для корректной установки переместить исходные конфиги во временную директорию, чтобы при создании домена данные файлы были сгенерированы заново:
mv /etc/samba/smb.conf /tmp && mv /etc/krb5.conf /tmp
Запущенные экземпляры Samba и сервисов
Перед началом установки надо проверить, что не запущена samba и её сервисы после установки пакетов:
ps ax | egrep "samba|smbd|nmbd|winbindd"
Если под фильтр попадает что-то из запущенного, нужно остановить:
systemctl stop samba-ad-dc smbd nmbd winbind
Скрыть юниты, чтобы они не могли быть запущены:
systemctl mask samba-ad-dc smbd nmbd winbind
И отключить:
systemctl disable samba-ad-dc smbd nmbd winbind
Установка
Для своих серверов я всегда использую Centos, но здесь пришлось сделать исключение и выбрать Debian, т.к. Samba, доступная из основных пакетов в Centos, не может выступать в роли AD.
Вариантов установки на Centos было несколько: собрать из пакетов (что на продуктивном сервере совсем некошерно) или установить из сторонних репозиториев (например, tissamba), но решил попробовать Debian, т.к. не хотелось искать обходные пути.
Но и с Debian оказался нюанс, т.к. в основных стабильных репозиториях не было нужной мне версии. Тем не менее, вариант установки из официальных репозиториев, пусть и тестовых, меня более чем устроил.
Каждый волен выбирать тот вариант установки и тот дистрибутив, который подходит для той или иной задачи, но стоит учесть будущие возможные обновления и связанные с этим проблемы при использовании сборки из исходников или чужого репозитория, который не будет работать, например.
Зависимости, необходимые для Samba AD в Debian:
apt-get install acl attr autoconf bind9utils bison build-essential \
debhelper dnsutils docbook-xml docbook-xsl flex gdb libjansson-dev krb5-user \
libacl1-dev libaio-dev libarchive-dev libattr1-dev libblkid-dev libbsd-dev \
libcap-dev libcups2-dev libgnutls28-dev libgpgme-dev libjson-perl \
libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl \
libpopt-dev libreadline-dev nettle-dev perl perl-modules pkg-config \
python-all-dev python-crypto python-dbg python-dev python-dnspython \
python3-dnspython python-markdown python3-markdown \
python3-dev xsltproc zlib1g-dev liblmdb-dev lmdb-utils
В оф. документации указаны пакеты python-gpgme python3-gpgme для зависимостей, но в Debian 10 его больше нет, так что его я не устанавливал.
Настройка домена:
Для установки Samba в Debian 10 нужны следующие пакеты:
apt-get install acl attr samba samba-dsdb-modules samba-vfs-modules winbind libpam-winbind libnss-winbind libpam-krb5 krb5-config krb5-user
Напоминаю, что мне нужна была версия 4.11, поэтому после установки нужно убедиться, что будет использоваться пакет нужной версии:
samba-tool --version
4.11.3-Debian
Теперь непосредственно настройка домена:
samba-tool domain provision --server-role=dc --use-rfc2307 --dns-backend=SAMBA_INTERNAL --realm=AD.IT-LUX.RU --domain=AD --adminpass=Password
Указывается роль – domain controller, использование необходимого rfc2307, согласно оф. документации – для возможности хранения атрибутов Unix в AD, встроенный DNS, имя домена – обязательно заглавными буквами и NetBIOS имя домена одним словом без точки, а также указание админского пароля.
Теперь надо сконфигурировать /etc/resolv.conf, чтобы в качестве резолвера использовался DNS из Samba (по идее, можно было бы сделать до создания домена):
Нажмите, чтобы раскрыть /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet static
address 172.16.0.16/24
gateway 172.16.0.1
dns-nameservers 127.0.0.1
/etc/resolv.conf:
search ad.it-lux.ru
nameserver 127.0.0.1
На всякий случай уточню, что файл resolve.conf может затираться NetworkManager`ом или установленной утилитой resolvconf после рестарта, стоит это иметь ввиду.
Kerberos
Kerberos – это сетевой протокол, который будет использоваться для аутентификации.
В самом начале выпиливался стандартный конфиг kerberos – теперь нужно вернуть его назад с новыми настройками, сделав следующее:
cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
И проверить его содержимое (на всякий случай):
cat /etc/krb5.conf
[libdefaults]
default_realm = AD.IT-LUX.RU
dns_lookup_realm = false
dns_lookup_kdc = true
После успешного создания домена (не должно быть никаких ошибок при выполнении), нужно вернуть настройки юнита самбы, т.к. делался mask. Сейчас же при старте возникает такая ошибка:
systemctl enable samba-ad-dc
Synchronizing state of samba-ad-dc.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable samba-ad-dc
Failed to enable unit: Unit file /etc/systemd/system/samba-ad-dc.service is masked.
Симлинк, ведущий в /dev/null, нужно удалить и выполнить перезагрузку сервисов systemd:
rm /etc/systemd/system/samba-ad-dc.service && systemctl daemon-reload
И запустить самбу, которая подтянет уже всё остальное, что ей нужно:
systemctl enable --now samba-ad-dc
Правка конфигурационного файла Samba
После установки конфиг выглядит примерно так:
# Global parameters
[global]
dns forwarder = 127.0.0.1
netbios name = DC0
realm = AD.IT-LUX.RU
server role = active directory domain controller
workgroup = AD-IT-LUX
idmap_ldb:use rfc2307 = yes
[sysvol]
path = /var/lib/samba/sysvol
read only = No
[netlogon]
path = /var/lib/samba/sysvol/ad.it-lux.ru/scripts
read only = No
Но по своему опыту скажу, что штатный конфиг нужно поправить, местами упростив настройки. Ниже кратко опишу опции конфигурационного файла /etc/samba/smb.conf:
Нажмите, чтобы посмотреть полный конфиг
# Global parameters
[global]
dns forwarder = 127.0.0.1
netbios name = DC0
realm = AD.IT-LUX.RU
server role = active directory domain controller
workgroup = AD-IT-LUX
idmap_ldb:use rfc2307 = yes
bind interfaces only = yes # слушать только на указанных интерфейсах
interfaces = 127.0.0.1 172.16.0.16
dns forwarder = 8.8.8.8 # вышестоящий DNS-сервер
allow dns updates = nonsecure and secure # разрешает nonsecure запросы
ldap server require strong auth = no # необходимо для авторизации
domain master = yes # Для указания того, что данный КД является мастером при наличии других
local master = yes
preferred master = yes
vfs objects = acl_xattr # для настройки share используя ACL на Unix. По умолчанию включен, но всё равно прописал для наглядности
map acl inherit = yes
store dos attributes = yes
[sysvol]
path = /var/lib/samba/sysvol
read only = No
[netlogon]
path = /var/lib/samba/sysvol/ad.it-lux.ru/scripts
read only = No
После внесения изменений в конфиг, нужно выполнить рестарт сервиса:
systemctl restart samba-ad-dc
Проверка настроек
Теперь, когда всё настроено, нужно выполнить ряд проверок, чтобы убедиться в корректной работе всех компонентов Samba.
Общая проверка выполняется командой testparm:
Нажмите для раскрытия…
testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_ACTIVE_DIRECTORY_DC
Press enter to see a dump of your service definitions
# Global parameters
[global]
allow dns updates = nonsecure and secure
bind interfaces only = Yes
dns forwarder = 8.8.8.8
domain master = Yes
interfaces = 127.0.0.1 172.16.0.16
ldap server require strong auth = No
passdb backend = samba_dsdb
preferred master = Yes
realm = AD.IT-LUX.RU
server role = active directory domain controller
workgroup = AD-IT-LUX
rpc_server:tcpip = no
rpc_daemon:spoolssd = embedded
rpc_server:spoolss = embedded
rpc_server:winreg = embedded
rpc_server:ntsvcs = embedded
rpc_server:eventlog = embedded
rpc_server:srvsvc = embedded
rpc_server:svcctl = embedded
rpc_server:default = external
winbindd:use external pipes = true
idmap_ldb:use rfc2307 = yes
idmap config * : backend = tdb
map acl inherit = Yes
map archive = No
vfs objects = acl_xattr
[sysvol]
path = /var/lib/samba/sysvol
read only = No
[netlogon]
path = /var/lib/samba/sysvol/ad.it-lux.ru/scripts
read only = No
Посредством команд hosts и wbinfo можно провести ряд проверок, результат выполнения которых должен быть без ошибок:
host -t A dc0.ad.it-lux.ru
dc0.ad.it-lux.ru has address 172.16.0.16
host -t A ad.it-lux.ru
ad.it-lux.ru has address 172.16.0.16
wbinfo -t
checking the trust secret for domain AD-IT-LUX via RPC calls succeeded
wbinfo -p
Ping to winbindd succeeded
wbinfo -P
checking the NETLOGON for domain[AD-IT-LUX] dc connection to "dc0.ad.it-lux.ru" succeeded
Прочие проверки, которые могут пригодиться для отладки:
Проверка БД Samba
samba-tool dbcheck
Исправление ошибок с БД
samba-tool dbcheck --fix
Проверка прав доступа к sysvol
samba-tool ntacl sysvolcheck
При наличии ошибок с sysvol - исправление
samba-tool ntacl sysvolreset
Администрирование
Если все проверки пройдены и никаких ошибок не возникло, можно приступать к использованию домена.
Можно посмотреть общую информацию о домене:
samba-tool domain info dc0.ad.it-lux.ru
Forest : ad.it-lux.ru
Domain : ad.it-lux.ru
Netbios domain : AD-IT-LUX
DC name : dc0.ad.it-lux.ru
DC netbios name : DC0
Server site : Default-First-Site-Name
Client site : Default-First-Site-Name
Проверить список дефолтных юзеров через wbinfo или samba-tool:
wbinfo -u
AD-IT-LUX\administrator
AD-IT-LUX\guest
AD-IT-LUX\krbtgt
samba-tool user list
И список групп:
wbinfo -g
AD-IT-LUX\cert publishers
AD-IT-LUX\ras and ias servers
AD-IT-LUX\allowed rodc password replication group
AD-IT-LUX\denied rodc password replication group
AD-IT-LUX\dnsadmins
AD-IT-LUX\enterprise read-only domain controllers
AD-IT-LUX\domain admins
AD-IT-LUX\domain users
AD-IT-LUX\domain guests
AD-IT-LUX\domain computers
AD-IT-LUX\domain controllers
AD-IT-LUX\schema admins
AD-IT-LUX\enterprise admins
AD-IT-LUX\group policy creator owners
AD-IT-LUX\read-only domain controllers
AD-IT-LUX\dnsupdateproxy
samba-tool group list
А также список компьютеров (пока что только один КД):
samba-tool computer list
DC0$
Создание пользователя:
samba-tool user create newuser
Задать ему пароль:
samba-tool user setpassword newuser
Деактивировать пользователя:
samba-tool user disable newuser
Прочие команды можно посмотреть, выполнив:
samba-tool --help
через samba-tool также настраивается DNS.
Настройку и управление также можно осуществлять посредством RSAT, т.е. классическими виндовыми оснастками, но мне больше нравится консольный вариант непосредственно с самого сервера Samba.
Бэкап
В официальной документации подробно всё описано, поэтому первоначально стоит ознакомиться с информацией там.
После настройки благоразумно будет обеспечить резервное копирование Samba. Есть несколько типов резервирования: “Online” и “Offline”.
Online делает копию работающей базы DC:
samba-tool domain backup online --targetdir=<output-dir> --server=<DC-server> -UAdministrator
Offline создает резервные копии файлов Samba:
samba-tool domain backup offline --targetdir=<output-dir>
Каждая команда создает файл резервной копии .tar.bz2, который содержит полную резервную копию домена (на основе данного DC). Затем файл резервной копии можно использовать для восстановления домена с помощью команды «samba-tool domain backup restore».
Использовать ту или иную схему бэкапа нужно в зависимости от ситуации. В обычных случаях Online-бэкап самый простой и быстрый, но в случае каких-то неполадок и для их расследования и устранения лучше подойдёт Offline-бэкап, т.к. содержит в себе дополнительные данные.
В идеале можно комбинировать оба способа, настроив бэкап по крону с созданием нужного кол-ва копий.
Заключение
Теперь, когда имеется установленный и настроенный контроллер домена, можно найти ему применение. Например, завести все рабочие станции офиса в домен и централизованно ими управлять. Или же настроить RADIUS для авторизации на VPN-сервере через доменную учётную запись.