CentOS 6 Squid Kerberos LDAP Active Directory Windows Server 2008 R2

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

9 Comments on "CentOS 6 Squid Kerberos LDAP Active Directory Windows Server 2008 R2"

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

  2. Валентин | 29.05.2014 at 23:17 | Ответить

    Конфиг бы привели к примеру полный.
    А так, не работает.

    • Конфиг сквида? Если использовать дефолтный и внести в него только изменения указанные в статье, то все взлетает. Поднимал пару лет назад еще на 6.2 сейчас OS обновилась до 6.5 в сети более 800 клиентских машин, крутиться в виртуалке на достаточно мощном железе. За это время проблем не возникало.

  3. Валентин | 06.06.2014 at 21:12 | Ответить

    Спасибо за ответ, вроде настроил, и даже хелпер прикрутил на керберосе. Перенацелил сквид с 2003 на 2008 и уперся в ошибку процитированную выше от ANT 26.08.2013 в 07:15

    ‘BH gss_accept_sec_context() failed: Unspecified GSS

  4. Валентин | 06.06.2014 at 21:37 | Ответить

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

    >>chown squid:squid /etc/squid/squid.HTTP.keytab
    >>chmod 640 /etc/squid/squid.HTTP.keytab

    И нет не единой записи в логах что не хватает прав…

  5. Добрый день . про проверке «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
    » куда копать в данном случае ? А то что то голова отказывается варить. Пользователь создан все должно работать по идее .

Leave a comment

Your email address will not be published.