Samba-файловый сервер в Active Directory: join, idmap, ACL и проверка доступа
Ниже — практическая настройка Samba member server в Active Directory. В примере домен — EXAMPLE.LOCAL, NetBIOS-имя — EXAMPLE, контроллер домена — dc01.example.local. Подставьте свои значения и сначала проверьте DNS и время.
1. Проверяем DNS и время
hostnamectl
resolvectl status
getent hosts dc01.example.local
dig +short _ldap._tcp.example.local SRV
dig +short _kerberos._tcp.example.local SRV
timedatectl
chronyc tracking 2>/dev/null || trueDNS сервера должен указывать на DNS Active Directory. При заметной рассинхронизации времени Kerberos не заработает.
2. Устанавливаем пакеты
apt update
apt install samba winbind libnss-winbind libpam-winbind krb5-user smbclient acl attr dnsutils chrony3. Проверяем Kerberos
kdestroy 2>/dev/null || true
kinit administrator@EXAMPLE.LOCAL
klistПока kinit не выдаёт ticket, переходить к join бессмысленно.
4. Сохраняем текущую конфигурацию
install -d -m 700 /root/samba-ad-backup
cp -a /etc/samba/smb.conf /root/samba-ad-backup/smb.conf.$(date +%F-%H%M)
cp -a /etc/krb5.conf /root/samba-ad-backup/krb5.conf.$(date +%F-%H%M)
testparm -s > /root/samba-ad-backup/testparm-before.txt5. Настраиваем smb.conf
[global]
workgroup = EXAMPLE
realm = EXAMPLE.LOCAL
security = ADS
winbind use default domain = yes
winbind enum users = no
winbind enum groups = no
idmap config * : backend = tdb
idmap config * : range = 10000-19999
idmap config EXAMPLE : backend = rid
idmap config EXAMPLE : range = 20000-999999
template shell = /bin/bash
template homedir = /home/%D/%U
vfs objects = acl_xattr
map acl inherit = yes
store dos attributes = yes
[department]
path = /srv/samba/department
read only = no
browseable = yes
valid users = @"EXAMPLE\FS_Department_RW", @"EXAMPLE\FS_Department_RO"
write list = @"EXAMPLE\FS_Department_RW"
force group = "EXAMPLE\FS_Department_RW"
create mask = 0660
directory mask = 0770
inherit permissions = yes
inherit acls = yesНе меняйте idmap backend и диапазоны после запуска без плана миграции: ACL могут начать указывать на другие UID/GID.
6. Проверяем конфигурацию
testparm -s
testparm -s --section-name=department7. Вступаем в домен
net ads join -U administrator
net ads testjoin
net ads info8. Запускаем службы
systemctl enable --now smbd winbind
systemctl status smbd winbind --no-pager
wbinfo -t
wbinfo --ping-dc9. Проверяем пользователей, группы и idmap
wbinfo -n 'EXAMPLE\FS_Department_RW'
wbinfo -i 'EXAMPLE\testuser'
getent passwd 'EXAMPLE\testuser'
getent group 'EXAMPLE\FS_Department_RW'
id 'EXAMPLE\testuser'Если wbinfo работает, а getent нет, проверьте строки passwd: ... winbind и group: ... winbind в /etc/nsswitch.conf.
10. Создаём каталог share
install -d -m 2770 /srv/samba/department
chown root:'EXAMPLE\FS_Department_RW' /srv/samba/department
setfacl -m g:'EXAMPLE\FS_Department_RW':rwx /srv/samba/department
setfacl -m g:'EXAMPLE\FS_Department_RO':rx /srv/samba/department
setfacl -m d:g:'EXAMPLE\FS_Department_RW':rwx /srv/samba/department
setfacl -m d:g:'EXAMPLE\FS_Department_RO':rx /srv/samba/department
getfacl -p /srv/samba/department11. Проверяем доступ через smbclient
smbclient -L //127.0.0.1 -U 'EXAMPLE\testuser'
echo 'rw test' > /tmp/rw-test.txt
smbclient //127.0.0.1/department -U 'EXAMPLE\rwuser' -c 'put /tmp/rw-test.txt rw-test.txt; ls; del rw-test.txt'
smbclient //127.0.0.1/department -U 'EXAMPLE\rouser' -c 'put /tmp/rw-test.txt must-fail.txt'Пользователь RW должен создавать и удалять файлы, пользователь RO — только читать.
12. Проверяем ACL и наследование
getfacl -p /srv/samba/department
getfattr -d -m- /srv/samba/department 2>/dev/null
find /srv/samba/department -maxdepth 2 -printf '%m %u:%g %p\n'13. Диагностика
journalctl -u smbd -u winbind --since '15 min ago' --no-pager
wbinfo -t
wbinfo --ping-dc
klist
net ads testjoin
testparm -s
smbstatus14. Rollback
net ads leave -U administrator
systemctl stop smbd winbind
cp -a /root/samba-ad-backup/smb.conf.YYYY-MM-DD-HHMM /etc/samba/smb.conf
cp -a /root/samba-ad-backup/krb5.conf.YYYY-MM-DD-HHMM /etc/krb5.conf
testparm -s
systemctl start smbdКритерий успеха: Kerberos ticket получается, net ads testjoin и wbinfo -t успешны, доменные пользователи разрешаются через getent, RW/RO-группы получают ожидаемые права, ACL наследуются после создания новых файлов.