Squid & Active Directory Windows

Аутентификация пользователей в squid через доменные аккаунты Windows
Задача.

Необходимо аутентифицировать пользователей в squid на основе доменных
аккаунтов. Не всегда подходит классическая схема учета трафика по IP
адресам примеры случаев когда подобная ситуация не устраивает достаточно
полно описаны в [1].

Инструменты.

1. OC FreeBSD использовались версии FreeBSD 7.2-RELEASE
2. Windows 2003 - контроллер домена.
3. samba34-3.4.9_2
4. squid-2.7.9

Сеть и топология.

Домен - msk.vbrr.loc
Контроллер домена - dc1.msk.vbrr.loc
Рабочие станции соответственно - *.msk.vbrr.loc
Машина на которой установлен squid - fox2.msk.vbrr.loc

Практическое руководство.

1. Настройка клиента Kerberos

В FreeBSD существует две реализации Kerberos производства MIT и HEIMDAL,
соединиться с сервером Kerberos используемым в Windows 2003 получилось
в случае использования Kerberos клиента производства HEIMDAL.
Более того, он работает, только если версия старше 0.6. В седьмой
ветке FreeBSD в базовой системе идет Kerberos производства HEIMDAL
версии  0.6.3,

         [root@fox2] /root/> kadmin -v
         kadmin (Heimdal 0.6.3)
         Copyright 1999-2004 Kungliga Tekniska Hogskolan
         Send bug-reports to heimdal-bugs@pdc.kth.se

Важное замечание - DNS сервер, прописанный в /etc/resolv.conf ДОЛЖЕН
ЗНАТЬ о зоне используемой для построения Windows домена (наиболее
удобный путь настроить его как вторичный DNS сервер). Клиент Kerberos
будет искать записи типа SRV _kerberos._udp.

Файл /etc/resolv.conf:
=====================================================================
         domain  msk.vbrr.loc
         nameserver      10.1.10.25
         nameserver      10.1.10.2
         nameserver      10.1.2.64
=====================================================================

Настраиваем клиента Kerberos. В файл /etc/krb5.conf необходимо добавить
информацию о сервере Kerberos в нашем случае это:

=====================================================================
[libdefaults]
        default_realm = MSK.VBRR.LOC
        clockskew = 300
        v4_instance_resolve = false
        v4_name_convert = {
                host = {
                        rcmd = host
                        ftp = ftp
                }
                plain = {
                        something = something-else
                }
        }

[realms]
        MSK.VBRR.LOC = {
                kdc = dc1.msk.vbrr.loc
                admin_server = dc1.msk.vbrr.loc
        }
        OTHER.REALM = {
                v4_instance_convert = {
                        kerberos = kerberos
                        computer = computer.some.other.domain
                }
        }
[domain_realm]
        .msk.vbrr.loc = MSK.VBRR.LOC
        msk.vbrr.loc = MSK.VBRR.LOC

;[logging]
;  kdc = FILE:/var/log/kdc.log
;  admin_server = FILE:/var/log/kadmin.log
;  default = FILE:/var/log/krb5lib.log
=====================================================================

Все остальные опции можно оставлять по умолчанию.
Попробуем соединиться с сервером Kerberos.

        [root@fox2] /root/> kinit -p a_afn@MSK.VBRR.LOC
        a_afn@MSK.VBRR.LOC's Password:

Где, a_afn - пользователь с административными правами в домене MSK.VBRR.LOC

И вводим пароль, система должна выдать

        kinit: NOTICE: ticket renewable lifetime is 1 week


проверим соединение, в моем случае это выглядит так:

        [root@fox2] /root/> klist
        Credentials cache: FILE:/tmp/krb5cc_0
                Principal: a_afn@MSK.VBRR.LOC

          Issued           Expires        Principal                    
        Apr 15 15:30:08  Apr 16 03:10:38  krbtgt/MSK.VBRR.LOC@MSK.VBRR.LOC

