+7 (812) 325 84 00

+7 (499) 322 07 96

Веб прокси Squid на CentOS 8 в окружении Active Directory 2019

Squid вполне может служить бесплатной альтернативой коммерческим прокси-серверам в небольших сетях. В Интернете есть достаточное количество руководств по интеграции Squid с Active Directory, настройке контроля доступа и другим вопросам. Опыт показывает, что зачастую руководства эти содержат неточности, даже ошибки, иногда прямо противоречат друг другу - отчасти потому, что операционная система и Squid имеют огромное количество настроечных параметров, и одни и те же задачи можно решать несколькими способами.

Статья описывает минимальную рабочую конфигурацию прокси Squid на CentOS Stream 8 в связке с Windows Server 2019 Active Directory, с авторизацией Kerberos, NTLM и, опционально, LDAP.

1.    Описание среды

·         Домен Active Directory - papa.local (NetBIOS имя PAPA), ОС контроллеров домена - Windows Server 2019 Datacenter Edition, функциональные уровни домена и леса – Windows Server 2016;

·         Подсеть - 192.168.44.0/24, шлюз по умолчанию - 192.168.44.2;

·         Контроллеры домена - cntr-dc2.papa.local (IP-адрес 192.168.44.12) и cntr-dc4.papa.local (IP-адрес 192.168.44.28); мастер всех операций - cntr-dc4.papa.local;

·         Службы DNS и WINS (для совместимости) размещены на контроллерах домена;

·         Сервер Squid с одним сетевым интерфейсом, ОС - CentOS Stream 8, имя хоста - cntr-gate4.papa.local, IP-адрес - 192.168.44.35;

·         В домене AD для авторизации Squid создан специальный пользователь PAPA\squid (UPN squid@papa.local) с достаточно стойким паролем без ограничения срока действия, учетная запись размещена в OU Papa.local/Special;

·         Вся инфраструктура – виртуальная Hyper-V (в принципе, это неважно).

2.    Установка CentOS

Установка со стандартного дистрибутива CentOS Stream 8, вариант установки – Minimal Install, задаем пароль для root:


Задаем IP-адрес, шлюз по умолчанию и серверы DNS - контроллеры домена, имя хоста cntr-gate4.papa.local и суффикс поиска DNS papa.local :

Задаем NTP-серверы - используем службу NTP контроллеров домена, временная зона Europe/Moscow:




После установки системы следует перезагрузка.

3.    Предварительная конфигурация и установка Squid

Обновляем систему:

dnf update

Устанавливаем ntpstat и проверяем синхронизацию времени:

dnf install ntpstat

ntpstat

chronyc sources -v

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


Добавляем разрешение порта 3128/tcp для прокси Squid:

firewall-cmd --permanent --add-port=3128/tcp

firewall-cmd --reload

Устанавливаем Squid (для нашей конфигурации достаточно готового пакета из репозитария):

dnf install squid

Объявляем в /etc/squid/squid.conf нашу сеть как локальную:

acl localnet src 192.168.44.0/24

Включаем службу Squid для автоматического запуска:

systemctl enable squid --now

4.    Настройка Kerberos

Сначала мы должны подготовить файл ключей (keytab) для Kerberos. Для этого запускаем на контроллере домена следующую команду:

ktpass /princ HTTP/cntr-gate4.papa.local@PAPA.LOCAL /mapuser squid@PAPA.LOCAL /crypto ALL /ptype KRB5_NT_PRINCIPAL /pass "password" /out proxy.keytab

Регистр символов важен! Пароль указывается в двойных кавычках, значение “password“ взято для примера. Результирующий файл proxy.keytab необходимо скопировать в каталог /etc/squid на системе CentOS (cntr-gate4.papa.local).

Учетная запись PAPA\squid в AD выглядит так:


Все остальное делается на системе CentOS. Устанавливаем необходимые пакеты для поддержки Kerberos:

dnf install cyrus-sasl-gssapi krb5-workstation krb5-devel

Теперь редактируем файл конфигурации Kerberos /etc/krb5.conf. У меня файл получился такой:

# To opt out of the system crypto-policies configuration of krb5, remove the

# symlink at /etc/krb5.conf.d/crypto-policies which will not be recreated.

includedir /etc/krb5.conf.d/

[logging]

   default = FILE:/var/log/krb5libs.log

   kdc = FILE:/var/log/krb5kdc.log

   admin_server = FILE:/var/log/kadmind.log

