вторник, 25 августа 2015 г.

Samba с авторизацией через Active Directory


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

В статье использованы следующие данные:
имя домена – fmd1.local
первичный контролер домена c DNS (PDC) – srvc.fmd1.local, его IP 197.168.17.50
резервные контролеры домена (BDС) 197.168.18.5, 197.168.17.110
настраиваемый сервер – gateway, его IP 197.168.17.104

1. Проверяю и если нужно обновляю Debian – 'apt-get update' и 'apt-get upgrade'.
2. Проверяю и при необходимости меняю имя сервера – 'nano /etc/hostname'? например у меня:
gateway
3. Проверяю и редактирую 'nano /etc/hosts' чтобы в нем были записи полного и короткого доменного имени, пример:
127.0.0.1         localhost
197.168.17.104          gateway.fmd1.local    gateway
4. Правлю 'nano /etc/resolv.conf' до вида:
domain fmd1.local
search fmd1.local
nameserver 197.168.17.50
5. Устанавливаю демона обновления времени 'apt-get install ntpdate' и настраиваю его 'nano /etc/default/ntpdate' в моем случае:
NTPSERVERS="0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org 4.srvc.fmd1.local"
NTPOPTIONS=""
6. Запускаю ручную синхронизацию 'ntpdate -s srvc.fmd1.local' 
7. Устанавливаю необходимые пакеты и библиотеки 'apt-get install krb5-user samba winbind libpam-krb5 libpam-winbind libnss-winbind' 
8. Обнуляю базовый конфиг 'cat /dev/null > /etc/krb5.conf' и пишу свой 'nano /etc/krb5.conf' получилось следующее:
 
[libdefaults]
    default_realm = FMD1.LOCAL # (обязательно большими)
    ticket_lifetime = 24000
    clock_skew = 300
    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]
    FMD1.LOCAL = {
    kdc = 197.168.17.50
    kdc = 197.168.18.5
    kdc = 197.168.17.110
    admin_server = 197.168.17.50
                                  }
 
[domain_realm]
    .fmd1.local = FMD1.LOCAL
    fmd1.local = FMD1.LOCAL
 
[login]
    krb4_convert = true
    krb4_get_tickets = false
 
[logging]
    default = FILE:/var/log/krb5libs.log
    kdc = FILE:/var/log/krb5dc.log
    admin_server = FILE:/var/log/ksadmind.log
 
Внимание!!! Везде где имя домена прописано заглавными буквами оно должно быть прописано БОЛЬШИМИ буквами, чтобы потом не разбираться, почему не работает.
 
9. Создаю файлы для логов 'touch /var/log/krb5libs.log' 'touch /var/log/krb5dc.log' 'touch /var/log/ksadmind.log' и даю к ним права доступа 'chmod 777 /var/log/krb5libs.log' ' chmod 777 /var/log/krb5dc.log' ' chmod 777 /var/log/ksadmind.log'
10. Проверяю возможность авторизации в AD командой 'kinit username@DOMAIN.COM' Важно имя домена писать ЗАГЛАВНЫМИ буквами!!! Получиться должно как-то так:
 
root@gateway:/# kinit admin@FMD1.LOCAL
Password for admin@FMD1.LOCAL:
 
11. Проверяю получен ли билет от кербероса командой 'klist' должно получиться похожее на следующее:
 
root@gateway:/# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin@FMD1.LOCAL
 
Valid starting       Expires              Service principal
19.08.2015 11:09:01  19.08.2015 17:48:57  krbtgt/FMD1.LOCAL@FMD1.LOCAL
 
12. Настраиваю дальше конфиг самбы, предварительно обнулив - 'nano /etc/samba/smb.conf' у меня получился он таким:
 
[global]
    server string = Gateway
    interfaces = eth2
    wins server = 197.168.17.50
    password server = *
    realm = FMD1.LOCAL
    workgroup = FMD1
    security = ads
    encrypt passwords = yes
    admin users=admin
    
    #Разрешить заводить учетки с пустыми паролями
    null passwords = true
    
    log file = /var/log/samba/log.%m
    debug level = 2
    log level = 1
    max log size = 50
    
    dns proxy = no
    socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
    name resolve order = hosts bcast lmhosts
    
    #Не контролировать чувствительность к регистру.
    case sensitive = no
    
    client use spnego = yes
    client ntlmv2 auth = yes
    client signing = yes
    
    #Чтобы самба не пыталась стать главной в группе и домене или даже контролером домена
    local master = no
    domain master = no
    preferred master = no
    os level = 0
    domain logons = no
    
    unix charset = UTF-8
    dos charset = 866
    
    #Включить режим обработки симлинков сервером. Когда клиенты - это компьютеры с windows
    unix extensions = no
    follow symlinks = yes
    
    auth methods = winbind
    idmap config * : range = 10000-40000
    idmap config * : backend = tdb 
