Перейти к содержимому

Какие схемы аутентификации используются в squid

  • автор:

Какие схемы аутентификации используются в squid

Инструкция используется, если программа Kaspersky Web Traffic Security установлена из rpm- или deb-пакета на готовую операционную систему.

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

  1. Проверьте состояние службы avahi-daemon. Для этого выполните команду: systemctl status avahi-daemon
  2. Если служба запущена, остановите ее. Для этого выполните команду: systemctl stop avahi-daemon
  3. Отключите автоматический запуск службы. Для этого выполните команду: systemctl disable avahi-daemon

Чтобы настроить сервис Squid для Kerberos-аутентификации, выполните следующие действия:

  1. Если вы используете операционные системы CentOS версии 8.x или Red Hat Enterprise Linux версии 8.x, настройте политику использования криптографичеких алгоритмов. Для этого выполните команду: update-crypto-policies —set LEGACY
  2. Скопируйте файл squid.keytab в директорию /etc/squid/.
  3. Настройте доступ к keytab-файлу. Для этого выполните следующие команды в зависимости от используемой операционной системы:
    • CentOS, Red Hat Enterprise Linux или SUSE Linux Enterprise Server: chown squid:squid /etc/squid/squid.keytab chmod 400 /etc/squid/squid.keytab
    • Ubuntu, Debian или Альт Сервер: chown proxy:proxy /etc/squid/squid.keytab chmod 400 /etc/squid/squid.keytab

По умолчанию владельцем файла krb5.keytab является суперпользователь.

  • CentOS или Red Hat Enterprise Linux: auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/squid.keytab -s HTTP/@ auth_param negotiate children 100 startup=0 idle=10 auth_param negotiate keep_alive on acl authenticated_user proxy_auth REQUIRED http_access deny !authenticated_user
  • SUSE Linux Enterprise Server: auth_param negotiate program /usr/sbin/negotiate_kerberos_auth -k /etc/squid/squid.keytab -s HTTP/@ auth_param negotiate children 100 startup=0 idle=10 auth_param negotiate keep_alive on acl authenticated_user proxy_auth REQUIRED http_access deny !authenticated_user
  • Ubuntu, Debian или Альт Сервер: auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -k /etc/squid/squid.keytab -s HTTP/@ auth_param negotiate children 100 startup=0 idle=10 auth_param negotiate keep_alive on acl authenticated_user proxy_auth REQUIRED http_access deny !authenticated_user
  • CentOS или Red Hat Enterprise Linux: auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -d -k /etc/squid/squid.keytab -s HTTP/@
  • SUSE Linux Enterprise Server: auth_param negotiate program /usr/sbin/negotiate_kerberos_auth -d -k /etc/squid/squid.keytab -s HTTP/@
  • Ubuntu, Debian или Альт Сервер: auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -d -k /etc/squid/squid.keytab -s HTTP/@

Отладочные события будут записаны в файл /var/log/squid/cache.log.

  • Для CentOS или Red Hat Enterprise Linux добавьте в файл /etc/sysconfig/squid строку: KRB5RCACHETYPE=none
  • Для Ubuntu версии 18.04.х, Debian версии 9.х или Альт Сервер добавьте в файл /etc/default/squid строку: KRB5RCACHETYPE=none
  • Для SUSE Linux Enterprise Server версии 15.х или Debian версии 10.х:
    1. Создайте файл /etc/systemd/system/squid.service.d/override.conf следующего содержания: [Service] Environment=KRB5RCACHETYPE=none
    2. Выполните команду: systemctl daemon-reload

По умолчанию Replay cache включен.

Replay cache обеспечивает более надежную защиту, но может снижать производительность программы.

Кеш, используемый в технологии Kerberos для хранения записей о запросах пользователей на аутентификацию. Этот механизм помогает защитить инфраструктуру от атак повторного воспроизведения. Во время таких атак злоумышленники записывают трафик пользователя, чтобы воспроизвести ранее отправленные им сообщения и успешно пройти аутентификацию на прокси-сервере. При использовании replay cache сервер аутентификации обнаруживает дубликат запроса и отправляет в ответ сообщение об ошибке.

Сервис Squid будет настроен для использования Kerberos-аутентификации.

Схемы авторизации в squid

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

#Autentification
auth_param basic program /usr/squid/libexec/ncsa_auth /usr/squid/etc/passwd
auth_param basic children 15
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

