Работа Squid с Active Directory. Kerberos-аутентификация. Права доступа на основе групп Active Directory.

В предыдущей статье мы разбирали как развернуть прокси-сервер Squid 3.5.19 на Ubuntu 14.04.5 LTS. А сейчас мы разберем как подружить Squid 3.5.19 c Active Directory, чтобы доступ в интернет предоставлялся только по доменным учетным записям, а так же возможность использования Active Directory групп для разграничения прав доступа в интернет.

 

Squid у меня установлен на Ubuntu 14.04.5 LTS x64 (srv-squid), имеется домен контроллер srv-dc1 (testzone.local) на Windows Server 2008 R2. Авторизацию Squid будем делать через Kerberos. Поехали..

 

Проведем подготовительные работы на машине где установлен Squid.

 

Укажем корректное для работы сActive Directory название машины. Вызываем редактирование файла /etc/hostname

sudo nano /etc/hostname

И к названию системы дописываем название вашего домена (в моем случае я дописываю .testzone.local)

srv-squid.testzone.local

Теперь отредактируем файл /etc/hosts 

sudo nano /etc/hosts

И под записью 127.0.0.1 localhost прописываем данные нашей системы (IP-адрес машины | полное название машины с указанием домена | название машины без указания домена)

192.168.1.5 srv-squid.testzone.local srv-squid

Перезапускаем систему

sudo shutdown -r now

Для нормальной работы с доменом Active Directory и прохождения Kerberos-аутентификации важно чтобы часы системы где находится Squid были синхронизированы с часами на контроллере домена. Корректировать время в системе мы будем с помощью NTP. Если он у вас в системе уже установлен, то пропускаем установку и переходим к настройке. Если же в системе NTP не установлен, устанавливаем его.

sudo apt-get install ntp

Открываем для редактирования конфигурационный файл NTP

sudo nano /etc/ntp.conf

Комментируем строки

#server 0.ubuntu.pool.ntp.org
#server 1.ubuntu.pool.ntp.org
#server 2.ubuntu.pool.ntp.org
#server 3.ubuntu.pool.ntp.org
#server ntp.ubuntu.com

и дописываем ниже домен контроллеры по которым будем сверять время

server srv-dc1.testzone.local

Сохраняем Ctrl+O и закрываем Ctrl+O конфигурационный файл.

Останавливаем службу ntp

sudo /etc/init.d/ntp stop

Синхронизируем время системы с домен контроллером.

sudo ntpdate srv-dc1

Запускаем службу ntp

sudo /etc/init.d/ntp start

Проверить синхронизацию времени можно выполнив команду

sudo ntpq -p

В выводе обращаем внимание на колонки:

when -время с последнего ответа сервера,
pool - время опроса сервера,
offset - разница времени в секундах.

Теперь проведем подготовительные работы в AD чтобы наша система и Squid могли авторизоваться в ней успешно. В оснастке DNS, в Forward Lookup Zones добавьте A-запись для нашей системы где у нас стоит Squid

squid-ad-1

ВАЖНО: Обязательно при добавлении записи, отмечаем галочкой пункт: Create associated pointer (PTR) record

Создаем в домене учетную запись служебного пользователя в AD для работы Squid, в моем случае учетная запись будет squid-s.

squid-ad-2 squid-ad-3

Теперь создадим специальный keytab-файл с помощью утилиты ktpass. В дальнейшем keytab-файл будет использоваться Squid для аутентификации пользователей в AD. Откроем командную строку от имени администратора и введем следующую команду (соблюдая регистр):

ktpass -princ HTTP/srv-squid.testzone.local@TESTZONE.LOCAL -mapuser squid-s -pass Aa1234567 -ptype KRB5_NT_PRINCIPAL -out C:\srv-squid.keytab

Ответ об успешном создании keytab-файла будет вида:

