Установка Samba4 на Linux CentOS8 с подключением к Active Directory

Для настройки работы Samba с доменом Active Directory понадобятся собственно сама Samba, а так же пакеты Kerberos и Winbind. Kerberos используется для установления защищенной связи между клиентом и сервером, а Winbind - для получения доменных пользователей и групп Linux сервером

Все команды выполняются от имени суперпользователя

Параметры сети

Пусть сеть будет содержать следующие параметры:
Имя доменаoffice.domain.com
Краткое имя доменаoffice
Имя сервера - контроллера доменаSRV-DC
ip-адрес сервера - контроллера домена192.168.10.15
Имя сервера на котором устанавливается sambaSRV-SMB
ip-адрес сервера на котором устанавливается samba192.168.10.20
DNS сервер и контроллер домена установлены на одном сервере

Подготовка

Нужно подготовить Linux сервер:
В файле
/etc/resolv.conf
Должны быть указаны имя домена и адрес DNS сервера, например
domain office.domain.com
search office.domain.com
nameserver 192.168.10.15
Для применения изменений нужно перезапустить сетевой интерфейс
nmcli con down <ID> && nmcli con up <ID>
Файл
/etc/hosts
должен содержать имя хоста, на котором устанавливается samba
192.168.10.20 srv-smb.domain.com srv-smb
Для системы, на которой устанавливается samba, контроллер домена должен быть сервером для синхронизации времени. Для настройки нужно зайти в файл
/etc/chrony.conf
Закомментировать строки с помощью знака решетки
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
И вместо них добавить
server 192.168.10.15 iburst prefer
После изменения нужно перезапустить службу
systemctl restart chronyd

Установка и конфигурирование

Установка необходимых пакетов
yum install samba-winbind samba-winbind-clients samba krb5-workstation
Разрешить доступ через файрвол
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
Создать каталоги для общего доступа
mkdir -p /home/share/dir1
mkdir -p /home/share/dir2
Дать разрешения SELinux для доступа к этим каталогам
semanage fcontext -a -t samba_share_t "/home/share/dir1(/.*)?"
semanage fcontext -a -t samba_share_t "/home/share/dir2(/.*)?"
restorecon -R -v /home/share/dir1
restorecon -R -v /home/share/dir2
setsebool -P samba_export_all_rw 1
Запуск и добавление в автозагрузку сервисов Samba
systemctl enable smb --now
systemctl enable nmb --now
Можно проверить, видит ли текущая система сервер контроллера домена
realm discover office.domain.com
Если выводит, что команда неизвестна, нужно установить пакет
yum install realmd
Теперь нужно заполнить конфигурационный файл kerberos, который лежит по пути
/etc/krb5.conf
Все слова, которые написаны заглавными буквами, должны быть написаны заглавными. В конфиге нужно поменять имя домена на свое
[libdefaults]
  default_realm = OFFICE.DOMAIN.COM
  dns_lookup_realm = false
  dns_lookup_kdc = true
  ticket_lifetime = 24000

  krb4_config = /etc/krb.conf
  krb4_realms = /etc/krb.realms
  kdc_timesync = 1
  ccache_type = 4
  forwardable = true
  proxiable = true

  v4_instance_resolve = false
  v4_name_convert = {
      host = {
          rcmd = host
          ftp = ftp
      }
      plain = {
          something = something-else
      }
  }
  fcc-mit-ticketflags = true

[realms]
  OFFICE.DOMAIN.COM = {
              kdc = SRV-DC.OFFICE.DOMAIN.COM
              admin_server = SRV-DC.OFFICE.DOMAIN.COM
              default_domain = OFFICE.DOMAIN.COM
      }

[domain_realm]
  .office.domain.com = OFFICE.DOMAIN.COM
  office.domain.com = OFFICE.DOMAIN.COM

[login]
  krb4_convert = false
  krb4_get_tickets = false
Теперь нужно заполнить конфиг Samba. Настройка winbind так же осуществляется в этом конфиге. Он находится по пути
/etc/samba/smb.conf
В конфиге нужно поменять имя домена, группы и пути к каталогам на свои
#глобальные параметры, для всех расшариваемых каталогов
[global]
#рабочая группа
        workgroup = OFFICE
#имя в сетевом окружении
        netbios name = SRV-DC
#область kerberos
        realm = OFFICE.DOMAIN.COM
#тип безопасности - active directory service
        security = ads
#использовать домен по умолчанию, тогда не нужно будет писать имя пользователя с указанием домена
        winbind use default domain = yes
