Страница 1 из 1

Ввод Linux-клиентов в домен Samba 4.x

Добавлено: 22 окт 2012, 12:19
Raven
RHEL-based дистрибутивы версии 6+
Для samba4:

Так как полноценных официальных сборок samba4 для RHEL/СentOS/etc еще нет, мне пришлось собирать пакеты вручную. Можно также собрать из официальных релизов и git.

Подключаем репозиторий raven-extras - создаем файл /etc/yum.repos.d/raven.repo со следующим содержимым:

Код: Выделить всё

[raven-extras]
name=Raven's extra package repository
baseurl=http://pkgs.dyn.su/el6-extras/$basearch/
enabled=1
gpgcheck=0

Устанавливаем пакеты:

Код: Выделить всё

# yum install samba4-winbind-clients samba4-winbind-krb5-locator samba4-client samba4-winbind nss-pam-ldapd nss-util nss-tools nss krb5-workstation krb5-libs ntpdate
Синхронизируем время с контроллером домена. У меня однако же контроллер не выполняет функций ntp-сервера, поэтому я синхронизирую его и клиентов с внешними ntp-серверами.

Код: Выделить всё

# ntpdate kg.pool.ntp.org
топаем в /etc/samba и создаем конфиг smb.conf:

Код: Выделить всё

[global]
        workgroup = OFFICE # Рабочая группа в домене
        realm = DC.DOMAIN.TLD # Полное имя нашего домена
        netbios name = linux # Локальное имя компьютера
        security = ADS
        obey pam restrictions = Yes
        restrict anonymous = 2
        socket options = SO_KEEPALIVE SO_BROADCAST TCP_NODELAY IPTOS_THROUGHPUT SO_RCVBUF=4096 SO_SNDBUF=4096
        load printers = No
        disable spoolss = Yes
        show add printer wizard = No
        os level = 0
        local master = No
        domain master = No
        kerberos method = secrets and keytab
        template homedir = /home/%D/%U  # Путь к домашним директориям. В данном случае будет выглядеть как /home/OFFICE/username
        template shell = /bin/bash # Шелл пользователя
        winbind separator = ~
        winbind cache time = 3600
        winbind enum users = Yes
        winbind enum groups = Yes
        winbind use default domain = yes
        winbind refresh tickets = Yes
        winbind offline logon = Yes
        winbind nested groups = yes
        winbind expand groups = 3
        idmap config * : range = 10000-20000
        idmap config * : backend = tdb
Samba3
Для использования в качестве клиента samba3 можно обойтись стандартными репозиториями для вашего дистрибутива напр. CentOS-base. Команда установки пакетов в данном случае быдет выглядеть так:

Код: Выделить всё

# yum install samba-winbind-clients samba-winbind-krb5-locator samba-client samba-winbind nss-pam-ldapd nss-util nss-tools nss krb5-workstation krb5-libs ntpdate
Конфиги идентичны.

В некоторых особо устаревших версиях samba возможно не подгребутся строки конфига:

Код: Выделить всё

        idmap config * : range = 10000-20000 
        idmap config * : backend = tdb
выход - заменить их на:

Код: Выделить всё

        idmap gid = 10000-20000
        idmap gid = 10000-20000
RHEL-based дистрибутивы версии < 6
Реализация не опробована, но подозреваю что это достаточно тривиальная задача.

Текущие версии Fedora
Реализация идентична el6, с той лишь разницей, что все уже есть в репозиториях и вместо sysvinit используется systemd.

Проверяем наш конфиг

Код: Выделить всё

# testparm
Настройка Kerberos

Создаем конфиг /etc/krb5.conf

Код: Выделить всё

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = DC.DOMAIN.TLD
 dns_lookup_realm = false
 dns_lookup_kdc = true
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

[realms]
DC.SMARTJOBBOARD.COM = {
    kdc = dc.domain.tld # адрес сервера
    password_server = 192.168.0.10 # ip сервера
    admin_server = dc.domain.tld
    default_domain = DC.DOMAIN.TLD
}

[domain_realm]
    .DC.DOMAIN.TLD = DC.DOMAIN.TLD
    DC.DOMAIN.TLD = DC.DOMAIN.TLD

[appdefaults]
 pam = {
    debug = false
    ticket_lifetime = 36000
    renew_lifetime = 36000
    forwardable = true
    krb4_convert = false
 }
Пробуем авторизоваться в krb

Код: Выделить всё

# kinit administrator@DC.DOMAIN.TLD
Password for admistrator@DC.DOMAIN.TLD: вводим пароль админа домена
Warning: Your password will expire in 991 days on Sat Jul  4 09:29:56 2015 # все ОК
# klist                # смотрим список билетов
# kdestroy         # Удаляем билеты - оно пока не надо)))
Правим /etc/nsswitch.conf, приводим строчки:

Код: Выделить всё

passwd:     files
shadow:     files
group:      files
к такому виду:

Код: Выделить всё

passwd:     files winbind
shadow:     files winbind
group:      files winbind
Далее лезем в /etc/pam.d и редактируем файлы password-auth и system-auth, чтобы на выходе получилось следующее:

Код: Выделить всё

