В этой статье я покажу как ввести файловый сервер Samba в домен Active Directory. Всё будет проделано на Debian 12.
Введение
Для ввода сервера Samba в домен Active Directory мы будем использовать дистрибутив Debian 12.
А вот и начальные данные:
- samba-test-ad / 192.168.0.8 — имя и ip-адрес samba сервера;
- srv-dc.test-domain.com / 192.168.0.18 — имя и ip-адрес контроллера домена;
- test-domain.com — имя домена.
Настройка сети
Для того чтобы настроить сеть, отредактируем файлы /etc/network/interfaces и /etc/resolv.conf.
$ sudo nano /etc/network/interfaces
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
allow-hotplug ens18
iface ens18 inet static
address 192.168.0.8/24
gateway 192.168.0.1
$ sudo nano /etc/resolv.conf
domain test-domain.com
search test-domain.com
nameserver 192.168.0.18
В файле /etc/network/interfaces мы настроили ip-адрес для сетевого интерфейса ens18.
А в /etc/resolv.conf указали ip-адрес dns-сервера (он же и контроллер домена). А также, здесь мы указали имя домена и имя поискового домена. Поисковый домен указывает возможный суффикс для DNS адресов, то есть pc1 станет pc1.test-domain.com.
Проверка настройки DNS
Во-первых, проверим резолв домена и контроллера домена:
$ nslookup test-domain.com Server: 192.168.0.18 Address: 192.168.0.18#53 Name: test-domain.com Address: 192.168.0.18 $ nslookup srv-dc.test-domain.com Server: 192.168.0.18 Address: 192.168.0.18#53 Name: srv-dc.test-domain.com Address: 192.168.0.18
Во-вторых, пропингуем сам домен:
$ ping test-domain.com -c 1 PING test-domain.com (192.168.0.18) 56(84) bytes of data. 64 bytes from srv-dc.test-domain.com (192.168.0.18): icmp_seq=1 ttl=64 time=0.425 ms --- test-domain.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.365/0.365/0.365/0.000 ms
Проверим, что по ip-адресу контроллера домена мы определяем его имя, то есть настроена обратная запись:
$ nslookup 192.168.0.18 18.0.168.192.in-addr.arpa name = srv-dc.test-domain.com.
Проверим SRV-запись. DNS использует такие записи для определения ip-адресов серверов, предоставляющих услуги определенных служб. Формат такой записи следующий: _Service._Protocol.DnsDomainName где:
- Service — название службы, которая доступна на данном сервере (например: Idap, kerberos, gc, kpasswd).
- Protocol — протокол для подключения к указанной службе (tcp, udp).
- DnsDomainName — имя домена.
В нашем случае, будем проверять следующую DNS запись: _ldap._tcp.test-domain.com. Для того чтобы это сделать используем интерактивную оболочку nslookup:
$ nslookup > set type=SRV > _ldap._tcp.test-domain.com. Server: 192.168.0.18 Address: 192.168.0.18#53 _ldap._tcp.test-domain.com service = 0 100 389 srv-dc.test-domain.com. > exit
Как видим, наш домен обслуживает ldap сервер по ip-адресу — 192.168.0.18, то есть контроллер домена.
Установка пакетов
Установим необходимые пакеты:
$ sudo apt install -y krb5-user winbind libpam-krb5 libpam-winbind libnss-winbind acl attr
В процессе установки можем задать область Kerberos, она задается как имя домена, но большими буквами, в моем случае это будет: TEST-DOMAIN.COM:

