DataLife Engine > Настройка > Squid и авторизация пользователей в AD

Squid и авторизация пользователей в AD


09-04-2013. Разместил: synergix Squid и авторизация пользователей в ADОчень часто в средних и крупных организациях используют AD (здесь и далее AD - Active Directory). Но, как правило, на шлюзах ставят unix-like системы FreeBSD/Linux и т.п. Для выхода в интернет локальной сети используют два варианта: NAT (Network Address Translation) и прокси сервер. Рассмотрим второй случай, когда для выхода используется прокси сервер (squid).

Для ограничения доступа к прокси серверу необходимо настроить аутентификацию пользователей. Squid поддерживает очень много схем аутентификации, но при наличии AD самым разумным и оптимальным было бы сделать так, чтобы squid брал информацию прямо из AD. При таком методе мы получаем единое хранилище учетных записей. При большом количестве пользователей 50 и более это очень удобно и эффективно. Так как нам не надо заводить для каждого пользователя отдельную учетную запись на шлюзе.

Для реализации данной задачи нам понадобятся следующие пакеты:

samba - необходима для аутентификации пользователей в AD.
squid - кэширующий прокси-сервер.

Исходные данные
Контроллер домена - Windows 2003 server
FreeBSD 9.1 - шлюз, на котором мы и будем настраивать прокси-сервер.
172.16.0.0/16 - наша локальная сеть.
172.16.0.1 - IP контроллера домена.
172.16.0.254 - внутренний IP шлюза.

Перед началом настройки данной связки рекомендую обновить дерево портов. Как это сделать, читаем здесь.

Samba

Итак, начнем по порядку. Собираем самбу.

# cd /usr/ports/net/samba34/
# make config

Options for samba 3.3.4

[X] LDAP          With LDAP support
[X] ADS           With Active Directory support
[ ] CUPS          With CUPS printing support
[X] WINBIND       With WinBIND support
[ ] ACL_SUPPORT   With ACL support
[ ] AIO_SUPPORT   With experimental AIO support
[ ] SYSLOG        With Syslog support
[ ] QUOTAS        With Quota support
[ ] UTMP          With UTMP support
[ ] MSDFS         With MSDFS support
[ ] SAM_XML       With XML support smbpasswd backend
[ ] SAM_MYSQL     With MYSQL smbpasswd backend
[ ] SAM_PGSQL     With PostgreSQL support smbpasswd backend
[ ] SAM_OLD_LDAP  With Samba2.x LDAP smbpasswd backend
[ ] PAM SMBPASS   With SMB PAM module
[ ] POPT          With installed POPT library

# make install clean
# rehash


При конфигурации обращаем внимание на следующие строчки

...
checking for LDAP support... yes
...
checking whether LDAP support is used... yes
checking for Active Directory and krb5 support... yes
...
checking whether Active Directory and krb5 support is used... yes
...

Создаем конфигурационный файл и настраиваем самбу

# cd /usr/local/etc
# cp smb.conf.default smb.conf



#
#   /usr/local/etc/smb.conf
#

#======================= Global Settings =======================
[global]

# netbios имя домена
workgroup = MYCOMPANY

# Строка комментария
server string = MyCompany Proxy Server

# Режим безопасности, в нашем случае ads
security = ads

# Разрешаем доступ только с нашей сети
hosts allow = 172.16.

# расположение лог файла и его размер
log file = /var/log/samba/samba.log
max log size = 500

# Здесь необходимо указать dns имя или ip контроллера домена,
# если указываете dns имя необходимо убедиться, что разрешение
# имен работает правильно
#password server = 172.16.0.1
password server = srv-pdc.mycompany.net


# dns имя Active Directory
realm = mycompany.net

# Тип хранилища.
passdb backend = tdbsam

# Сетевые настройки.
socket options = TCP_NODELAY

# Указываем, что самба не является PDC
local master = no
domain master = no
preferred master = no
domain logons = no
os level = 0

# Настройка кириллицы
display charset = koi8-r
unix charset = koi8-r
dos charset = cp866

# Использовать шифрованные пароли
encrypt passwords = yes

# Настройки winbind
winbind use default domain = no
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes


Теперь необходимо изменить nsswitch.conf, чтобы winbind смог получать информацию из AD

# cat /etc/nsswitch.conf | grep winbind
group: files winbind
passwd: files winbind


Проверяем работу dns и производим синхронизацию времени

# nslookup srv-pdc.mycompany.net
Server:         172.16.0.1
Address:        172.16.0.1#53

Name:   srv-pdc.mycompany.net
Address: 172.16.0.1

# net time set
Tue Apr 9 09:01:51 UZT 2013


Теперь у нас все готово для ввода машины в домен

# net ads join -U DomainAdmin%qwerty25*
Using short domain name -- MYCOMPANY
Joined 'proxy' to realm 'MYCOMPANY.NET'



Пользователь DomainAdmin должен обладать правом добавлять машины в домен. Естественно вы должны использовать своего пользователя. Во избежание проблем настоятельно рекомендую не использовать русские символы в логине и пароле.
Как видно из сообщения машина добавлена в домен. Для того, чтобы убедиться в этом необходимо открыть оснастку - «Active Directory - пользователи и компьютеры»:

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

# echo 'winbindd_enable="YES"' >> /etc/rc.conf
# echo 'winbindd_flags="-d 3"' >> /etc/rc.conf

На время тестирования и поиска неисправностей лучше указывать большой уровень информативности 7-9. При этом уровне, в логах будет очень много полезной информации, которая в 95% случаев поможет найти ошибку. После того, как вы полнсотью настроили данную связку, отладку можно вообще выключить или задать самый маленький уровень информативности - 1.

Запускаем winbind.

# /usr/local/etc/rc.d/samba start
Starting smbd.
Starting winbindd.


Теперь для проверки работоспособности winbind проведем ряд тестов. Для этого воспользуемся программой wbinfo

# wbinfo -p
Ping to winbindd succeeded on fd 4
# wbinfo -t
checking the trust secret via RPC calls succeeded
# wbinfo -u
MYCOMPANY\uproxy
MYCOMPANY\администратор
MYCOMPANY\гость
MYCOMPANY\DomainAdmin
MYCOMPANY\I.Ivanov

# wbinfo -g
MYCOMPANY\компьютеры домена
MYCOMPANY\контроллеры домена
MYCOMPANY\администраторы схемы
MYCOMPANY\администраторы предприятия
MYCOMPANY\издатели сертификатов
MYCOMPANY\администраторы домена
MYCOMPANY\пользователи домена
MYCOMPANY\гости домена
MYCOMPANY\владельцы-создатели групповой политики
MYCOMPANY\серверы ras и ias
MYCOMPANY\dnsadmins
MYCOMPANY\dnsupdateproxy


Если у вас такие же результаты, то значит все нормально и winbind работает правильно. Теперь просмотрим информацию о домене и AD.

# wbinfo -D MYCOMPANY
Name              : MYCOMPANY
Alt_Name          : mycompany.net
SID               : S-1-5-21-220523388-842925246-839522115
Active Directory  : Yes
Native            : Yes
Primary           : Yes
Sequence          : 3143

# net ads info
LDAP server: 192.168.127.1
LDAP server name: server
Realm: MYCOMPANY.NET
Bind Path: dc=MYCOMPANY,dc=NET
LDAP port: 389
Server time: Tue Apr  9 09:10:21 UZT 2013
KDC server: 172.16.0.1
Server time offset: -7

Проверим аутентификацию

# wbinfo --authenticate=MYCOMPANY\\uproxy%qwert25*
plaintext password authentication succeeded
challenge/response password authentication succeeded

Проверим утилитой id доменного пользователя

# id MYCOMPANY\\uproxy%qwert25*
uid=10000(MYCOMPANY\uproxy) gid=10005(MYCOMPANY\администраторы домена)
groups=10005(MYCOMPANY\администраторы домена), 10006(MYCOMPANY\пользователи домена)

Если у вас такие же результаты, то поздравляю, самбу мы настроили. Теперь осталось только указать пользователя, от имени которого будет проходить аутентификация.

# wbinfo --set-auth-user=MYCOMPANY\\uproxy%qwert25*
# wbinfo --get-auth-user
MYCOMPANY\uproxy%qwert25*


Теперь перейдем к настройке Squid
Собираем squid

# cd /usr/ports/www/squid/
# make config

Options for squid 3.1.23

[ ] SQUID_LDAP_AUTH        Install LDAP authentication helpers
[X] SQUID_DELAY_POOLS      Enable delay pools
[X] SQUID_SNMP             Enable SNMP support
[ ] SQUID_CARP             Enable CARP support
[X] SQUID_SSL              Enable SSL support for reverse proxies
[X] SQUID_PINGER           Install the icmp helper
[ ] SQUID_DNS_HELPER       Use the old 'dnsserver' helper
[X] SQUID_HTCP             Enable HTCP support
[ ] SQUID_VIA_DB           Enable forward/via database
[X] SQUID_CACHE_DIGESTS    Enable cache digests
[X] SQUID_WCCP             Enable Web Cache Coordination Protocol
[ ] SQUID_UNDERSCORES      Allow underscores in hostnames
[X] SQUID_CHECK_HOSTNAME   Do hostname chechking
[ ] SQUID_STRICT_HTTP      Be strictly HTTP compliant
[X] SQUID_IDENT            Enable ident (RFG 931) lookups
[ ] SQUID_USERAGENT_LOG    Enable User-Agent-header logging
[X] 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-Forfarded-For headers
[ ] SQUID_ICAP             Enable ICAP client functionality
[ ] SQUID_AUFS             Enable the aufs storage scheme
[ ] SQUID_COSS             Enable the COSS storage scheme
[ ] SQUID_LARGEFILE        Support log and cache files >2GB
[ ] SQUID_STACKTRACES      Create backtraces on fatal errors
[X] SQUID_RCNG             Install an rcNG startup script

# make install clean
# rehash


Приводим конфиг squid к следующему виду:
Следует заметить, что это минимальная конфигурация.


acl manager proto cache_object
acl webserver src 172.16.0.1/32
acl LocalNet src 172.16.0.0/16
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8

acl SSL_ports port 443
acl Safe_ports port 80 # https
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # httpss
acl CONNECT method CONNECT

auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --require-membership-of=MYCOMPANY\\Internet
auth_param ntlm children 200
authenticate_ttl 20 minutes

auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic --require-membership-of=MYCOMPANY\\Internet
auth_param basic children 20
auth_param basic realm Mycompany Proxy Server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

acl MYCOMPANY proxy_auth REQUIRED
https_access allow MYCOMPANY

https_access allow manager localhost
https_access allow manager webserver
https_access deny manager
https_access deny !Safe_ports
https_access deny CONNECT !SSL_ports
https_access allow LocalNet
https_access deny all
log_access deny localhost
https_port 172.16.0.254:3128

#Эта секция использует squidGuard для фильтрации нежелательного контенкта. О его настроки и возможностях речь пойдет в следующих статьях.
#url_rewrite_program /usr/local/bin/squidGuard -c /usr/local/etc/squid/squidGuard.conf
#url_rewrite_children 10
#url_rewrite_bypass on

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY


cache_dir ufs /var/squid/cache/ 2000 16 256
access_log /var/log/squid/access.log squid
cache_store_log none
pid_filename /var/run/squid/squid3.pid
icon_directory /usr/local/etc/squid/icons
error_directory /usr/local/etc/squid/errors/ru
cache_mgr root@qizilqumsement.uz

cache_mem 300 MB
maximum_object_size 500 KB
maximum_object_size_in_memory 100 KB
cache_swap_low 90
cache_swap_high 95

memory_pools off

visible_hostname proxy.mycompany.net

# users(sarg)
log_fqdn on

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

coredump_dir /var/squid/cache/squid



Если вы впервый раз запускаете squid, то перед запуском необходимо создать иерархию папок для кеша. Для этого запускаем squid со следующими ключами:

# squid -D -d 3 -z
2006/03/19 17:50:02| Creating Swap Directories

Ну а теперь настало время проверить нашу связку, но перед этим необходимо выставить права на папку winbind_privileged, иначе squid не сможет проводить аутентификацию.

# chown -R root:squid /var/db/samba/winbindd_privileged/
# chmod -R 750 /var/db/samba/winbindd_privileged/

Настраиваем запуск squid вместе с системой

# echo 'squid_enable="YES"' >> /etc/rc.conf


Запускаем squid и тестируем работу, выставив в настройках браузера адрес и порт прокси-сервера, в нашем случае это 172.16.0.254:3128. Если пользователь произвел вход в домен и состоит в группе Internet, то откроется запрашиваемая веб-страничка.
Теперь удалим пользователя из группы Internet. В этом случае пользователь получит окошко с требованием авторизации.
В логах при этом будет писаться следующее:

В случае успешной авторизации:

1365487456.173    793 172.16.1.52 TCP_MISS/200 17047 GET https://google.com MYCOMPANY\i.ivanov DIRECT/173.194.47.233 text/html


В противном же случае:

1365487781.878     21 172.16.1.52 TCP_DENIED/407 1801 GET https://ya.ru - NONE/- text/html


Вот собственно и все. Комфортной вам работы ;)

UPD. В ходе продолжительной эксплуатации выявилась неприятная особенность, выражающаяся в том, что несмотря на большое количестве хелперов авторизации (даже при увеличении до 500) у пользователей периодически выскакивало окошко авторизации, нервируя пользователей. Связано это с заморочками связки самбы со сквидом. Решилось откатом сквида на версию 2.7 с минимальной правкой конфига. В новой конфигурации даже при 100 хелперах прокси-сервер вполне штатно отрабатывает уже более месяца без назойливых окошек авторизации.
Вернуться назад