Интеграция Samba в MS Active Directory

Введение

Задача: запустить файловый сервер под управлением Debian 8/Centos 7 и Samba с интеграцией в AD, т.е. с прозрачной аунтификацией клиентов с ОС семейства Windows, авторизованных в домене.

Имеем: домен domain.local, серверная ОС Windows Server 2012, режим работы домена и леса 2012(хотя работает и со всем предыдущими режимами), два DC: dc1.domain.local и dc2.domain.local, будующий файловый сервер fileserver.

Настройка

1. В DNS домена регистрируем fileserver, в итоге получаем fqdn: fileserver.domail.local

2. На файловом сервере настраиваем разрешение имен, правим /etc/resolv.conf:

domain domail.local
search domail.local
nameserver 192.168.0.2
nameserver 192.168.0.3

После чего обязательно тестируем, чтобы все имена корректно разрешались: fileserver.domail.local, dc1.domail.local, dc2.domail.local и сам домен domail.local

Также обязательно надо синхронизировать время между DC и файловым сервером, иначе в случае расхождения времени более чем на 5 минут аунтификация работать не будет. Иногда под большими нагрузками время на файловых серверах любит рассинхронизороваться, чтобы этого не происходило рекомендуется запустить и настроить ntp-клиент.

3. На файловом сервере ставим все необходимо ПО. Debian 8:

# apt-get install samba winbind krb5-user libpam-krb5 libnss-winbind

Centos 7:

# yum install samba samba-winbind krb5-workstation samba-winbind-clients

4. Редактируем /etc/krb5.conf:

[libdefaults]
        default_realm = DOMAIN.LOCAL
        clockskew = 300
        v4_instance_resolve = false

[realms]
        BURUT.ORG = {
                kdc = dc1.domail.local
                kdc = dc2.domail.local
                admin_server = dc1.domail.local
                default_domain = DOMAIN.LOCAL
        }

[domain_realm]
        .domail.local. = DOMAIN.LOCAL.
        

Получаем тикет керберос:

# kinit admin
Password for admin@DOMAIN.LOCAL:

Проверяем, что все ОК:

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin@DOMAIN.LOCAL

Valid starting       Expires              Service principal
20.03.2014 15:48:19  21.03.2014 01:52:22  krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL
        renew until 21.03.2014 15:48:19

Этот тикет нам нужен только для подключения самбы к доменту, так что не страшно, что он истекает через такой маленький промежуток времени.

5. Редактируем /etc/samba/smb.conf:

[global]
        security = ads
        netbios name = fileserver
        server string =
        realm = DOMAIN.LOCAL
        workgroup = DOMAIN
#        password server = dc1.domail.local dc2.domail.local          
        idmap config * : range = 3000-20000
        idmap config * : backend = tdb
        client use spnego = yes
        winbind enum users = yes
        winbind enum groups = yes
        winbind use default domain = yes

        domain master = no
        local master = no
        preferred master = no
        os level = 1

        unix charset = UTF-8
        dos charset = CP866
        display charset = UTF-8

        load printers = no
        show add printer wizard = no
        printcap name = /dev/null
        disable spoolss = yes

Тут коментировать особенно нечего, все просто, привожу только секцию global конфига, в конце еще добавлю пример шары. Единственный момент, закоментирован параметр password server, самба сама найдет сервера через которые аунтифицировать клиентов в конфиге krb5.konf. Перезапускаем samba и winbind:

# service samba restart
[ ok ] Stopping Samba daemons: nmbd smbd.
[ ok ] Starting Samba daemons: smbd.
# service winbind restart
[ ok ] Stopping the Winbind daemon: winbind.
[ ok ] Starting the Winbind daemon: winbind.

6. Подключаемся к домену:

# net ads join -U admin
Enter admin's password:
Using short domain name -- DOMAIN
Joined 'FILESERVER' to realm 'DOMAIN.LOCAL'
No DNS domain configured for fileserver. Unable to perform DNS Update.
DNS update failed!

На ругань про не возможность обновить DNS запись не обращаем внимания.

7. Теперь чтобы система использовала winbind для поиска пользователей и групп редактируем /etc/nsswitch.conf:

passwd:         compat winbind
group:          compat winbind
shadow:         compat

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Тут всего лишь добавлено ключевое слово winbind в поля passwd и group.

Вот и все. Теперь еще раз на всякий случай перезапускаемся.

Debian 8:

# service samba restart
[ ok ] Stopping Samba daemons: nmbd smbd.
[ ok ] Starting Samba daemons: smbd.
# service winbind restart
[ ok ] Stopping the Winbind daemon: winbind.
[ ok ] Starting the Winbind daemon: winbind.

Centos 7:

# systemctl enable smb
# systemctl enable winbind
# systemctl restart smb
# systemctl restart winbind

И тестируем:

# wbinfo -p
Ping to winbindd succeeded
# wbinfo -t
checking the trust secret for domain DOMAIN via RPC calls succeeded
# id admin
uid=500(admin) gid=502(domain users) группы=502(domain users),511(владельцы-создатели групповой политики),507(администраторы домена),505(администраторы предприятия),504(администраторы схемы),501(BUILTIN users),500(BUILTIN administrators)