acl user_url dstdomain .domain1.com
acl sec_url dstdomain .domain2.com

acl group_admins proxy_auth user1 user4 REQUIRED
acl group_users proxy_auth user2 REQUIRED
acl group_sec proxy_auth user3 REQUIRED

#HTTP Access
http_access allow manager localhost
http_access deny manager

http_access allow group_admins
http_access allow group_users user_url
http_access allow group_sec sec_url

Имхо тут плохо то, что proxy_auth здесь больше одного раза и squid будет терзать хелпер до появления первого OK — хотелось бы узнать, а вообше можно ли так делать, когда proxy_auth упоминается больше 1-го раза — не повлияет ли это на стабильность и т.д. Еще при использовании такой схемы был замечен глюк в IE7 -при попытке зайти куда либо спрашивает пароль 3 раза, потом пускает, возможно тоже из-за 3 proxy_auth, хотя в FF такого не замечено.
Или же есть еще 1 схема:

acl mydomain_site dstdomain .mydomain.ru
external_acl_type unix_group %LOGIN /usr/squid/libexec/check_group
acl auth proxy_auth REQUIRED
acl inet_full external unix_group inet-full
acl inet external unix_group inet

http_access allow auth mydomain_site
http_access allow inet_full
http_access allow inet user_url

Тут уже proxy_auth один раз, но неудобство в том, что приходись заводить пользователей дважды — в /etc/passwd и в passwd squid’а. И с этой схемой глюков с IE не замечено. В общем, хотелось бы выяснить, какая схема лучше. Сам склоняюсь к первой, т.к. проще пользователей заводить.

Squid, Kerberos и LDAP

Прокси-сервер Squid для предоставления доступа клиентов к ресурсам сети может осуществлять аутентификацию и авторизацию пользователей. Возможно построение взаимодействия с серверами Microsoft Active Directory путем аутентификации клиентов — членов домена, используя протокол Kerberos, и последующей авторизации членов групп домена.

[править] Принцип работы протокола Kerberos (схематически)

Kerberos sch en1.png

  • Client (Пользователь) – пользователь, участник домена, запрашивающий доступ к ресурсам;
  • AS (Authentication Server) — сервер аутентификации (например, Microsoft Active Directory);
  • TGS (Ticket Granting Server) – сервер предоставления билетов (например, Microsoft Active Directory);
  • SS (Service Server) – сервер предоставляющий доступ к ресурсам (например, прокси-сервер Squid);
  • TGT (Ticket Granting Ticket) – билет для получения билета.

Определение протокола Kerberos а также более подробные пояснения его принципов работы можно почерпнуть из следующих источников:

  • http://en.wikipedia.org/wiki/Kerberos_(protocol)
  • http://ru.wikipedia.org/wiki/Kerberos

[править] Конфигурация пользователя для работы с Kerberos

Конфигурации клиентской машины

Пользователь должен быть членом домена и находится в базе данных домен контролера Microsoft Active Directory. Клиентская машина должна находиться в базе домен контроллера.

ОС пользователей: Windows 2000 или новее, Mac OS X и Linux. Поддерживаемые веб-обозреватели (browser): Internet Explorer 7.0 или новее (версия IE < версии 7.0 не работает с Kerberos), Mozilla Firefox версии 3,6 или новее и Safari (тесты проведены с версией 5.0.3).

В настройках прокси веб-обозревателя установить полное доменное имя (FQDN) прокси-сервера (например, proxy_squid@domain.loc) и номер порта (например, 3180).

Конфигурация сервера Microsoft Active Directory

  • Необходимо настроить сервер Active Directory.
  • Настроить DNS сервер. Обязательно внести записи доменного имени прокси-сервера proxy_squid.domain.loc.

Необходимо создать пользователя в домене: proxy_squid. Пароль пользователя должен не иметь срока годности (password never expires). Для оптимального уровня безопасности, пароль должен состоять из восьми символов — это минимум (буквы, цифры, а также специальные символы). Для аутентификации прокси-сервера на контроллере домена и последующей идентификации пользователей прокси-сервером Squid, необходимо создать файл keytab. Keytab – это файл который содержит Kerberos Principal (хост, пользователь и домен) и ключи шифрования (определяются из пароля Kerberos). Это файл применяется для аутентификации в инфраструктуре Kerberos (при этом не нужно вручную вводить логин и пароль). Squid будет использовать keytab для аутентификации пользователей через протокол Kerberos.