#разрешить winbind'у пробрасывать пользователей и группы домена на локальную систему
        winbind enum groups = Yes
        winbind enum users = Yes
#автоматическое получение билетов kerberos
        winbind refresh tickets = yes
#диапазон проброшенных winbind`ом uid и gid
        idmap config * : range = 1000000-20000000
        idmap config * : rangesize = 1000000
        idmap config * : backend = autorid
#позволяет сопоставлять списки управления доступом windows и linux
        vfs objects = acl_xattr
        store dos attributes = yes
#samba не может стать контроллером домена и master browser`ом
        domain master = no
        local master = no
#nmbd-сервер не будет сервером wins
        preferred master = no
        os level = 0
#автоматическое обновление билета Kerberos
        winbind refresh tickets = yes
#отключить поддержку принтеров
        load printers = no
        show add printer wizard = no
        disable spoolss = yes
        printcap name = /dev/null
#опции для ускорения работы
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=65536 SO_SNDBUF=65536

#Имя каталога, отображаемое в сети (может быть любым)
[dir1]
#путь к расшариваемому каталогу
        path = /home/share/dir1
#скрывает от пользователя каталоги и файлы на которые у них нет доступа
        hide unreadable = yes
#список тех, кому разрешен доступ
        valid users = "@OFFICE\пользователи домена", "@OFFICE\администраторы домена"
#наследовать разрешения acl от родительского каталога
        inherit acls = yes
#наследовать владельца от родительского каталога
        inherit owner = yes
#наследовать права от родительского каталога
        inherit permissions = yes
#сопоставлять разрешения linux со списками контроля доступа windows
        nt acl support = yes
#наследовать списки доступа
        map acl inherit = yes
#разрешение на запись, тем у кого есть доступ
        writable = yes
#файлы и каталоги создаются с указанными разрешениями
        create mask = 0770
        directory mask = 0770

#Имя каталога, отображаемое в сети (может быть любым)
[dir2]
#путь к расшариваемому каталогу
        path = /home/share/dir2
#скрывает от пользователя каталоги и файлы на которые у них нет доступа
        hide unreadable = yes
#список тех, кому разрешен доступ
        valid users = "@OFFICE\администраторы домена"
#наследовать разрешения acl от родительского каталога
        inherit acls = yes
#наследовать владельца от родительского каталога
        inherit owner = yes
#наследовать права от родительского каталога
        inherit permissions = yes
#сопоставлять разрешения linux со списками контроля доступа windows
        nt acl support = yes
#наследовать списки доступа
        map acl inherit = yes
#разрешение на запись, тем у кого есть доступ
        writable = yes
#файлы и каталоги создаются с указанными разрешениями
        create mask = 0770
        directory mask = 0770
Для того, чтобы у каждого расшаренного каталога была корзина, в секцию [global] нужно добавить следующее. Если нужно, чтоб корзина была только у некоторых каталогов, то добавить строки нужно в их секции.
Вместо
vfs objects = acl_xattr
Указать
vfs objects = acl_xattr recycle
Добавить
#НАСТРОЙКИ КОРЗИНЫ
#где хранить удаленные файлы. Они будут храниться в скрытом каталоге recycle, для каждого пользователя будет создаваться свой подкаталог с удаленными им файлами
        recycle:repository = .recycle/%U
#список исключений каталогов. Каталоги, файлы из которых не будут попадать в корзину
        recylce:excludedir = tmp temp cache
#список исключений файлов. Если файл содержит в названии указанную строку, он не попадает в корзину
        recycle:exclude = *.tmp *.temp ~$*
#если имена файлов совпадают, будет добавляться номер файла
        recycle:versions = yes
#будет ли изменена дата файла на время удаления файла
        recycle:touch = yes
#сохранение дерева каталогов для удаленных файлов
        recycle:keeptree = yes
#файлы и каталоги создаются с указанными разрешениями
        recycle:directory_mode = 0750
#считать файлы и каталоги, начинающиеся с точки скрытыми
        hide dot files = yes