Настройка kerberos
Настроим kerberos. Для этого отредактируем файл /etc/krb5.conf, но предварительно сделаем резервную копию:
$ sudo mv /etc/krb5.conf /etc/krb5.conf.back
$ sudo nano /etc/krb5.conf
[libdefaults]
default_realm = TEST-DOMAIN.COM
kdc_timesync = 1
ccache_type = 4
forwardable = true
proxiable = true
[realms]
TEST.DOMAIN.COM = {
kdc = srv-dc.test-domain.com
admin_server = srv-dc.test-domain.com
default_domain = test-domain.com
}
[domain_realm]
.test-domain.com = TEST-DOMAIN.COM
test-domain.com = TEST-DOMAIN.COM
[login]
krb4_convert = false
krb4_get_tickets = false
Разберем конфиг:
- Секция libdefaults:
- default_realm — область Kerberos по умолчанию.
- kdc_timesync — 1 или 0. Если 1, то клиентские машины будут вычислять разницу между своим временем и временем, возвращаемым KDC в метках времени в билетах, и использовать это значение для исправления неточных системных часов при запросе. Но это не используется для изменения системных часов.
- ccache_type — формат кэша учетных данных. 4 это самый последний формат.
- forwardable и proxiable — будут пересылаться начальные билеты и они будут проксибельные (так по умолчанию).
- В секции realms мы указываем настройки для нашего realm, а именно:
- kdc — сервер на котором работает служба kdc.
- admin_server — сервер администрирования.
- default_domain — домен по умолчанию.
- В секции domain_realm мы указываем сопоставления доменов и realm.
- Секция login:
- krb4_convert — не следует использовать демон преобразования Kerberos для получения билетов.
- krb4_get_tickets — не нужно использовать пароль пользователя для получения билетов.
Проверяем настройку kerberos:
$ kinit administrator@TEST-DOMAIN.COM
Password for administrator@TEST-DOMAIN.COM:
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: administrator@TEST-DOMAIN.COM
Valid starting Expires Service principal
08.07.2024 16:34:05 09.07.2024 02:34:05 krbtgt/TEST-DOMAIN.COM@TEST-DOMAIN.COM
renew until 09.07.2024 16:34:01
После ввода пароля получим билет в AD для пользователя.
Настройка синхронизации времени
В системах базирующихся на SystemD клиентом синхронизации времени, по умолчанию, выступает служба systemd-timesyncd. Эта служба использует конфиг /etc/systemd/timesyncd.conf, именно в нём прописаны NTP сервера с которыми сервер синхронизирует своё время.
$ sudo nano /etc/systemd/timesyncd.conf
NTP=192.168.0.18
$ sudo systemctl restart systemd-timesyncd.service
$ systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; preset: enabled)
Active: active (running) since Mon 2024-07-08 16:42:22 MSK; 28s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 1442 (systemd-timesyn)
Status: "Contacted time server 192.168.0.18:123 (192.168.0.18)."
Tasks: 2 (limit: 2306)
Memory: 1.3M
CPU: 65ms
CGroup: /system.slice/systemd-timesyncd.service
└─1442 /lib/systemd/systemd-timesyncd
Установка и настройка samba
Установим samba:
$ sudo apt install -y samba
Настроим samba редактируя файл /etc/samba/smb.conf, предварительно сделав резервную копию:
$ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.back
$ sudo nano /etc/samba/smb.conf
[global]
security = ADS
workgroup = test-domain
realm = TEST-DOMAIN.COM
idmap config * : backend = tdb
idmap config * : range = 3000-7999
idmap config TEST-DOMAIN : backend = rid
idmap config TEST-DOMAIN : range = 10000-999999
template shell = /bin/bash
template homedir = /home/%D/%U
winbind enum groups = yes
winbind enum users = yes
winbind nested groups = yes
winbind use default domain = yes
winbind refresh tickets = yes
unix charset = utf-8
dos charset = cp866
nt acl support = yes
acl group control = yes
map acl inherit = yes
unix password sync = yes
preferred master = No
local master = No
domain master = No
[data]
comment = Файлы пользователей домена
path = /share
hide special files = Yes
hide unreadable = Yes
store dos attributes = Yes
ea support = Yes
create mask = 0664
directory mask = 0775
force create mode = 0664
force directory mode = 0775
hosts allow = 192.168.0.0/24
inherit acls = Yes
inherit permissions = Yes
read only = No
vfs objects = acl_xattr
vfs objects = recycle
recycle:maxsize = 0
recycle:subdir_mode = 0700
recycle:directory_mode = 0777
recycle:touch = yes
recycle:versions = yes
recycle:keeptree = yes
recycle:repository = .recycle/%U
Сразу уточню, что параметры в секции [global] отвечают за присоединение к домену, а секция [data] это настройка общего каталога data.
Разбор параметров в секции [global]
- security = ADS — укажем, что Samba работает в режиме участника домена.
- workgroup = test-domain — укажем рабочую группа (первая часть домена).
- realm = TEST-DOMAIN.COM — укажем realm.
- idmap config * : backend = tdb — для сопоставление локальных id пользователей и доменных, для домена по умолчанию (*) выберем режим tdb (который позволяет и писать и читать id в свою базу данных).
- idmap config * : range = 3000-7999 — диапазон id пользователей для домена по умолчанию.
- idmap config TEST-DOMAIN : backend = rid — выберем для нашего домена режим RID, который работает в режиме «только чтение». Этот режим извлекает информацию об учетных записях и группах из контроллера домена.
- idmap config TEST-DOMAIN : range = 10000-999999 — диапазон id пользователей для нашего домена.
- template shell = /bin/bash — оболочка по умолчанию для доменных пользователей.
- template homedir = /home/%D/%U — домашний каталог для доменных пользователей.
- winbind enum groups = yes — поддержка определенных системных вызовов, позволяющих приложениям видеть доменных пользователей.
- winbind enum users = yes — тоже самое но для групп.
- winbind nested groups = yes — включим поддержку вложенных групп.
- winbind use default domain = yes — разрешим управлять пользователями без доменной части в имени пользователя.
- winbind refresh tickets = yes — укажем, что winbind должен обновлять билеты Kerberos.
- unix charset = utf-8 — кодировка компьютера на котором работает samba.
- dos charset = cp866 — укажем, что нужно переопределять кодировку для dos клиентов.
- nt acl support = yes — укажем, что нужно преобразовать права доступа unix в списки доступа Windows NT.
- acl group control = yes — в posix файловых системах, только владелец файла и суперпользователь может изменить разрешения и acl для файла. Этим параметром отменим это ограничение.
- map acl inherit = yes — укажем, что нужно использовать расширенные атрибуты файлов.
- unix password sync = yes — заставим синхронизировать пароли unix с паролями smb.
- preferred master = No — служба nmbd не будет предпочитаемым мастер браузером.
- local master = No — и не будет локальным мастером браузером.
- domain master = No — и не будет доменным мастером браузером.
Разбор параметров в секции [data]
Название секции [data] — это наш сетевой ресурс (общая папка). То есть так будет называться общая папка.
- comment = Файлы пользователей домена — комментарий для общего ресурса.
- path = /share — путь к папке на сервере.
- hide special files = Yes — скроем специальные файлы, такие как сокеты, устройства и именованные каналы.
- hide unreadable = Yes — скроем файлы, к которым нет доступа.
- store dos attributes = Yes — укажем что нужно считывать DOS атрибуты (системный, скрытый, архивный, только для чтения).
- ea support = Yes — разрешим клиентам OS/2 сохранять расширенные атрибуты.
- create mask = 0664 — когда создается файл, необходимые права доступа рассчитываются в соответствии с преобразованием из DOS прав в права UNIX . Полученный результат не может превзойти эту маску.
- directory mask = 0775 — тоже самое, но для каталогов.
- force create mode = 0664 — этот параметр переопределит права на создаваемые файлы.
- force directory mode = 0775 — тоже самое, но для каталога.
- hosts allow = 192.168.0.0/24 — разрешим подключаться только из этой сети.
- inherit acls = Yes — включим наследование прав acl.
- inherit permissions = Yes — включим наследование прав.
- read only = No — сетевой ресурс будет доступен и на чтение, и на запись.
- vfs objects = acl_xattr — модуль позволит использовать acl Windows, то есть будет возможно редактировать права из Windows.
- vfs objects = recycle — модуль позволит использовать корзину.
- recycle:maxsize = 0 — файлы, размер которых превышает указанное число байт не будут перемещаться в корзину, если 0 то все файлы будут перемещаться в корзину.
- recycle:subdir_mode = 0700 — к подкаталогам в корзине доступ будет иметь только владелец. То есть, кто удалил файл, тот и сможет его восстановить.
- recycle:directory_mode = 0777 — сама корзина будет с такими правами.
- recycle:touch = yes — при перемещении файла в корзину, будем обновлять дату доступа к файлу.
- recycle:versions = yes — файлы с одинаковыми именами будут все храниться в корзине.
- recycle:keeptree = yes — при удалении каталога, будем сохранять его структуру.
- recycle:repository = .recycle/%U — у каждого пользователя будет свой подкаталог в корзине.
Создание каталога и корзины
Далее создаем каталог /share, именно туда будет ссылаться общий ресурс data:
$ sudo mkdir /share
Создадим корзину, так как сама она не создаётся:
$ sudo mkdir /share/.recycle $ sudo chmod 777 /share/.recycle/
Применение настроек
Проверим настройки и перезагружаем службу:
$ testparm Load smb config files from /etc/samba/smb.conf Loaded services file OK. Weak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback) Server role: ROLE_DOMAIN_MEMBER Press enter to see a dump of your service definitions $ sudo systemctl restart smbd
Ввод samba в домен
Вводим сервер samba в домен и проверяем:
$ sudo net ads join -U administrator $ sudo net ads testjoin Join is OK
Перезапускаем службы:
$ sudo systemctl restart winbind $ sudo systemctl restart smbd $ sudo systemctl restart nmbd
Проверим доверительные отношения с доменом. Получим списки доменных пользователей и групп:
$ sudo wbinfo -t $ sudo wbinfo -u $ sudo wbinfo -g
Настроим права на каталог:
$ sudo chown -R administrator /share/
Теперь администратор домена является владельцем каталога share, а это и есть сетевой ресурс date.
На этом можно считать что мы ввели сервер samba в домен.
Проверка работы с клиента windows
Мы зашли под доменным администратором (administrator) на Windows сервер. Пробуем открыть подготовленный сетевой каталог:

Нас должно пустить в каталог не спрашивая логин и пароль! А если спрашивает, значит что-то сделали не так.
В свойствах каталога можем настраивать:

Таким образом, уже с Windows, мы можем вести дальнейшую настройку прав. На Linux, при этом, будут использоваться acl права.
Если понравилась статья, подпишись на мой канал в VK или Telegram.