# wbinfo -u
admin
гость
...  

# wbinfo -g
domain users
гости домена
клонируемые контроллеры домена
контроллеры домена - только чтение
контроллеры домена
компьютеры домена
владельцы-создатели групповой политики
администраторы домена
...
# net ads testjoin
Join is OK
# net ads info
LDAP server: X.X.X.X
LDAP server name: DC1.domain.org
Realm: DOMAIN.ORG
Bind Path: dc=DOMAIN,dc=ORG
LDAP port: 389
Server time: Птн, 17 Июл 2015 18:29:53 MSK
KDC server: X.X.X.X
Server time offset: -32

Если все ОК, система видит доменных пользователей и группы, можно попробовать зайти на сервер. Пример шары с прописанными доменными пользователями и группами приведен ниже:

[shara]
    path = /path/to/shara
    writeable = yes
    browsable = yes
    valid users = @DOMAIN\group1, @DOMAIN\group2, DOMAIN\user1, DOMAIN\user2
    read list = 
    write list = 
    create mask = 0777
    force directory mode = 0777
    

База tdb с привязкой ID к доменным пользователям храниться тут:

# ls -1 /var/lib/samba
account_policy.tdb
group_mapping.tdb
passdb.tdb
printers
registry.tdb
secrets.tdb
share_info.tdb
usershares
winbindd_idmap.tdb

В случае каких либо глюков, например после переименования доменных учетных записей, можно попробовать удалить это все и перезапустить самбу с винбиндом:

net cache flush
rm /var/lib/samba/*.tdb

Но в этом случае возможно придется заново перенастраивать права доступа к файловой системе, т.к. велика вероятность получения новых ID пользователями в пределах сервера.

Если запустить winbind с ключем -n, то он не будет кешировать результаты запросов к AD.

В debian редактируем файл /etc/default/winbind и добавляем туда строку:

WINBINDD_OPTS="-n"

В redhat редактируем файл /etc/sysconfig/samba и добавляем туда строку:

WINBINDOPTIONS="-n"

Для сопоставления доменных идентификаторов пользователей локальным удобно использовать вместо бакенда tdb(локальная база данных) бакэнд rid, в таком случае они будут вычисляться на лету исходя из доменного SID пользователя(последних цифр) и будут всегда одинаковыми на всех серверах(при неизменности конфигурации). Пример конфигурации:

idmap config DOMAIN : base_rid = 0
idmap config DOMAIN : range = 2000-999999
idmap config DOMAIN : backend = rid
idmap config DOMAIN : default = yes
idmap config * : range = 1300000-1999999
idmap config DOMAIN : backend = rid

Локальный ID пользователя будет вычисляться по формуле:

ID = RID - BASE_RID + LOW_RANGE_ID

где RID - последние цифры SID пользователя домена, например для встроенной учетной записи администратора это обычно 500(S-1-5-21-ХХХХХХХХХ-ХХХХХХХХХ-ХХХХХХХХХ-500) и для в дальнейшем создаваемых пользователей в домене эта цифра увеличивается BASE_RID - это конфигурируемый параметр, это цифра, на которую уменьшается ID пользователя в системе, если его надо подкорректировать, в нашем случае 0 LOW_RANGE_ID - это нижняя граница диапазона, в нашем случае 2000 И таким образом ID встроенного админа при такой конфигурации будет рассчитан так: 500 - 0 + 2000 = 2500 и это значение будет неизменным для всех серверов при условии, что вышеуказанная конфигурация не меняется. Аналогично для других пользователей, локальное значение всегда будет на 2000 больше, чем доменное.

Чтобы идентификаторы пользователей точно соответствовал доменным, можно настроить так:

...
idmap config DOMAIN : base_rid = 100
idmap config DOMAIN : range = 100-999999
...

Но в этом случае они могут пересекаться с локальными.

Дополнительная информация по ссылке.

Команды диагностики

# id renderman
uid=503(renderman) gid=500(domain users) группы=500(domain users),517(kopir_users),596(sw_all),678(sw_render),519(render_farm),505(artoon_all),522(artoon_compos),535(artoon_cache),672,510(BUILTIN\users)

# wbinfo --user-groups=renderman
500
517
596
678
519
505
522
535
672
510
  
# wbinfo --name-to-sid=renderman
S-1-5-21-1421388833-3017584253-2885461630-3113 SID_USER (1)

# wbinfo --ping-dc
checking the NETLOGON dc connection succeeded

# wbinfo --user-info=renderman
renderman:*:503:500::/home/DOMAIN/renderman:/bin/false

# groups renderman
renderman : domain users kopir_users sw_all sw_render render_farm artoon_all artoon_compos artoon_cache groups: невозможно определить имя группы для ID 672
672 BUILTIN\users
samba_ad.txt · Последние изменения: 2018/06/09 12:34 — metallic
 
Recent changes RSS feed