#  winbind separator = »
    winbind enum groups = yes
    winbind enum users = yes
    template homedir = /home/%D/%U
    template shell = /bin/bash
    winbind use default domain = yes
    winbind refreshtickets = yes
    
    # Возможность оффлайн-авторизации при недоступности контроллера домена
    winbind offline logon = yes
    winbind cache time = 300
    
    # Отключить поддержку принтеров
    load printers = no
    show add printer wizard = no
    printcap name = /dev/null
    disable spoolss = yes
 
#[printers]
#  comment = All Printers
#  browseable = no
#  path = /var/spool/samba
#  printable = yes
#  guest ok = no
#  read only = yes
#  create mask = 0700
 
#[print$]
#  comment = Printer Drivers
#  path = /var/lib/samba/printers
#  browseable = yes
#  read only = yes
#  guest ok = no
 
[cdrom]
    comment = %h - CD-ROM
    read only = yes
    locking = no
    path = /cdrom
    guest ok = yes 
 
[Upload]
    comment = %h - Upload
    path = /mnt/upload
    browseable = yes
    writeable = yes
    directory mask = 0777
    create mask = 0666
    valid users = @"Domain admins", FMD1\admin
 
13. Проверяю конфиг командой 'testparm' получаю результат проверки:
 
root@gateway:/# testparm
Load smb config files from /etc/samba/smb.conf
WARNING: The "null passwords" option is deprecated
Processing section "[cdrom]"
Processing section "[Upload]"
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
 
Обращает внимание на параметр null passwords, но собственно он мне-нужен так что не страшно.
14. Рестартую samba и winbind командой '/etc/init.d/winbind stop && /etc/init.d/samba restart && /etc/init.d/winbind start'
15. Ввожу сервер в домен – 'net ads join -U admin' спросил пароль - набрал. Бывает что не находит домен автоматически, помогает иногда принудительное указание командой 'net ads join -U admin -S srvc.fmd1.local'
16. Перезапускаю winbind для считывания доменных пользователей и групп - '/etc/init.d/winbind force-reload'
17. Проверяю считал ли с AD пользователей и групп:
'wbinfo -t' установил ли доверительные отношения с доменом:
 
root@gateway:/# wbinfo -t
checking the trust secret for domain FMD1 via RPC calls succeeded
 
'wbinfo –u' считал ли пользователей
'wbinfo -g' считал ли группы
Если все настроено нормально winbind покажет пользователей и группы прописанные в AD.
18. Интегрирую winbind в систему для возможности назначения пользователей и групп домена для доступа к файлам правя конфиг – 'nano /etc/nsswitch.conf' до вида:

passwd:         compat winbind
group:          compat winbind
shadow:         compat winbind
gshadow:        files
 
hosts:          files dns mdns4_minimal[NotFoud=return] mdns4
 
networks:       files
 
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
 
netgroup:       nis
 
19. Проверяю на сколько успешно прошла интеграция командами:
'getent passwd' должна вернуть перечень не только локальных но и доменных пользователей
'getent group' должна вернуть перечень не только локальных но и доменных групп
!!! При первоначальной настройке я не установил библиотеки libpam-winbind libnss-winbind в результате чего эти команды возвращали только локальных пользователей и групп. 
20. Для настройки аутентификации и авторизации пользователей AD на сервере модифицирую PAM – 'nano /etc/pam.d/samba' добавив 2 строчки:
для х86 систем:
auth required /lib/security/pam_winbind.so
account required /lib/security/pam_winbind.so
для х64:
auth required /lib/x86_64-linux-gnu/security/pam_winbind.so
account required /lib/x86_64-linux-gnu/security/pam_winbind.so
У меня получился такой конфиг:
 
@include common-auth
@include common-account
@include common-session-noninteractive
 
auth required /lib/x86_64-linux-gnu/security/pam_winbind.so
account required /lib/x86_64-linux-gnu/security/pam_winbind.so
 
21. Перегружаю сервер, ввожу аккаунт и пароль доменного пользователя и попадаю в систему. Все работает.
22. Внимание, если настроен фаервол, то надо разрешить входящие UDP пакеты с 137-го порта. В iptables правило выглядит примерно так:
iptables -A INPUT -i eth2 -p udp --sport 137 -j ACCEPT