Targeting domain controller: SRV-DC1.testnone.local
Using legacy password setting method
Successfully mapped HTTP/srv-squid.testzone.local to squid-s.
Key created.
Output keytab to C:\srv-squid.keytab:
Keytab version: 0x502
keysize 80 HTTP/srv-squid.testzone.local@TESTZONE.LOCAL ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x17 (RC4-HMAC) keylength 16 (0x58705ad7aee5c92df1aa249430acad10)

Передаем сгенерированный keytab-файл на систему где развернут Squid любым доступным образом.

После того, как мы передали keytab-файл на систему со Squid, переместим его в папку с настройками Squid и ограничим к нему доступ.

sudo mv /home/admin/srv-squid.keytab /etc/squid/srv-squid.keytab

Затем изменим владельца и установим ограниченные права на файл:

sudo chown proxy:proxy /etc/squid/srv-squid.keytab
sudo chmod 640 /etc/squid/srv-squid.keytab

Все готово для установки Kerberos, установим пакет krb5-user

sudo apt-get install krb5-user

Информация: Если в ходе установки появится запрос указать «Область по умолчанию для Kerberos«, то необходимо его указать в заглавном виде (прим. TESTZONE.LOCAL)

Перед конкурированием Kerberos создадим резервную копию файла конфигурации.

sudo cp /etc/krb5.conf /etc/krb5.conf.backup

Редактируем файл /etc/krb5.conf

sudo nano /etc/krb5.conf

и приводим его к виду:

[libdefaults]

default_realm = TESTZONE.LOCAL
ticket_lifetieme = 24h
dns_lookup_realm = false
dns_lookup_kdc = false
default_keytab_name = /etc/squid/srv-squid.keytab
forwardable = yes
clock_skew = 300

default_tgs_enctypes = des-cbc-crc rc4-hmac des-cbc-md5
default_tkt_enctypes = des-cbc-crc rc4-hmac des-cbc-md5
permitted_enctypes = des-cbc-crc rc4-hmac des-cbc-md5

[realms]

TESTZONE.LOCAL = {
kdc = srv-dc1.testzone.local
admin_server = srv-dc1.testzone.local
default_domain = TESTZONE.LOCAL
}

[domain_realm]

.testzone.local = TESTZONE.LOCAL
testzone.local = TESTZONE.LOCAL

Пояснения:

Секция [libdefaults] содержит параметры по умолчанию, а именно область Kerberos и keytab-файл.

Секция [realms] описывает области Kerberos.

Cекция [domain_realm] сопоставляет домены с областями Kerberos

Сохраняем Ctrl+O и закрываем Ctrl+X файл. Проверим работу Kerberos, для этого выполним команду

sudo kinit -kV -p HTTP/srv-squid.testzone.local

Если получен ответ вида представленного ниже, то все нормально, билет получен и можно двигаться дальше.

Using default cache: /tmp/krb5cc_0
Using principal: HTTP/srv-squid.testzone.local@TESTZONE.LOCAL
Authenticated to Kerberos v5

Удаляем полученный билет, он нам не нужен.

sudo kdestroy

Установим необходимую зависимость для работы Squid и AD

sudo apt-get install libsasl2-modules-gssapi-mit

Укажем Squid путь к нашему keytab-файлу, редактируем файл /etc/init.d/squid

sudo nano /etc/init.d/squid

находим строку:

DESC="Squid HTTP Proxy"

и ниже прописываем следующее:

KRB5_KTNAME=/etc/squid/srv-squid.keytab
export KRB5_KTNAME

Сохраняем Ctrl+O и закрываем Ctrl+X файл.

Осталось выполнить конфигурацию самого Squid для работы с AD. Редактируем конфигурационный файл /etc/squid3/squid.conf

sudo nano /etc/squid/squid.conf

У меня вот такой получился итоговый вариант конфигурации Squid. Конфиг с комментариями , поэтому разобраться что там за что отвечает не должно составить труда.

