Делаем прозрачную аутентификацию доменных пользователей из заданных групп для Squid.
У нас должен быть корректно работающий Active Directory под Windows Server 2008 R2 с настроеной обратной зоной DNS. В нашем случае домен будет называться domain.loc полное имя сервера ad.domain.loc
Открываем Active Directory Users and Computers и создаем Organizational Unit с именем proxy
В нем создадим группы level_1 и level_2 (для каждой группы будут свои разрешения в конфиге сквида)
Создадим пользователей vasya и petya
vasya добавим в группу level_1
petya в группу level_2
Здесь же создадим пользователя squid Обязательно ставим галки на «пользователь не может поменять пароль» и «пароль не устареет».
Скачиваем и ставим CentOS 6.4 minimal
Сервер будет называться proxy.domain.loc
Делаем yum update
Ставим сквид, программы для кербероса и синхронизации времени:
yum install squid krb5-workstation ntpdate ntp
Отключаем файервол, чтобы не мешал пока все не настроим:
chkconfig iptables off service iptables stop chkconfig ip6tables off service ip6tables stop
Прописываем имя сервера в /etc/hosts
192.168.0.10 proxy.domain.loc
!!! Обязательно синхронизируем время с сервером Active Directory !!!
ntpdate ad.domain.loc
лучше для этого настроить демон ntpd
Правим файл /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 = DOMAIN.LOC dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] DOMAIN.LOC = { kdc = ad.domain.loc admin_server = ad.domain.loc } [domain_realm] .domain.loc = DOMAIN.LOC domain.loc = DOMAIN.LOC
На сервере Active Directory создаем ключевой файл:
ktpass -princ HTTP/proxy.domain.loc@DOMAIN.LOC -mapuser squid@DOMAIN.LOC -crypto rc4-hmac-nt -pass your_password -ptype KRB5_NT_PRINCIPAL -out c:\domain.loc.keytab
ВАЖНО!!! В сети много статей, где пароль в этой команде задается в кавычках — ЭТОГО КАТЕГОРИЧЕСКИ ДЕЛАТЬ НЕЛЬЗЯ!!!! Иначе поменяется пароль у пользователя.
Теперь копируем созданный файл в /etc/squid
Ставим права и владельца:
chown squid:squid /etc/squid/domain.loc chmod 640 /etc/squid/domain.loc
Проверяем как все работает по ключу:
kinit -V -k -t /etc/squid/domain.loc.keytab HTTP/proxy.domain.loc
вывод должен быть вида:
Authenticated to Kerberos v5
Теперь авторизуем пользователя через squid_ldap_group
Для пущей секюрности пароль для пользователя squid на сервере Active Directory пропишем в файл /etc/squid/domain.loc.passwd и поставит такие же права как для ключевого файла.
На сервере Active Directory в созданном нами подразделении proxy находиться группа level_1 с пользователем vasya
чтобы его авторизовать вводим следующее:
echo vasya level_1 | /usr/lib64/squid/squid_ldap_group -b dc=domain,dc=loc -f "(&(sAMAccountType=805306368)(sAMAccountName=%u)(memberOf=cn=%a,ou=proxy,dc=domain,dc=loc))" -D squid@domain.loc -W /etc/squid/domain.loc.passwd -R -K -d -h ad.domain.loc
в выводе должно быть:
Connected OK group filter '(&(sAMAccountType=805306368)(sAMAccountName=vasya)(memberOf=cn=level_1,ou=proxy,dc=domain,dc=loc))', searchbase 'dc=domain,dc=loc' OK
Если в группе level_1 нет пользователя vasya то вместо OK будет ERR
Следующем шагом правим конфиг сквида /etc/squid/squid.conf
прописываем сеть откуда будут обращения к сквиду:
acl localnet src 192.168.0.0/24
комментируем строки
http_access allow localnet http_access allow localhost
и после них добавляем:
auth_param negotiate program /usr/lib64/squid/squid_kerb_auth auth_param negotiate children 10 auth_param negotiate keep_alive on external_acl_type ldap_group %LOGIN \ /usr/lib64/squid/squid_ldap_group -b dc=domain,dc=loc \ -f "(&(sAMAccountType=805306368)(sAMAccountName=%u)(memberOf=cn=%a,ou=proxy,dc=domain,dc=loc))" \ -D squid@domain.loc -W /etc/squid/domain.loc.passwd -R -K -p 3268 -h ad.domain.loc
-p 3268 задает порт GC (глобального каталога) с него чтение быстрее и доступны все домены, если их много.
ниже расписываем доступ по группам созданным на сервере Active Directory
acl level_1 external ldap_group level_1 acl level_2 external ldap_group level_2 acl rule_1 url_regex -i vk.com acl rule_2 url_regex -i odnoklassniki.ru http_access allow level_1 !rule_1 http_access allow level_2 !rule_2
после всех правил должна быть строчка
http_access deny all
в этом примере для пользователей из группы level_1 будет запрещен доступ к сайту vk.com и соответственно для пользователей из группы level_2 сайт odnoklassniki.ru
Теперь добавим в самое начало стартового скрипта сквида /etc/init.d/squid
export KRB5_KTNAME=/etc/squid/domain.loc.keytab
либо в файл /etc/krb5.conf в секцию [libdefaults]
default_keytab_name = /etc/squid/domain.loc.keytab
Стартуем сквид
service squid start
и проверяем. Такая конфигурация работает прозрачно для авторизовавшихся пользователей домена на всех современных браузерах.
На этом все!
P.S. Если все это проделываете на FreeBSD, то ставить squid нужно из портов включив опции:
AUTH_LDAP DELAY_POOLS LARGEFILE LAX_HTTP
DELAY_POOLS — если планируете ограничивать пользователей в скорости
LAX_HTTP — если планируете манипулировать заголовками, например скрыть присутствие squid
Здравствуйте, спасибо за Вашу статью, сделал все по ней, но при попытке зайти на сайт через IE, появляется окно авторизации пользователя. Если заходить через firefox просто пишет доступ запрещен.
echo vasya level_1 отрабаотывает нормально. Подскажите, в чем может быть проблема.
Какая ОС на клиенте? У меня было несколько глюкавых Windows XP, которые нормально в домене не работали и так же запрашивали постоянно пароль, но не реагировали на него. Помогла переустановка XP с последующим обновлением до актуального состояния….
P.S. Проблема может быть в синхронизации времени. Также надо установить апдейт timezone от microsoft
P.S. P.S. Проблема точно в синхронизации времени. Необходимо синхронизировать часы с контроллером домена до первого обращения к прокси.
Клиент семерка, пробовал на нескольких компах. Время синхронизировано.
В cache.log на любую попытку клиента выдает:
2013/08/26 09:11:34| authenticateNegotiateHandleReply: Error validating user via Negotiate. Error returned ‘BH gss_accept_sec_context() failed: Unspecified GSS failure. Minor code may provide more information. ‘
Если так происходит со всеми доменными компьютерами, стоит посмотреть логи контроллера, возможно, там что то проясниться.
P.S. Проблема скорее всего в /etc/hosts в нем не должно быть указано короткое имя сервера.
Конфиг бы привели к примеру полный.
А так, не работает.
Конфиг сквида? Если использовать дефолтный и внести в него только изменения указанные в статье, то все взлетает. Поднимал пару лет назад еще на 6.2 сейчас OS обновилась до 6.5 в сети более 800 клиентских машин, крутиться в виртуалке на достаточно мощном железе. За это время проблем не возникало.
Спасибо за ответ, вроде настроил, и даже хелпер прикрутил на керберосе. Перенацелил сквид с 2003 на 2008 и уперся в ошибку процитированную выше от ANT 26.08.2013 в 07:15
‘BH gss_accept_sec_context() failed: Unspecified GSS
Все. Права на keytab по умолчанию висят на root
а должны быть на squid*е
>>chown squid:squid /etc/squid/squid.HTTP.keytab
>>chmod 640 /etc/squid/squid.HTTP.keytab
И нет не единой записи в логах что не хватает прав…
Добрый день . про проверке «kinit -V -k -t /etc/squid/domain.loc.keytab HTTP/proxy.domain.loc» вылазит такая ошибка «kinit: Client not found in Kerberos database while getting initial credentials» . klist выдает «Valid starting Expires Service principal
11/12/14 13:46:19 11/12/14 23:46:32 krbtgt/XXX.LOCAL@XXX.LOCAL
renew until 11/19/14 13:46:19
» куда копать в данном случае ? А то что то голова отказывается варить. Пользователь создан все должно работать по идее .