====== Интеграция 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] DOMAIN.LOCAL = { 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 --no-dns-updates Enter admin's password: Using short domain name -- DOMAIN Joined 'FILESERVER' to realm 'DOMAIN.LOCAL' Опция --no-dns-updates говорит не обновлять днс-запись, иначе будет ошибка. Другой вариант - включить в настройках доменного ДНС небезопасное обновление зоны. 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 ... Но в этом случае они могут пересекаться с локальными. Дополнительная информация по [[https://www.samba.org/samba/docs/man/manpages-3/idmap_rid.8.html|ссылке]]. ===== Команды диагностики ===== # 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