##################################
# Настройка авторизации Kerberos #
##################################
# Параметры авторизации Squid в AD
auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -s HTTP/srv-squid.testzone.local
auth_param negotiate children 50
auth_param negotiate keep_alive on
# Здесь задаются какие группы в AD будет использоваться при доступе в интернет для пользователей
external_acl_type S_SQUID_ADMINS_IP ttl=5 negative_ttl=5 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g S_SQUID_ADMINS_IP -D TESTZONE.LOCAL
external_acl_type S_SQUID_BLOCK_INET ttl=5 negative_ttl=5 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g S_SQUID_BLOCK_INET -D TESTZONE.LOCAL
external_acl_type S_SQUID_BLOCK_INET_WHITE ttl=5 negative_ttl=5 %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g S_SQUID_BLOCK_INET_WHITE -D TESTZONE.LOCAL
######################################
# Обслуживаемые прокси-сервером сети #
######################################
# Правило указывающее доступ в интернет только через авторизацию Kerberos
acl auth proxy_auth REQUIRED
#################################################
# Правила какие порты разрешены прокси-сервером #
#################################################
# Порт SSL для подключений по HTTPS-протоколу
acl SSL_ports port 443
# Список портов, к которым разрешен доступ через прокси-сервер по протоколу HTTP
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
################################################################
# Пути к файлам запрещающих, разрешающих определенные действия #
################################################################
# Группа в AD на которую не распространяются запреты
acl S_SQUID_ADMINS_IP external S_SQUID_ADMINS_IP
# Группа в AD в которой запрещен интернет
acl S_SQUID_BLOCK_INET external S_SQUID_BLOCK_INET
# Группа в AD в которой запрещен интернет кроме Белого списка
acl S_SQUID_BLOCK_INET_WHITE external S_SQUID_BLOCK_INET_WHITE
# Путь к белому списку сайтов
acl WhiteList dstdomain "/etc/squid/WhiteList.txt"
# Путь к черному списку сайтов
acl BlackList dstdomain "/etc/squid/BlackList.txt"
#########################
# Параметры DNS записей #
#########################
# Список DNS серверов(IP адреса), которые будут использоваться вместо тех, что определены в /etc/resolv.conf файле
dns_nameservers 192.168.1.2
#########################################
# Правила ограничений доступа клиентов #
#########################################
# Запретить доступ к портам, отсутствующим в списке выше
http_access deny !Safe_ports
# Запретить метод CONNECT не на SSL-порт
http_access deny CONNECT !SSL_ports
# Разрешить только локальное управление кэшем
http_access allow localhost manager
http_access deny manager
# Не ограничивать локальный доступ с сервера
http_access allow localhost
# Доступ в интернет без ограничения доступа
http_access allow S_SQUID_ADMINS_IP
# Блокировать интернет всем кто в указанной ниже группе AD, кроме белого списка адресов
http_access deny S_SQUID_BLOCK_INET_WHITE !WhiteList
# Блокировать интернет всем кто в указанной ниже группе AD
http_access deny S_SQUID_BLOCK_INET
# Блокировать запрещенные сайты
http_access deny BlackList
# Правила разрешающего доступ в интернет только авторизованным пользователям AD
http_access allow auth
# Блокирует все, что не было разрешено выше
http_access deny all
################################################
# Правила подключений клиентов к прокси-серверу#
################################################
# Подключения через прозрачный порт
http_port 192.168.1.5:3128 intercept options=NO_SSLv3:NO_SSLv2
# Подключение через указания прокси-сервера на строне клиента
http_port 192.168.1.5:3130 options=NO_SSLv3:NO_SSLv2
# Подключение по HTTPS через прозрачный порт с параметрами подставки сертификата
https_port 192.168.1.5:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidca.pem
# Принимаем сертификаты, даже если они не прошли проверку.
always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
# Укажем список блокируемых ресурсов (в файле домены вида .domain.com) и правила блокировки их
acl blocked ssl::server_name "/etc/squid/BlackList.txt"
# Устанавливаем защищенное соединение и считываем заголовок HTTP
acl step1 at_step SslBump1
ssl_bump peek step1
# Закрываем соединение, если клиент заходит на ресурс указанные в blocked
ssl_bump terminate blocked
ssl_bump splice all
sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB
#########################################
# Дополнительные параметры конфигурации #
#########################################
# Путь для дискового кеширования
cache_dir aufs /var/spool/squid 20000 49 256
# Путь сохранения дампов аварийного завершения
coredump_dir /var/spool/squid
# Время жизни объектов для протоколов FTP и GOPHER
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
maximum_object_size 61440 KB
minimum_object_size 3 KB
cache_swap_low 90
cache_swap_high 95
# Максимальный размер объекта, сохраняемого в оперативной памяти
maximum_object_size_in_memory 512 KB
memory_replacement_policy lru
logfile_rotate 4

Сохраняем Ctrl+O и закрываем Ctrl+X файл. Перезапускаем службу Squid, чтобы применилась конфигурация.

sudo service squid restart

На этом настройка полностью завершена. На пользовательских ПК в Свойствах обозревателя — Подключения — Настройка сети в поле Адрес указываем FQDN имя системы где у нас стоит Squid, в моем случае это srv-squid.testzone.local

squid-ad-4

Проверяем работу. Если на ПК вы авторизованны под доменной учетной записью, то интернет будет работать нормально. А если же вы на ПК не под доменной учетной записью, то при открытии любых страниц вам будет предложено ввести данные для доступа к сети интернет. К сожалению если попытаться ввести учетные данные доменного пользователя, то все равно доступа не будет к интернету… победить данный случай мне пока что не удалось.

Осталось только создать группы в AD которые мы указали в конфиге squid:

S_SQUID_ADMINS_IP - Доступ без ограничений
S_SQUID_BLOCK_INET - Запрет доступа в интернет
S_SQUID_BLOCK_INET_WHITE - Запрет доступа в интернет, кроме белого списка адресов

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

Так же проверить видит ли Squid пользователя в какой то определенной группе, можно выполнив команду

sudo /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -d -i -g S_SQUID_ADMINS_IP -D TESTZONE.LOCAL

и ввести имя пользователя AD. Если пользователь находится в данной группе то увидим в конце запроса ОК, если пользователя нет, то ERR

squid-ad-5

Убедились что все отрабатывает успешно. Система Squid с авторизацией AD работает успешно, можно пользоваться.

 

При работе в прозрачном (transparent) режиме, аутентификация пользователей невозможна! Подробнее: http://wiki.squid-cache.org/Features/Authentication#Authentication_in_interception_and_transparent_modes

 

Понравилась или оказалась полезной статья, поблагодари автора

 

БесполезноСлабоватоПриемлемоОтличноПревосходно (2 голос(ов), в среднем: 4,50 из 5)
Загрузка...

Всего комментариев: 20 Комментировать

  1. daniyar /

    Добрый день!
    Может подскажете, снес все и настроил все по мануалу билетик получает по команде проверки и группу проверяет показывает пользователя «ОК», но уже под доменной учеткой открываю страничку в бразере выходит окошко аутентификации, хотя у пользователя есть доступ. Как и у Вас ручной ввод ничего не дает, не принимает. целый день сижу уже два раза ставил на чистую систему. у меня squid 3.5.12 ubuntu последняя 16.04

    1. Жаконда / Автор записи

      Добрый день !
      Если билетик Squid получает и при проверки нахождения пользователя в группе AD вы получаете правильный ответ, то у вас все правильно настроено и Squid и модуль negotiate_kerberos_auth отрабатывает правильно ! Вероятней всего проблема в самом домен контроллере, проверками прогоните службы на ошибки.

      У меня была ситуация точно такая же как и у вас. Только у меня все работало прекрасно, но в один момент появились все аналогичные симптомы. Все так же проверки авторизации Squid были успешны, билет получался, пользователей видел в группе. Пробовал создать нового пользователя в AD и сделать по него новый keytab, не помогало. Решение оказалось простым, выяснилось что синхронизация между домен контроллерами была нарушена и не проходила. Исправили данную проблему и все заработало в нормальном режиме.

      Так что мой совет сейчас проверить свой домен контроллер, т.к. повторюсь у вас все настроено правильно если все проверки Squid успешны.

      P.S. мануал полностью рабочий и порядка 5 раз разворачивался и все работает. Так же может играть роль версий как самого Squid так и системы на которую он ставится.
      P.S.2 попробуйте пройти полностью по шагам как написано в статье, устанавливая версию Squid 3.5.19 на Ubuntu server 14.04, т.к. статья описывает использование именно этих версий.

  2. макс /

    Все настроил все работает кроме аутентификации пологину и паролю… В чем может быть причина?? Неохота все заново переделывать новый мануал искать…

    1. Жаконда / Автор записи

      Добрый день ! По логину и паролю и не будет работать в данном способе через Kerberos авторизацию. Для того чтобы работало по логину и паролю нужно делать все по этой инструкции

  3. Андрей /

    Здравствуйте! Вы пишете: «В оснастке DNS, в Forward Lookup Zones добавьте A-запись для нашей системы где у нас стоит Squid» а где эту оснастку найти стоит Server 2008 r2

  4. Андрей /

    Нашел, только не пойму откуда у вас взялся айпи 192.168.1.20

    1. Жаконда / Автор записи

      Это мой локальный IP адрес

  5. Андрей /

    Ничего не работает билетик не получает!

  6. Андрей /

    Может подскажите что не так делаю?

  7. Xxx /

    В dns вместо srv-squid ошибочно указан srv-squid-s.

  8. Александр /

    Спасибо за статью!
    Проверку при помощи /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -d -i -g S_SQUID_ADMINS_IP -D TESTZONE.LOCAL проходит. НО! при попытки авторизоваться в браузере, не принимает логин пароль, в лог высыпается
    ERROR: Negotiate Authentication validating user. Result: {result=BH, notes={message: received type 1 NTLM token; }}

    1. Жаконда / Автор записи

      Пожалуйста !
      И не примет, т.к. для того чтобы авторизация в браузере заработала, нужно использовать метод NCSA-авторизация

  9. Александр /

    А есть какой то другой метод связи с вами ? Делал все по этой статье и у меня браузер запрашивает логин\пароль

  10. Александр /

    Все мои коменты можно удалить. Всем советую ВНИМАТЕЛЬНО читать статью) И еще раз спасибо.

    1. Жаконда / Автор записи

      Рад что у вас в итоге все получилось 🙂

  11. DmitryDom /

    прописывать адрес прокси каждому ПК обязательно??? Вроде конфиг сделан с прозрачным прокси?

    1. Жаконда / Автор записи

      Да, обязательно ! В прозрачном режиме, аутентификация в AD Не будет проходить.

  12. Дима /

    Добрый день
    negotiate_kerberos_auth_test выдает ошибку spnego cannot find mechanisms to negotiate все остальные проверки ОК
    Что можно поправить?

  13. Игорь /

    Работать будет или нет?
    sudo iptables -t nat -A PREROUTING -s 10.5.5.0/24 -p tcp -m multiport —dports 80,8080 -j REDIRECT —to-ports 3130
    sudo iptables -t nat -A PREROUTING -s 10.5.5.0/24 -p tcp -m multiport —dports 443 -j REDIRECT —to-ports 3129

    1. Жаконда / Автор записи

      Ну если вы пытаетесь реализовать прозрачную аутентификацию с Kerberos-аутентификацией, то у вас ничего не получится.

Оставить ответ

18 + шестнадцать =