[libdefaults]

   dns_lookup_realm = false

   ticket_lifetime = 24h

   renew_lifetime = 7d

   forwardable = true

   rdns = false

   pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt

   spake_preauth_groups = edwards25519

   default_realm = PAPA.LOCAL

   default_ccache_name = KEYRING:persistent:%{uid}

[realms]

PAPA.LOCAL = {

   kdc = cntr-dc2.papa.local

   kdc = cntr-dc4.papa.local

   admin_server = cntr-dc2.papa.local

   admin_server = cntr-dc4.papa.local

}

[domain_realm]

   .papa.local = PAPA.LOCAL

   papa.local = PAPA.LOCAL

После правки файла /etc/krb5.conf перегружаем систему командой reboot.

Теперь нужно проверить корректность работы Kerberos. Для этого, получаем билеты от KDC и проверяем результат (я для примера сначала использую встроенную учетную запись администратора домена AD, но это не обязательно):

kinit Administrator

klist

kinit -V -k -t /etc/squid/proxy.keytab HTTP/cntr-gate4.papa.local@PAPA.LOCAL

klist

Если мы все сделали правильно, то должны увидеть что-то, похожее на это:

Файл ключей proxy.keytab критичен с точки зрения безопасности системы. Поскольку он предназначен специально для сервиса Squid, ограничиваем доступ к нему только для учетной записи службы:

chown squid:squid /etc/squid/proxy.keytab

chmod 400 /etc/squid/proxy.keytab

Теперь можно править файл конфигурации Squid. Модифицируем /etc/squid/squid.conf, для поддержки обязательной аутентификации Kerberos добавляем в него следующие строки:

auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/proxy.keytab -s HTTP/cntr-gate4.papa.local@PAPA.LOCAL

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

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

Перезапускаем Squid, чтобы конфигурация вступила в силу:

service squid restart

Настройка авторизации Kerberos на этом закончена.

5.    Настройка NTLM

Так или иначе, обычно этот старый протокол в доменной среде до сих пор используется, несмотря на его очевидные недостатки. Поэтому, здесь описывается рабочая конфигурация для NTLM тоже. Для поддержки NTLM, мы используем связку Samba/Winbind.

Устанавливаем необходимые пакеты для поддержки Samba и Winbind:

dnf install samba samba-client samba-winbind samba-winbind-clients krb5-workstation

Включаем необходимые службы:

systemctl enable smb

systemctl enable nmb

systemctl start smb

systemctl start nmb

Теперь редактируем файл конфигурации Samba /etc/samba/smb.conf для членства в домене. У меня файл получился такой:

# See smb.conf.example for a more detailed config file or

# read the smb.conf manpage.

# Run 'testparm' to verify the config is correct after

# you modified it.

[global]

   workgroup = PAPA

   password server = cntr-dc4.papa.local

   realm = PAPA.LOCAL

   security = ads

   idmap uid = 10000-20000

   idmap gid = 10000-20000

   winbind use default domain = no

   winbind request timeout = 300

   wins server = 192.168.44.28

   passdb backend = tdbsam

   printing = cups

   printcap name = cups

   load printers = yes

   cups options = raw

[homes]

   comment = Home Directories

   valid users = %S, %D%w%S

   browseable = No

   read only = No

   inherit acls = Yes

[printers]

   comment = All Printers

   path = /var/tmp

   printable = Yes

   create mask = 0600

   browseable = No

[print$]

   comment = Printer Drivers

   path = /var/lib/samba/drivers

   write list = @printadmin root

   force group = @printadmin

   create mask = 0664

   directory mask = 0775

Включаем систему в домен, используя учетную запись Active Directory с правом добавления компьютеров. У меня это встроенная учетная запись администратора:

net ads join -U Administrator

Вводим пароль и проверяем членство в домене:

net ads testjoin

Если мы все сделали правильно, то должны увидеть “Join is OK”:

при этом, в домене AD (по умолчанию в стандартном контейнере Computers) должен создаться объект компьютера для CNTR-GATE4.

Перестартуем службы Samba и включаем Winbind:

systemctl restart smb

systemctl restart nmb

systemctl enable winbind

systemctl start winbind

Проверяем функциональность Winbind:

wbinfo -g

wbinfo -u

Должны увидеть что-то похожее на это:


(это мои примеры. В любом случае, это должны быть валидные списки групп и пользователей домена).

Теперь можно править файл конфигурации Squid. Модифицируем /etc/squid/squid.conf, для поддержки аутентификации NTLM добавляем в него следующие строки:

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --domain=PAPA

auth_param ntlm children 100 startup=0 idle=10

auth_param ntlm keep_alive off

Перезапускаем Squid, чтобы конфигурация вступила в силу:

service squid restart

Настройка авторизации NTLM закончена.

6.    Настройка LDAP (опционально)

Squid позволяет настроить авторизацию также и по протоколу LDAP. В данном примере, доступ предоставляется для членов группы безопасности AD InternetAccess в домене papa.local с помощью стандартного helper’а ext_ldap_group_acl. Для этого в конфигурацию Squid необходимо добавить следующие строки:

external_acl_type ldap_group %LOGIN /usr/lib64/squid/ext_ldap_group_acl -R -b "dc=papa,dc=local" -D "cn=squid,ou=special,dc=papa,dc=local" -K -W /etc/squid/password.txt -f "(&(objectclass=person) (sAMAccountname=%u)(memberof=cn=%g,cn=users,dc=papa,dc=local))" -h cntr-dc4.papa.local

acl InternetAccess external ldap_group InternetAccess

http_access allow InternetAccess all

Для LDAP-запросов к AD здесь мы используем учетную запись PAPA\squid с паролем (можно использовать и другую - право на чтение LDAP в домене по умолчанию имеет любая запись рядового пользователя в группе Domain Users). В данном примере пароль указан в дополнительном файле /etc/squid/password.txt открытым текстом, без символа перевода строки. Файл можно создать в любом текстовом редакторе (вроде vi /etc/squid/password.txt). Из соображений безопасности, доступ к нему следует ограничить для учетной записи службы:

chown squid:squid /etc/squid/password.txt

chmod 400 /etc/squid/password.txt

Альтернативно, можно указать пароль с ключом -W в хелпере прямо в файле /etc/squid/squid.conf, но это небезопасно – пароль здесь необходимо указывать открытым текстом.

После внесения изменения в конфигурацию, Squid необходимо перезапустить:

service squid restart

Одно замечание – пароль в запросах LDAP для учетной записи PAPA\squid до контроллера домена здесь передается по сети открытым текстом. А это может быть риском.

7.    Настройка доступа для группы Active Directory с авторизацией NTLM и Kerberos

Выше были описаны базовые настройки авторизации по Kerberos и NTLM. Чтобы ограничить доступ в Интернет для членов определенной группы (здесь это PAPA\InternetAccess, как в примере для LDAP), необходимо прописать следующие строки в /etc/squid/squid.conf:

external_acl_type InternetAccess_from_ad_krb ttl=300 negative_ttl=60 %LOGIN /usr/lib64/squid/ext_kerberos_ldap_group_acl -g InternetAccess@PAPA.LOCAL

external_acl_type InternetAccess_from_ad_ntlm %LOGIN /usr/lib64/squid/ext_wbinfo_group_acl -d

acl InternetAccess_acl_krb external InternetAccess_from_ad_krb

acl InternetAccess_acl_ntlm external InternetAccess_from_ad_ntlm InternetAccess

8.    Базовая аутентификация

Squid поддерживает также базовую аутентификацию с передачей пароля открытым текстом. По понятным причинам, этого лучше не делать, и в этой статье данный метод не рассматривается. Рабочий проверенный пример конфигурации для Squid можно взять здесь (применительно к ПО Kaspersky Web Traffic Security): “Приложение 2. Настройка интеграции сервиса Squid с Active Directory\Настройка Basic-аутентификации”, https://support.kaspersky.com/KWTS/6.1/ru-RU/166445.htm.

9.    Файлы конфигурации для примера из статьи

В приложении (config.7z) собраны рабочие примеры файлов конфигурации для тестовой среды, описанной в статье. Можно использовать AS IS и править:

chrony.conf (/etc/chrony.conf) – файл конфигурации NTP;

resolv.conf (/etc/resolv.conf) – файл конфигурации распознавателя DNS;

krb5.conf (/etc/krb5.conf) – файл конфигурации Kerberos;

smb.conf (/etc/samba/smb.conf) – файл конфигурации Samba;

squid.conf (/etc/squid/squid.conf) - файл конфигурации Squid. Этот пример содержит минимальные настройки для работоспособной авторизации Kerberos и NTLM для неограниченного доступа через Squid для группы безопасности AD PAPA\InternetAccess;

squid_ldap.conf (/etc/squid/squid.conf) – вариант аналогичной конфигурации Squid для работоспособной авторизации LDAP;

kt_pass.cmd – пример команды, выполняемой на контроллере домена AD для генерации файла ключей keytab для CentOS прокси.

Ссылка на конфигурацию:

Config.7z

Альтернативная ссылка на конфигурацию: https://disk.yandex.ru/d/70jIXe7V3yprGQ