Squid с Active Directory: Kerberos-аутентификация и ACL
Практический пример Squid на Debian/Ubuntu с Kerberos-аутентификацией в Active Directory. Пример домена: CRAZYLORD.LAN, контроллер домена: dc01.crazylord.lan, прокси: proxy.crazylord.lan.
1. Проверка DNS и времени
hostname -f
getent hosts dc01.crazylord.lan
dig +short _kerberos._tcp.crazylord.lan SRV
timedatectl
chronyc tracking 2>/dev/null || true2. Установка пакетов
apt update
apt install squid krb5-user samba-common-bin ldap-utils
squid -v
klist3. Kerberos-конфигурация
cp /etc/krb5.conf /etc/krb5.conf.backup
cat > /etc/krb5.conf <<'EOF'
[libdefaults]
default_realm = CRAZYLORD.LAN
dns_lookup_realm = false
dns_lookup_kdc = true
rdns = false
ticket_lifetime = 24h
forwardable = true
[realms]
CRAZYLORD.LAN = {
kdc = dc01.crazylord.lan
admin_server = dc01.crazylord.lan
}
EOF
kinit administrator@CRAZYLORD.LAN
klist4. Создание SPN и keytab
На контроллере домена создайте сервисную учётную запись svc_squid, затем выполните в PowerShell:
setspn -S HTTP/proxy.crazylord.lan CRAZYLORD\svc_squid
setspn -L CRAZYLORD\svc_squid
ktpass /princ HTTP/proxy.crazylord.lan@CRAZYLORD.LAN /mapuser CRAZYLORD\svc_squid /crypto AES256-SHA1 /ptype KRB5_NT_PRINCIPAL /pass * /out C:\Temp\squid.keytabПередайте keytab на proxy-сервер защищённым способом:
install -o proxy -g proxy -m 600 squid.keytab /etc/squid/squid.keytab
klist -kte /etc/squid/squid.keytab
sudo -u proxy kinit -k -t /etc/squid/squid.keytab HTTP/proxy.crazylord.lan@CRAZYLORD.LAN
sudo -u proxy klist5. Backup Squid
mkdir -p /root/squid-backup
cp -a /etc/squid/squid.conf /root/squid-backup/
cp -a /etc/squid/squid.keytab /root/squid-backup/
squid -k parse6. Базовая конфигурация Squid
cat > /etc/squid/squid.conf <<'EOF'
http_port 3128
auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -k /etc/squid/squid.keytab -s HTTP/proxy.crazylord.lan@CRAZYLORD.LAN
auth_param negotiate children 20 startup=5 idle=5
auth_param negotiate keep_alive on
acl authenticated proxy_auth REQUIRED
acl localnet src 192.168.0.0/16
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet authenticated
http_access deny all
access_log stdio:/var/log/squid/access.log
cache_log /var/log/squid/cache.log
visible_hostname proxy.crazylord.lan
EOF
squid -k parse
systemctl restart squid
systemctl status squid --no-pager
ss -lntp | grep 31287. Проверка аутентификации
На доменном Windows-клиенте укажите proxy proxy.crazylord.lan:3128. Имя должно совпадать со SPN, иначе Kerberos обычно откатится или завершится ошибкой.
curl -v --proxy-negotiate -u : -x http://proxy.crazylord.lan:3128 http://example.com/
tail -f /var/log/squid/access.log8. Ограничение по доменам
cat > /etc/squid/allowed-domains.txt <<'EOF'
.example.com
.microsoft.com
EOF
cat >> /etc/squid/squid.conf <<'EOF'
acl allowed_domains dstdomain "/etc/squid/allowed-domains.txt"
http_access allow localnet authenticated allowed_domains
EOF
squid -k parseПравила Squid читаются сверху вниз. Размещайте разрешающее правило до финального http_access deny all, иначе оно никогда не сработает.
9. Проверка журналов
tail -n 50 /var/log/squid/access.log
tail -n 100 /var/log/squid/cache.log
journalctl -u squid --since '15 min ago' --no-pager
grep -E 'TCP_DENIED|407|NONE_NONE' /var/log/squid/access.log | tail10. Диагностика Kerberos
kvno HTTP/proxy.crazylord.lan
klist
klist -kte /etc/squid/squid.keytab
sudo -u proxy kinit -V -k -t /etc/squid/squid.keytab HTTP/proxy.crazylord.lan@CRAZYLORD.LAN
tcpdump -ni any port 88 or port 312811. Rollback
systemctl stop squid
cp /root/squid-backup/squid.conf /etc/squid/squid.conf
cp /root/squid-backup/squid.keytab /etc/squid/squid.keytab
chown proxy:proxy /etc/squid/squid.keytab
chmod 600 /etc/squid/squid.keytab
squid -k parse
systemctl start squidКритерий успеха: доменный клиент открывает сайт через proxy без ручного ввода пароля, в access.log отображается доменный пользователь, а недоменные или неавторизованные запросы получают отказ.