Отлично, соединение есть.


2. Samba

Устанавливаем /usr/ports/net/samba34/. Необходимые опции:

        Options for samba34 3.4.9_2

        [X] LDAP         With LDAP support                        
        [X] ADS          With Active Directory support            
        [ ] CUPS         With CUPS printing support               
        [X] WINBIND      With WinBIND support                     
        [ ] SWAT         With SWAT WebGUI                         
        [ ] ACL_SUPPORT  With ACL support                         
        [ ] AIO_SUPPORT  With Asyncronous IO support              
        [ ] FAM_SUPPORT  With File Alteration Monitor             
        [ ] SYSLOG       With Syslog support                      
        [ ] QUOTAS       With Disk quota support                  
        [ ] UTMP         With UTMP accounting support             
        [ ] PAM_SMBPASS  With PAM authentication vs passdb backends
        [ ] DNSUPDATE    With dynamic DNS update(require ADS)     
        [ ] AVAHI        With Bonjour service discovery support   
        [ ] EXP_MODULES  With experimental modules                
        [X] POPT         With system-wide POPT library            
        [ ] MAX_DEBUG    With maximum debugging                   
        [ ] SMBTORTURE   With smbtorture                          

Далее необходимо настроить smb.conf
Отличное руководство по этому процессу [6].

Опции, которые добавили в /usr/local/etc/smb.conf:

=====================================================================
        [global]
        ;bind interfaces only = yes
        ;interfaces = 127.0.0.1/8  10.1.102.200/24
        winbind separator = +
        winbind use default domain = yes
        winbind uid = 10000-20000
        winbind gid = 10000-20000
        winbind enum users = no
        winbind enum groups = no
        template homedir = /home/winnt/%D/%U
        template shell = /bin/sh
        workgroup = MSK
        server string = FOX2 samba serveR
        security = ads
        ;  guest account = pcguest
        log file = /var/log/samba34/log.%m
        log level = 3 passdb:5 auth:10 winbind:9
        max log size = 50
        password server = dc1.msk.vbrr.loc
        realm = msk.vbrr.loc
        ;   passdb backend = tdbsam
        ;   include = /usr/local/etc/smb.conf.%m
        socket options = TCP_NODELAY
        #============================ Share Definitions ==============================
        [homes]
           comment = Home Directories
           browseable = no
           writable = yes
=====================================================================

Входим в домен:

        [root@fox2] /root/> net ads join -U a_afn
        Enter a_afn's password:
        Using short domain name -- MSK
        Joined 'FOX2' to realm 'msk.vbrr.loc'

3. winbindd

Следующим шагом у нас запуск winbindd.

В файл /etc/rc.conf добавляем:

...
winbindd_enable="YES"
winbindd_flags="-d 3"
...

И запускаем с ключиком -d 3, в debug режиме. Потом можно убрать.

Файл /etc/nsswitch.conf оставляем как есть:
=====================================================================
        #
        # nsswitch.conf(5) - name service switch configuration file
        # $FreeBSD: src/etc/nsswitch.conf,v 1.1.8.1 2009/04/15 03:14:26 kensmith Exp $
        #
        group: files
        group_compat: nis
        hosts: files dns
        networks: files
        passwd: files
        passwd_compat: nis
        shells: files
        services: compat
        services_compat: nis
        protocols: files
        rpc: files
=====================================================================

Проверить работоспособность winbind можно командой wbinfo

Необходимо удостовериться, что winbind нормально работает и может
получать списки пользователей и групп с сервера.

        [root@fox2] /root/> wbinfo -t
        checking the trust secret via RPC calls succeeded

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

Посмотрим на список пользователей.

        [root@fox2] /root/> wbinfo -u (для просмотра пользователей)
        ...
        fox2
        ...

Как видно, аккаунт для нашего компьютера уже создался (fox2) и
взаимодействие налажено.