После создания, файл keytab необходимо скопировать на прокси-сервер (например, в каталог /etc/).

Создание файла keytab в командной строке домен контролера Microsoft Active Directory:

ktpass -princ HTTP/proxy_squid.domain.loc@DOMAIN.LOC -mapuser nbtname\proxy_squid -pass "password*" -ptype KRB5_NT_SRV_HST -out HTTP7.keytab
  • nbtname — netbios имя домена
  • password – указать пароль.

realm для Kerberos (то, что пишется после @) обязательно писать ЗАГЛАВНЫМИ буквами!

Конфигурация сетевого доступа к прокси-серверу

  • Разрешить доступ прокси-серверов в сеть Интернет и обратно по протоколам: HTTP, HTTPS, SSH, FTP, DNS;
  • Разрешить доступ прокси-серверов в локальную сеть (ЛВС) и обратно используя порты:
    • Kerberos, TCP/UDP: 88, 464, 749, 750; TCP: 4444;
    • Ldap, TCP/UDP: 389;
    • Squid, TCP: 3180;
    • SSH, TCP: 22, 10010, 10011;
    • Msft-gc, TCP: 3268;
    • Klogin, TCP: 543;
    • Kshell, TCP: 544;
    • Tell, TCP: 754;
    • Eklogin, minipay, TCP: 2105;
    • DNS, TCP/UDP: 53;
    • HTTPS, TCP: 443;
    • HTTP, TCP: 80;
    • NTP, UDP: 123;
    • ICMP.

    [править] Конфигурация прокси-сервера Squid на базе ОС Linux

    Пример для ОС CentOS

    Прокси-серверу необходимо присвоить имя (hostname): proxy_squid.domain.loc.

    Необходимо проверить доступность DNS сервера с помощью программ dig и nslookup. Если DNS сервер не настроен, настроить DNS. Имя прокси-сервера, должно быть занесено в базу DNS сервера.

    Необходимо проверить синхронизацию времени на прокси-сервере, домен контролере и клиенте. Для правильной работы протокола Kerberos, разница во времени должна быть не больше 5 минут. Синхронизировать прокси-сервер с NTP сервером можно с помощью ntpdate.

    Установка с FTP репозитория пакетов для Kerberos аутентификации, пакета Squid 3.0 и библиотеки SASL (Simple Authentication and Security Layer):

    yum install cyrus-sasl-gssapi krb5-workstation krb5-devel squid3

    Изменение прав доступа для keytab файла (это файла, который ранее был сформирован на домен контролере с помощью команды ktpass).

    chown squid:squid /etc/HTTP7.keytab chmod u+rwx,g+rx /etc/HTTP7.keytab

    Проверка правильности созданного файла keytab:

    kinit –V –k –t /etc/HTTP7.keytab HTTP/proxy_squid.domain.loc@DOMAIN.LOC

    Если файл создан верно, выполнится аутентификация в домене: Authenticated to Kerberos v5.

    Посмотреть полученный билет Kerberos можно с помощью команды klist.

    Изменение конфигурации аутентификации Kerberos. В файл /etc/krb5.conf необходимо внести следующие изменения:

    [logging] default = FILE:/var/log/kerberos/krb5libs.log kdc = FILE:/var/log/kerberos/krb5kdc.log admin_server = FILE:/var/log/kerberos/kadmind.log [libdefaults] default_realm = DOMAIN.LOC dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h
    forwardable = true proxiable = true default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5 default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5 permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    [realms] DOMAIN.LOC = < #Перечень домен контроллеров kdc = 192.168.1.5 kdc = 192.168.1.6 kdc = 192.168.1.7 admin_server = 192.168.1.5 default_domain = domain.loc >[domain_realm] .domain.loc = DOMAIN.LOC domain.loc = DOMAIN.LOC

    [appdefaults] pam =

    [login] krb4_convert = true krb4_get_tickets = false

    Для автоматической аутентификации через Squid, необходимо внести следующие изменения в исполняемый файл /etc/init.d/squid

    KRB5_KTNAME=/etc/HTTP7.keytab export KRB5_KTNAME

    Если необходимо использовать для работы прокси-сервера Squid не стандартный порт (например, 3180), открыть этот порт в SELinux.

    semanage port -a -t http_cache_port_t -p tcp 3180 service squid start

    [править] Аутентификация пользователей Active Directory

    Настройка аутентификации в конфигурационном файле /etc/squid/squid.conf. Для аутентификации используется встроенная в Squid программа squid_kerb_auth.

    auth_param negotiate program /usr/lib/squid3/squid_kerb_auth -d -s HTTP/proxy_squid.domain.loc@DOMAIN.LOC auth_param negotiate children 20 auth_param negotiate keep_alive on

    [править] Авторизация пользователей Active Directory

    Авторизация пользователей через Kerberos

    external_acl_type (тут задаем произвольное имя для squid) Internet_User ttl=300 negative_ttl=60 %LOGIN /usr/libexec/squid/ext_kerberos_ldap_group_acl -a -g (а тут указываем имя группы из AD) Group_Internet_User -D DOMAIN.LOCAL

    И так для всех необходимых групп. Всё, никаких паролей и страшных строчек LDAP авторизации.

    Авторизация пользователей через LDAP

    Необходимо авторизовать аутентифицированного пользователя с помощью squid_ldap_group.

    Проверка авторизации пользователя в командной строке:

    /usr/lib/squid/squid_ldap_group -R -b "dc=domain,dc=loc" -f "(&(objectclass=user)(sAMAccountName=%v)(memberof=cn=%a,OU=ProxyServer,OU=Services,OU=KYIV,DC=domain,DC=loc))" -D "proxy_squid@domain.loc" -W "/etc/squid/pass*" -K -d 192.168.1.5 192.168.1.6 192.168.1.7

    Опция –W указывает на путь к файлу, который содержит пароль. Пользователем файла должен быть squid. Пароль должен совпадать с паролем в Kerberos keytab файле, сформированном ранее при помощи ktpass.

    Если при вводе данных в формате пользователь группа получаем вывод OK, значит — авторизация работает. Если авторизация не работает, необходимо проверить путь хранения группы на контроллере домена (для этого можно использовать команду ldapsearch).

    Если проверка работает, добавить конфигурацию для squid_ldap_group в /etc/squid/squid.conf:

    Параметр %LOGIN в описании внешней группы указывает на то, перед проверкой на вхождение в эту группу, пользователя необходимо аутентифицировать

    external_acl_type ldap_check ttl=1200 %LOGIN /usr/lib/squid/squid_ldap_group -R -b "dc=domain,dc=loc" -f "(&(objectclass=user)(sAMAccountName=%v)(memberof=cn=%a,OU=ProxyServer,OU=Services,OU=KYIV,DC=domain,DC=loc))" -D "proxy_squid@domain.loc" -W "/etc/squid/pass*" -K -d 192.168.1.5 192.168.1.6 192.168.1.7

    [править] Определение правил доступа для пользователей

    Проверка через Kerberos

    acl Internet_User external Internet_User http_access allow Internet_User

    Проверка через LDAP

    Группе GG-KV-GOUP0 и GG-KV-GROUP1 предоставлен доступ в Интернет через Squid. Группа GG-KV-GROUP0 не получает доступа к файлам в Интернете, тип которых указан в файле /etc/squid/blocked (для определения типов файлов можно использовать регулярные выражения). Группа GG-KV-GROUP0 получает доступ ко всем файлам тип которых не указан в файле /etc/squid/blocked. Группа GG-KV-GROUP1 получает полный доступ ко всем файлам.

    acl inet_access0 external ldap_check GG-KV-GROUP0 acl inet_access1 external ldap_check GG-KV-GROUP1 acl block_this_for_ggkvgroup0 url_regex -i "/etc/squid/blocked" http_access deny inet_access0 block_this_for_ggkvgroup0 http_access allow inet_access0 http_access allow inet_access1 .

    [править] Определение политик QoS (delay pools)

    acl ad128 external ldap_check GG-KV-GROUP0 acl ad256 external ldap_check GG-KV-GROUP1 .

    Объявить delay pools

    delay_pools 3 delay_class 1 1 delay_class 2 1 .

    Определить принадлежность пользователей к delay pools

    delay_access 1 allow ad128 delay_access 1 deny all delay_access 2 allow ad256 delay_access 2 deny all .

    Ограничить пропускную способность

    delay_parameters 1 16000/16000 #128Kb на всех delay_parameters 2 32000/32000 #256Kb на всех

    timp87

    Не так давно появилась задача разграничения доступа пользователей в интернет. Причем, всем в инет можно, кроме небольшой (относительно всей компании) группы людей.
    В конторе у нас в качестве пользовательской ОС используется Windows (7+). Конечно, есть AD (2008+). Есть еще домены филиалов, с которыми установлены доверительные отношения (не помню, вроде только в одну сторону).
    Надо поднимать web proxy. Требования в такой ситуации напрашиваются сами собой: нужно аутентификацию и авторизацию для прокси брать из AD (не путай эти понятия!).
    В качестве инструментов хотелось использовать FreeBSD и squid.
    Пошел я гуглить и искать инфу. В сети огромное количество howto’шек разной степени бестолковости. Кто в лес, кто по дрова, не понимая, нужны ли эти дрова вообще и куда их пихать. По кусочкам кое-что получилось понять, а дальше ваял сам. Тут результат понимания и описание процесса, чтобы сам потом мог легко вспомнить.
    В итоге доступ в инет был организован для пользователей домена, а также, некоторых сетей (устройств), где не нужна аутентификация/авторизация.

    Все по понятиям

    Потенциально аутентификация в моем случае возможна несколькими способами:
    — NTLM
    — LDAP
    — Kerberos
    Первый — этакая попытка Microsoft’а сделать свой Kerberos. Но сейчас его уже закапывает сам Microsoft, отказываясь от него в пользу третьего. Да и сам по себе протокол плохой (да, да, хэш от пароля ходит по сети). Второй неплох, но требует от пользователя ручного ввода пароля при аутентификации, т.е. браузер будет просить ввести логин/пасс выводя окошко. А вот Kerberos — то, что нужно. Он безопасный и все будет выглядеть прозрачно: никаких предложений ввести пароль и т.д. Правда, он чуть сложнее в настройке, чем предыдущие варианты, и старые версии Windows его не умеют.
    Авторизация — через LDAP. Других способов я не знаю. Т,е. в AD есть security группа, в которую добавлены учетные записи (или другие группы, см. ниже) неугодных пользователей.
    Разворачивал все это дело я на FreeBSD 10.0-RELEASE amd64. В качестве прокси — squid. Весь софт ставился из свежих портов. На Linux’е весь смысл тот же, только софт называется немного иначе.
    Все это хозяйство настраивал и проверял по частям, сначала сделал аутентификацию, проверил ее, потом сверху примостил авторизацию, проверил, а потом сделал некоторые корректировки.

    База

    Первым делом я разбирался с тем, как работает Kerberos. Это очень помогло в понимании того, что нужно делать. Как пример http://itband.ru/2010/12/kerberos1/ или http://www.oszone.net/4188/Kerberos. Из описания следует требование: время на серверах и клиентах должно быть синхронизировано. Проверил время, автозапуск ntpd и т.д. Конечно, нужен еще работающий DNS.
    Далее осмыслив работу Kerberos я понял, что сервер, предоставляющий сервис, на котором аутентифицируется доменный клиент тоже должен аутентифицироваться. С пользователем все просто: у него есть учетка в AD, в которой записаны логин и хэш от его пароля. Хэш от пароля и есть закрытый ключ пользователя, которым он шифрует некоторые части пакетов при аутентификации на KDC. Пользователь знает свой пароль и клиентский софт извлекает из него хэш. KDC тоже знает хэш пользователя. И тот и другой может зашифровать и расшифровать пакет этим ключом. Но что с серверами? Сервер же тоже должен иметь какой-то закрытый ключ, который должен знать как KDC, так и сам сервер.

    Создание учетки для прокси в AD

    Вообще, когда виндовые серверы заводятся в домен, у них появляется «учетка» в AD типа computer, для которой, скорей всего (честно, не знаю), формируется на каком-то шаге (может при развертывании какого-либо сервиса/роли) закрытый ключ. Потом этот ключ как-то попадает на этот новый сервер, я предполагаю. В моем случае сервер не виндовый, и мне нужно сделать это вручную.
    В сети можно найти много статей где прокси *nix-сервер добавляют в домен, перед этим долго и мучительно настраивая samba. Это совсем необязательно. Это делается только для того, чтобы получить из AD файл keytab для «учетки» типа computer, от которой будет аутентифицироваться прокси сервер. Keytab, насколько я понял — это что-то вроде контейнера с закрытыми ключами, которыми будет пользоваться демон/сервис (squid) при аутентификации по Kerberos’у.
    Есть 2 пути создания «учетки» в AD для сервера: добавление сервера в домен c помощью samba с самого *nix сервера (так создается «учетка» типа computer), или можно создать обычного пользователя (тип user) в AD любыми средствами, например, оснасткой «AD users and computers». Понятно, что второй способ проще.
    Затем есть 3 способа извлечения файла keytab для созданной «учетки»: с помощью samba на *nix сервере (сервер должен быть в домене), утилитой mskutil на *nix сервере, или утилитой ktpass на контроллере домена. Опять же, последний мне показался проще.
    Я создал пользовательскую учетку с именем «squid», задал ей пароль «passWD». По нашим правилам я создал ее в контейнере «Special accounts», который находится на вершине дерева AD. После чего экспортировал keytab с помощью ktpass так (описание опций читай в хелпе):

    > ktpass -princ HTTP/proxy.example.org@EXAMPLE.ORG -mapuser SAMPLE\squid -pass passWD -crypto all -ptype KRB5_NT_SRV_HST -out squid.keytab

    Предположим, что мой домен назван «example.org», а NetBios-имя моего домена «sample». Контроллеры домена называются dc1.example.org и dc2.example.org. Сам сервер, который я настраивал зовется proxy.example.org.
    На выходе ktpass получился файл squid.keytab. Его нужно скопировать на *nix сервер.

    Настройка Kerberos на FreeBSD

    Во FreeBSD уже есть в базовой системе реализация Kerberos’а, так что ничего дополнительного устанавливать для его работы не надо, только настроить. Вообще в мире opensource *nix реализаций этого протокола 2 штуки: Heimdal и MIT. Первая чаще используется в BSD, вторая в Linux.
    Все настройки Kerberos’а хранятся в файле /etc/krb5.conf (надо создать его). Туда для моего домена нужно записать:

    [libdefaults]
    default_realm = EXAMPLE.ORG
    default_keytab_name = /usr/local/etc/squid/squid.keytab [realms]
    EXAMPLE.ORG = kdc = dc1.example.org
    kdc = dc2.example.org
    admin_server = dc1.example.org
    default_domain = example.org
    >
    [domain_realm]
    .example.org = EXAMPLE.ORG
    example.org = EXAMPLE.ORG

    Тут все более-менее понятно, если что, можно глянуть в ман krb5.conf(5). Строка default_keytab_name указывает на файл keytab, который будет использоваться по-умолчанию всеми службами, которым нужен Kerberos, если ничего другого не указано. Другой способ задания файла keytab — в переменных окружения конкретного демона, например, в скрипте запуска этого демона(как тут http://wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos). Т. е. там можно для каждого демона задать свой keytab. Замечу, что под FreeBSD можно просто добавить строку squid_krb5_ktname=»path/to/keytab» в /etc/rc.conf. У меня прокси не будет выполнять других функций, для которых нужен Kerberos, так что я задал keytab в /etc/krb5.conf.
    Теперь, когда все настроено и на месте можно посмотреть в keytab на предмет поддерживаемого шифрования:

    # ktutil -k /usr/local/etc/squid/squid.keytab list
    /usr/local/etc/squid/squid-v.keytab:
    Vno Type Principal Aliases
    4 des-cbc-crc HTTP/proxy.example.org@EXAMPLE.ORG
    4 des-cbc-md5 HTTP/proxy.example.org@EXAMPLE.ORG
    4 arcfour-hmac-md5 HTTP/proxy.example.org@EXAMPLE.ORG
    4 aes256-cts-hmac-sha1-96 HTTP/proxy.example.org@EXAMPLE.ORG
    4 aes128-cts-hmac-sha1-96 HTTP/proxy.example.org@EXAMPLE.ORG

    А потом проверить возможность аутентификации в AD через Kerberos:

    # kinit -k HTTP/proxy.example.org
    # klist
    Credentials cache: FILE:/tmp/krb5cc_0
    Principal: HTTP/proxy.example.org@EXAMPLE.ORG
    Issued Expires Principal
    Feb 7 14:37:49 2014 Feb 8 00:37:44 2014 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG
    # kdestroy

    Получил тикет, посмотрел на него, удалил.

    Установка squid

    Squid я ставил из портов, конкретно www/squid33. Был он версии 3.3.11. Я уверен, что когда кто-то будет читать эти строки, версия будет новей и порт будет называться www/squid. Тут было несколько нюансов. Сильно забегая вперед:
    изначально, для настройки аутентификации и авторизации я ставил squid, добавив к стандартным только опции AUTH_LDAP и AUTH_KERB (ныне опция называется GSSAPI_* в зависимости от выбираемой реализации). Как оказалось потом, с аутентификацией все было хорошо, но с авторизацией пришлось повозиться. Вышло так, что хелпер ext_ldap_group_acl (опция AUTH_LDAP) не умеет работать с вложенными группами. Т.е. он просто проверяет наличие пользователя в конкретной группе. Если в группе запрета интернета есть вложенная группа, а уже во вложенной наш пользователь, то ext_ldap_group_acl этого не узнает. Не удобно, ведь не хочется добавлять в группу запрета интернета пользователей по одной учетке, хочется же целыми отделами =) или группами из филиальских доменов. Пришлось еще погуглить и нашелся другой хелпер ext_kerberos_ldap_group_acl. (стандартно он называется squid_kerb_ldap), который умеет такую штуку, только наоборот, выполняет рекурсивный поиск нужной группы на основе списка членства в группах (MemberOf) самого пользователя. Только он не был у меня установлен. И как его доустановить штатными средствами я не сразу понял. Нужно было только заглянуть в Makefile порта www/squid33 и все стало понятно. Для установки этого хелпера нужна комбинация опций AUTH_LDAP и AUTH_SASL. После переустановки порта, хелпер появился, но не работал. В логе squid’а были сообщения вроде таких:

    ERROR: ldap_sasl_interactive_bind_s error: Can’t contact LDAP server
    ERROR: Error while binding to ldap server with SASL/GSSAPI: Can’t contact LDAP server

    Тут всплыли еще подробности нужно было установить openldap-client с поддержкой sasl. Для этого вместо net/openldap24-client нужно поставить net/openldap24-sasl-client. Можно еще добавить WANT_OPENLDAP_SASL=yes в /etc/make.conf чтобы потом проблем не было.
    Потом опять ничего не заработало:

    ERROR: ldap_sasl_interactive_bind_s error: Unknown authentication method
    ERROR: Error while binding to ldap server with SASL/GSSAPI: Unknown authentication method

    В /usr/ports/UPDATING нашел, что плагин gssapi был отделен от основного порта cyrus-sasl2. Доустановил плагин security/cyrus-sasl2-gssapi. Наступило счастье =).

    Настройка браузера.

    Тут ест одно важное замечание: в качестве адреса прокси у пользователей в браузере должно быть указано полное dns имя сервера, например, proxy.example.org. Также будет работать если dns запись является CNAME.
    А вот с забитым в браузере IP прокси сервера ничего работать не будет!

    Настройка squid

    Действовал я пошагово, поэтому первым делом настроил и проверил аутентификацию:

    auth_param negotiate program /usr/local/libexec/squid/negotiate_kerberos_auth -s HTTP/proxy.example.org@EXAMPLE.ORG
    auth_param negotiate children 50 startup=10 idle=5
    auth_param negotiate keep_alive on

    Все очевидно. Для справки можно смотреть в доку squid’а или вывод «negotiate_kerberos_auth -h». Скажу лишь, что на этапе отладки лучше всего перед опцией -s добавить -i, так в логе cache.log появится много интересной инфы. Ссылка, где в конце есть схема работы squid с Kerberos http://wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos.
    Есть вариант проверки работоспособности хелпера, который я подсмотрел у Markus Moeller, выводящий огромное количество информации. Нужно в командной строке от рута запустить:

    # kinit username@EXAMPLE.ORG
    # /usr/local/libexec/squid/negotiate_kerberos_auth_test proxy.example.org 1 | awk ‘END’ | /usr/local/libexec/squid/negotiate_kerberos_auth -d

    Надо не забыть потом запустить kdestroy.
    Затем я разобрался с авторизацией. Это конфиг:

    external_acl_type NoInet ttl=3600 negative_ttl=3600 children-max=50 children-startup=10 children-idle=5 grace=15 %LOGIN /usr/local/libexec/squid/ext_kerberos_ldap_group_acl -a -i -g DenyInternet -m 64 -D EXAMPLE.ORG -u squid -p passWD

    Опять же, все есть в хелпе и доке. На время дебага можно еще перед -i добавить -d. Замечу опцию -m, указывает уровень рекурсии при поиске группы, и еще опцию grace, которая хорошо ускоряет авторизацию (читай в доке). DenyInternet — это группа из AD, в которой томятся неугодные юзеры. NoInet — это имя данного внешнего acl.
    Проверить работоспособность этой части можно просто запустив хелпер с нужными опциями, т.е. копируем в командную строку все, что после %LOGIN. Затем вводим имя пользователя и получаем в ответ OK или ERR. Например, из командной строки:

    # /usr/local/libexec/squid/ext_kerberos_ldap_group_acl -a -i -g DenyInternet -m 64 -D EXAMPLE.ORG -u squid -p passWD
    username@EXAMPLE.ORG
    OK

    Пользователь входит в группу, иначе получили бы ERR.
    Остальная часть конфига:

    cache_dir diskd /var/squid/cache 25600 16 256

    acl NoAuthNet src 192.168.8.0/24
    acl NoAuthDevice src 192.168.8.184/32
    acl NoInetAD external NoInet

    http_access allow NoAuthDevice
    http_access allow NoAuthNet
    http_access deny NoInetAD all
    http_access allow all

    http_port 3128
    cache_mgr helpdesk@example.org

    Первая строчка описывает механизм работы squid’а с кэшем. В данном случае используется отдельный демон для дисковых операций с кэшем. Для его корректной работы нужно изменить некоторые sysctl’ки. Тут пример каких, и откуда они взялись https://forums.freebsd.org/viewtopic.php?f=43&t=44638. Однако, есть мнение, что все, кроме ufs «сломано» и нестабильно.
    Затем описание acl’ей. Тут есть девайс и сеть, для которых аутентификация и авторизация не нужны. Потом привязываем внешний acl из настройки авторизации к другому acl NoInetAD.
    Теперь собственно описание доступа (принцип работы как в ipfw). Проверка условий идет по порядку сверху вниз, слева направо, поэтому первым делом выпускаем в интернет сеть NoAuthNet и устройство NoAuthDevice.
    Затем для тех кто не совпал с предыдущими правилами вызываем авторизацию, которая в свою очередь вызовет аутентификацию, т.е. не пускаем неугодных юзеров, которые состоят в группе в AD. Здесь нужно заметить, что не случайно написано слово deny, а не allow. Дело в том, что allow работает только для уже аутентифицированных пользователей и не вызывает повторный запрос на аутентификацию, если она до этого момента не состоялась. Отправку ответа «407 — Proxy authentification required» выполняет только deny. Еще можно заметить, что в конце стоит all. Это не просто так, т.к. если в описании http_access последним стоит acl с авторизацией/аутентификацией, то она будет запрашиваться снова и снова, вместо одного раза. Поэтому, если ее не будет, то неугодным пользователям будет показываться окно авторизации раз 5. Некрасиво. А так они сразу получают Access denied . Все эти особенности были вычитаны тут http://wiki.squid-cache.org/Features/Authentication. Там описано еще несколько полезных трюков по аутентификации.

    И последней строчкой разрешаем выход в инет.
    Вот полезная ссылка про правила работы squid’а с списками доступа http://wiki.squid-cache.org/SquidFaq/SquidAcl

    На всякий случай

    Не относится к всему посту, просто мало ли когда-нибудь пригодится портянка с аутентификацией и авторизацией простым LDAP:

    # Authentification using LDAP
    ##Delete the comments to enable another one auth procedure if previous wasn’t passed.
    ##auth_param basic program /usr/local/libexec/squid/basic_ldap_auth -R -D squid@example.org -W /usr/local/etc/squid/ldap.txt -b «dc=example,dc=org» -f «sAMAccountName=%s» 192.168.1.2
    #
    # Authorization using LDAP
    # -K — remove realm from username
    # -d — turn on the debug
    #external_acl_type InetGroup ttl=600 %LOGIN /usr/local/libexec/squid/ext_ldap_group_acl -R -b «dc=example,dc=org» -f «(&(objectclass=person)(sAMAccountName=%v)(memberOf=cn=%a,ou=Security Groups,dc=example,dc=org))» -D
    squid@example.org -W /usr/local/etc/squid/ldap.txt -K -d 192.168.1.2 192.168.1.3

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *