Очень часто в средних и крупных организациях используют 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 хелперах прокси-сервер вполне штатно отрабатывает уже более месяца без назойливых окошек авторизации.