Попробуем аутентифицироваться в домене:

        [root@fox2] /root/> wbinfo -a a_afn
        plaintext password authentication succeeded
        challenge/response password authentication succeeded

На этом настройку winbind можно считать законченной.

4. squid

Устанавливаем /usr/ports/www/squid

        Options for squid 2.7.9

        [X] SQUID_KERB_AUTH      Install Kerberos authentication helpers
        [X] SQUID_LDAP_AUTH      Install LDAP authentication helpers   
        [X] SQUID_NIS_AUTH       Install NIS/YP authentication helpers 
        [ ] SQUID_SASL_AUTH      Install SASL authentication helpers   
        [X] SQUID_DELAY_POOLS    Enable delay pools                    
        [ ] SQUID_SNMP           Enable SNMP support                   
        [X] SQUID_CARP           Enable CARP support                   
        [ ] SQUID_SSL            Enable SSL support for reverse proxies
        [ ] SQUID_PINGER         Install the icmp helper               
        [ ] SQUID_DNS_HELPER     Use the old 'dnsserver' helper        
        [ ] SQUID_HTCP           Enable HTCP support                   
        [ ] SQUID_VIA_DB         Enable forward/via database           
        [ ] SQUID_CACHE_DIGESTS  Enable cache digests                  
        [ ] SQUID_WCCP           Enable Web Cache Coordination Prot. v1
        [ ] SQUID_WCCPV2         Enable Web Cache Coordination Prot. v2
        [ ] SQUID_STRICT_HTTP    Be strictly HTTP compliant            
        [ ] SQUID_IDENT          Enable ident (RFC 931) lookups        
        [ ] SQUID_REFERER_LOG    Enable Referer-header logging         
        [ ] SQUID_USERAGENT_LOG  Enable User-Agent-header logging      
        [ ] SQUID_ARP_ACL        Enable ACLs based on ethernet address 
        [ ] SQUID_PF             Enable transparent proxying with PF   
        [ ] SQUID_IPFILTER       Enable transp. proxying with IPFilter 
        [ ] SQUID_FOLLOW_XFF     Follow X-Forwarded-For headers        
        [ ] SQUID_AUFS           Enable the aufs storage scheme        
        [ ] SQUID_COSS           Enable the COSS storage scheme        
        [X] SQUID_KQUEUE         Use kqueue(2) instead of poll(2)      
        [ ] SQUID_LARGEFILE      Support log and cache files >2GB      
        [ ] SQUID_STACKTRACES    Create backtraces on fatal errors     

Насколько видно из Makefile helper для winbind включен по умолчанию.
Т.е. ничего особенного конфигурировать не нужно.

После установки при запущенном winbindd необходимо проверить работу
helper'а. Для этого запускаем:

        /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic

Если получен ответ OK значит все отлично. Иначе необходимо смотреть логи
winbindd

Настраиваем собственно сам squid. Отличное руководство по это делу [3]

Файл /usr/local/etc/squid/squid.conf выглядит следующим образом:
=====================================================================
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 10
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563 1443 2443 9091
acl CONNECT method CONNECT
acl local-servers dstdomain .vbrr.loc
acl ssl_sites  url_regex "/usr/local/etc/squid/ssl_sites.txt"
acl blocked   url_regex "/usr/local/etc/squid/block.txt"
acl noblocked url_regex "/usr/local/etc/squid/unblock.txt"
acl sirius src 10.1.10.65 10.2.1.75 10.1.102.12 10.1.10.64 10.1.10.63 10.2.1.30 10.2.1.31
acl ctrl src 10.1.100.4 10.2.1.96 10.2.1.95 10.1.2.100
acl NTLMauth proxy_auth REQUIRED
acl odnoklassniki url_regex odnoklassniki.ru
acl worktime    time    09:00-13:00
acl worktime    time    14:00-18:00
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow ctrl
http_access allow CONNECT ctrl
http_access deny NTLMauth sirius odnoklassniki worktime
http_access allow sirius NTLMauth
http_access deny sirius
http_access deny all
http_reply_access allow all
icp_access allow all
http_port 3128
cache_peer 10.1.10.9  parent 3128 3130 no-query default
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_dir null /usr/local/squid/cache
access_log /usr/local/squid/logs/access.log squid
cache_log /usr/local/squid/logs/cache.log
cache_store_log none
logfile_rotate 1
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
upgrade_http0.9 deny shoutcast
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
visible_hostname sadr.msk.vbrr.loc
never_direct deny local-servers
never_direct allow all
coredump_dir /usr/local/squid/cache
=====================================================================

