Ввод Samba в домен

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

Samba как участник домена, изображение

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

В свойствах каталога можем настраивать:

Samba как участник домена, изображение

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


Если понравилась статья, подпишись на мой канал в VK или Telegram.

Оставьте комментарий