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