CentOS

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 || true

2. Установка пакетов

apt update
apt install squid krb5-user samba-common-bin ldap-utils
squid -v
klist

3. 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
klist

4. Создание 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 klist

5. 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 parse

6. Базовая конфигурация 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 3128

7. Проверка аутентификации

На доменном 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.log

8. Ограничение по доменам

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 | tail

10. Диагностика 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 3128

11. 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 отображается доменный пользователь, а недоменные или неавторизованные запросы получают отказ.

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

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