auth        required      pam_env.so
auth        sufficient    pam_unix.so likeauth nullok
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        optional      pam_group.so
auth        sufficient    pam_winbind.so cached_login use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_winbind.so cached_login
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    sufficient    pam_winbind.so cached_login use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_mkhomedir.so umask=0022 skel=/etc/skel
session     required      pam_unix.so
В файле /etc/security/pam_winbind.conf выставляем:

Код: Выделить всё

cached_login = yes
Проверяем selinux

Код: Выделить всё

# sestatus
если

Код: Выделить всё

SELinux status:                 enabled
Отключаем к чертям selinux, для чего в файле /etc/sysconfig/selinux строчку
SELINUX=enforcing
изменяем на
SELINUX=disabled.

Добавляем демоны в автозагрузку:

Код: Выделить всё

# chkconfig smb on
# chkconfig winbind on
Добавляем запись в DNS (идейно это должно работать автоматически, но почему-то не срабатывает) и добавляем машину в домен (если версия samba > 4, то 1-я команда подается непосредственно на контроллере домена):

Код: Выделить всё

# samba-tool dns add 192.168.0.10 dc.domain.tld <linux> A <ip>        # добавляем запись в DNS
# net ads join -W DC.DOMAIN.TLD -U administrator@DC.DOMAIN.TLD          # Добавляем машину в домен

Где <linux> - локальное имя машины, <ip> - ip-адрес хоста добавляемого в домен.

Может случиться так, что последняя команда вывалит следующую ругань:
Enter administrator@DC.DOMAIN.TLD's password:
Using short domain name -- OFFICE
Joined '<linux>' to realm 'dc.domain.tld'
No DNS domain configured for <linux>. Unable to perform DNS Update.
DNS update failed!
Это не страшно, машина в домен добавлена, просто не обновлена запись в DNS. Лично для меня это не критично и в случае крайней необходимости можно запись поправить руками.

Стартуем сервисы (если на машине пришлось отключать selinux, то нужно ее просто перезагрузить):

Код: Выделить всё

service smb start
service winbind start
и проверяем интеграцию:

Код: Выделить всё

# wbinfo -u
# wbinfo -g
# getent passwd
# getent group
Если все сделано верно, 2 первые команды выдадут список доменных пользователей и групп соответственно, а последние 2 команды должны отобразить список локальных+доменных пользователей и групп.

Для того, чтобы наши доменные пользователи имели права на монтирование флешек, проигрывание аудио и прочих благ присущих локальным пользователям, необходимо включить доменных пользователей в локальные группы. Лучше всего это сделать отредактировав файл /etc/security/groups.conf и добавив в него следующую строку:

Код: Выделить всё

*;*;%domain users;Al0000-2400;dialout,cdrom,audio,floppy,dip,video,plugdev,scanner,netdev,lpadmin,powerdev,pulse,pulse-access
То есть добавить ассоциацию доменной группы domain users с системными группами. При правильной настройке команда id должна вернуть строку подобную этой:

Код: Выделить всё

uid=10000(raven) gid=10000(domain users) groups=10000(domain users),11(cdrom),18(dialout),19(floppy),39(video),40(dip),63(audio),994(pulse-access),995(pulse)
Чтобы для доменных пользователей работала sudo нужно включить группу пользователей домена в sudoers для чего необходимо через visudo добавить в конец файла /etc/sudoers следующее:

Код: Выделить всё

%domain\ users        ALL=(ALL) ALL
Для Debian-based дистрибутивов

конфигурационные файлы smb.conf, krb5.conf и nsswitch.conf используются идентичные, различия лишь в следующем:

Установка необходимых пакетов:

Код: Выделить всё

# aptitude install samba ntpdate smbclient winbind krb5-config krb5-user
+ криворукие разрабы пакетной базы для этих дистрибутивов очевидно имеют какое-то свое извращенное видение работы PAM, и дефолтные конфиги для модулей авторизации если их оставить как есть (а судя по всему они на то и расчитаны - там как бы уже настроены модули winbind), вводят систему в ступор. Во избежание таких эксцессов необходимо поправить 4 файла в /etc/pam.d (предварительно удалив или закомментировав содержимое):

common-auth

Код: Выделить всё

auth        required      pam_env.so
auth        sufficient    pam_unix.so likeauth nullok
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        optional      pam_group.so
auth        sufficient    pam_winbind.so use_first_pass
auth        required      pam_deny.so
auth        optional      pam_cap.so
common-account

Код: Выделить всё

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     sufficient    pam_winbind.so use_first_pass
account     required      pam_permit.so
common-password

Код: Выделить всё

password        [success=2 default=ignore]      pam_unix.so obscure sha512
password        requisite                       pam_deny.so
password        required                        pam_permit.so
password        optional                        pam_gnome_keyring.so
common-session

Код: Выделить всё

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_mkhomedir.so umask=0022 skel=/etc/skel
session     required      pam_unix.so
session     required      pam_winbind.so use_first_pass
Особенности
Если на машине существует локальная учетка, то чтобы залогигиться под доменным пользователем необходимо обособить тот факт, что пользователь из домена. Для этого необходимо указать домен. В данной конфигурации это делается так: OFFICE~user, например

Код: Выделить всё

# ssh <ip> -l OFFICE~user
UPD 30.05.2014: Добавлено включение в локальные группы