В данном случае были добавлены следующие стороки:

        auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
        auth_param ntlm children 10
        auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
        auth_param basic children 5
        auth_param basic realm Squid proxy-caching web server
        auth_param basic credentialsttl 2 hours

Данная конфигурация описывает два helper'a один дня IE (ntlmssp)
другой для всех остальных пользователей (mozilla, opera, etc).

Необходимо отметить что для нормальной работы из броузера у пользователя
под который работает squid должно хватать прав для обращения к сокету на
котором слушает winbindd. Согласно man ntlm_auth это winbindd_privileged
в $LOCKDIR. В моем случае сокет находиться в
/var/db/samba34/winbindd_privileged. Для решения проблемы нужно изменить
группу владельца этой директории на squid.

[root@fox2] /root/> chown root:squid /var/db/samba34/winbindd_privileged
[root@fox2] /root/> ls -al /var/db/samba34/ | grep winbindd_privileged
drwxr-x---   2 root  squid       512 Apr 20 11:36 winbindd_privileged

После этого можно приступать к полноценному тестированию из веб броузера.


5. Как это выглядит

В случае если пользователь не входит в домен ему выдается окно в котором
предлагается ввести имя пользователя, пароль и домен. Клиенты вошедшие в
домен и использующие IE аутентифицируются прозрачно. Клиенты вошедшие в
домен и использующие иные броузеры аутентифицируются по протоколу basic.
Каждый раз при запуске вводят имя и пароль.

Самая главная проблема - невозможность аутентифицировать пользователей с
русскими именами.


6. Дополнительный функционал

Дополнительно можно использовать возможность управлять доступом в
Internet из Windows. Для этого можно воспользоваться параметром
--require-membership-of= ntlm_auth. Как видно из названия при
аутентификации helper будет требовать наличие пользователя в
определенной группе. В моем случае указание там названия группы проблемы
не решило. Пришлось указывать универсальный идентификатор группы в
домене (SID). Узнать его можно с помощью уже знакомой программы wbinfo.
Например, если необходимо узнать SID группы inetusers:

        [root@fox2] /root/> wbinfo -n inetusers
        S-1-5-21-1828638205-4279006917-513177360-1121 Domain Group (2)


После этого необходимо изменить конфигурационный файл squid указав в
местах описания хелперов необходиму директиву.

        auth_param ntlm program /usr/local/bin/ntlm_auth \
          --require-membership-of=S-1-5-21-1828638205-4279006917-513177360-1121 \
          --helper-protocol=squid-2.5-ntlmssp


Теперь пользователи которые не входят в группу inetusers не смогут выйти
в Internet.

Источники.

1. http://www.opennet.ru/base/net/win_squid.txt.html
2. http://www.opennet.ru/base/net/win_domain_squid.txt.html
3. http://www.squid-cache.org
4. http://www.squid-cache.org/Doc/FAQ/FAQ-23.html
5. http://devel.squid-cache.org/ntlm/squid_helper_protocol.html
6. http://groups-beta.google.com
7. http://samba.org/samba/docs/man/Samba-HOWTO-Collection/domain-member.html
8. http://www.wlug.org.nz/ActiveDirectoryKerberos

Комментариев нет:

Отправить комментарий