В этой статье я покажу как ввести файловый сервер 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.