Если нужна поддержка протокола smb1, то в конфиг нужно добавить строку
server min protocol= NT1
Проверка конфига и перезапуск samba
testparm
systemctl restart smb
Создание каталогов для корзины
mkdir /home/share/dir1/.recycle
mkdir /home/share/dir2/.recycle
Для очистки каталога корзины от файлов старше 4 дней и пустых каталогов в файл
/etc/crontab
Запишем следующее
0 19 * * * root find /home/share/dir1/.recycle -mtime +4 -delete
30 19 * * * root find /home/share/dir1/.recycle -type d -empty -delete
Чтобы система использовала winbind для поиска пользователей и групп, нужно в файле
/etc/nsswitch.conf
К параметрам passwd и group добавить winbind
passwd:     sss files systemd winbind
group:      sss files systemd winbind
Теперь можно проверить возможность авторизации в домене, для этого нужно выполнить команду с существующим именем пользователя домена, имя домена нужно писать заглавными буквами
kinit username@OFFICE.DOMAIN.COM
Если не появилось ошибок, значит все правильно
Убедиться в том, что билет kerberos получен, можно командой
klist
Удалить все билеты (в данный момент они были нужны только для проверки) можно командой
kdestroy
Для добавления сервера в домен используется команда
net ads join -U userDomain -S SRV-DC.office.domain.com
У указанного пользователя должно быть право на добавление пользователей в домен
При успешном вводе, появится сообщение
Using short domain name -- OFFICE
Joined 'SRV-SMB' to dns domain 'office.domain.com'
Может появится ошибка вида
Using short domain name -- OFFICE
Joined 'SRV-SMB' to dns domain 'office.domain.com'
No DNS domain configured for srv-smb. Unable to perform DNS Update.
DNS update failed: NT_STATUS_INVALID_PARAMETER
Это значит, что не добавилась автоматически запись о системе на DNS сервер. Это можно сделать вручную, нужно зайти в настройки DNS сервера и добавить A-запись. Это не критичная ошибка, даже если она возникает хост все равно добавляется в домен.
Проверить добавился ли хост в домен, можно командами
net ads info
net ads testjoin
Теперь можно запустить winbind и добавить его в автозагрузку
systemctl enable winbind --now
Проверить работу winbind можно следующими командами (запускать обязательно с правами суперпользователя)
Проверка соединения с доменом, вывод должен содержать calls succeeded
wbinfo -t
Вывод пользователей домена
wbinfo -u
Вывод групп домена
wbinfo -g
Вывод локальных и доменных пользователей
getent passwd
Вывод локальных и доменных групп
getent group
Можно проверить отображается ли пользователь через id
id userDomain
Или
id domain\\userDomain
Если возникают ошибки, следует перезапустить samba и winbind
В linux по умолчанию максимальное количество открытых файлов составляет 1024, а в windows 16384, приведем эти значения в соответствие, для этого в файле
/etc/security/limits.conf
Изменить
*               -       nofile          16384
root            -       nofile          16384
Изменения применятся после перезагрузки системы.

Настройка доступа к каталогам

Пусть нужно сделать так, чтоб в общий каталог и подкаталоги могли записывать данные все пользователи домена, тогда нужно изменить права следующим образом
chown -R "OFFICE\администратор":"OFFICE\пользователи домена" /home/share/dir1
chmod 770 /home/share/dir1
Пусть нужно сделать так, чтоб в корень общего каталога могли записывать данные и создавать там каталоги только некоторые пользователи, а в подкаталоги могли записывать данные все.
Тогда нужно на контроллере домена создать группу, например share_admins и включить в нее нужных пользователей (добавление в группу применится только после перезахода пользователя в учетную запись). Задать следующие права
chown -R "OFFICE\администратор":"OFFICE\пользователи домена" /home/share/dir1
chmod 750 /home/share/dir1
И задать права acl для корневого каталога и права по умолчанию для подкаталогов
setfacl -m g:"OFFICE\\share_admins":rwx /home/share/dir1
setfacl -d -m u::rwx,g::rwx,o::-,g:"OFFICE\\share_admins":rwx /home/share/dir1
В этом случае, пользователи, находящиеся в группе share_admins будут иметь полные права на все каталоги.
Если настроена корзина, то нужно всем пользователям домена разрешить запись в нее
chmod 770 /home/share/dir1/.recycle
Проверить права ACL для каталога можно командой
getfacl <dir>
Удаление всех ACL прав
settfacl -b <dir>

С помощью ACL можно задавать различные права доступа к каталогам большому количеству пользователей и групп
Права доступа к каталогам можно менять и из windows, в Свойствах каталога, во вкладке Безопасность

После всех сделанных действий можно подключится к расшаренному каталогу из сети от доменного пользователя, по пути
\\SRV-SMB\dir1

Полный список параметров конфига Samba: |ссылка|
Подробно про ACL: |ссылка 1|, |ссылка 2|
Решение проблем: |ссылка|
Samba и SELinux: |ссылка|