Cette page d'écrit l'installation d'un proxy filtrant et authentifiant.

Ce Squid n'utilisera pas NTLM, il n'y aura donc pas d'installation de Samba ou de Wins. Ce mécanisme (NTLM), bien que moins consommateur de CPU, peut générer des problèmes de résolution de noms lié à Wins, ainsi que des latences dans les échanges d'authentifications. Le protocole NTLMv1 pose également des problèmes de sécurité et ne doit plus être employé, au profit de NTLMv2 ou Kerberos.

Choix de l'OS :
Le paquet Squid disponible dans les versions de Redhat (y compris Rehat 7) ne contient pas le module “ext_kerberos_ldap_group_acl”, il faudra donc préférer la distribution Debian. Notons toutefois que la seule différence entre “ext_kerberos_ldap_group_acl” et “ext_ldap_group_acl” est l'obligation de disposer d'un utilisateur capable d’interroger le Ldap AD et le login/password de cet utilisateur sera visible en clair dans la configuration du squid.conf. Si ce point n'est pas un problème, vous pouvez choisir n'importe quelle distribution.

Dimensionnement du serveur :
Si Kerberos est plus sécurisé et plus stable que NTLM, il est en revanche plus gourmand en CPU.
Chaque requête HTTP nécessite le contrôle du ticket Kerberos client. Quand un process “negotiate_kerberos_auth” est déjà occupé, le contrôle est effectué par le processus suivant. Le nombre de contrôle “negotiate_kerberos_auth” maximum est défini par le champ “auth_param negotiate children 10” du fichier /etc/squid3/squid.conf.
CPU : Une seule page de plusieurs dizaine d'objets peut consommer jusqu'à la moitié d'un CPU de 3 GHz. En cas de saturation CPU, le chargement de la page sera ralentit. Compter en moyenne 1 CPU pour quatre navigation active d'utilisateur.
Mémoire : compter 8 Mo de ram par processus “negotiate_kerberos_auth” et autant par processus SquidGuard. 400Mo pour Squid.

Pour une utilisation normale d'internet dans un parc de 250 utilisateurs, il faut au minimum 1 CPU 3GHz et 1 Go de RAM. Ces valeurs sont doublé pour plus de confort.

Dans la configuration ci-dessous, le serveur Suid s'apelle "serversquid", le domaine Active Directory "mondomaine.local", les contrôleurs de domaines Active Directory porte également le rôle DNS et ont l'IP 192.168.1.2 et 192.168.1.3


Kerberos
Configurer la résolution DNS : Fichier /etc/resolv.conf

search mondomaine.local
nameserver 192.168.1.2
nameserver 192.168.1.3

Configurer la synchronisation NTP (indispensable pour le fonctionnement de Kerberos) Les serveurs de temps doivent être les contrôleurs de domaine Kerberos.
Configurer la ligne “Server” du fichier /etc/ntp.conf

server mondomaine.local
systemctl restart ntp
systemctl enable ntp
Installation des paquets Kerberos et Squid :
apt-get install krb5-user libkrb53 libsasl2-modules-gssapi-mit libsasl2-modules squid3 msktutil 

Configurer Kerberos (exemple avec le client Bouvard) :

cp /etc/krb5.conf /etc/krb5.conf.default
vim /etc/krb5.conf

Fichier /etc/krb5.conf :

[libdefaults]
default_realm = MONDOMAINE.LOCAL
dns_lookup_kdc = no
dns_lookup_realm = no
ticket_lifetime = 24h
default_keytab_name = /etc/squid3/squid.keytab
; For Windows 2008 (Server) with AES
default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
[realms]
BOUVARD.AD = {
kdc = serveur-ad-1.mondomaine.local
kdc = serveur-ad-2.mondomaine.local
admin_server = server-ad-1.mondomaine.local
default_domain = mondomaine.local
}
;
[domain_realm]
.mondomaine.local = MONDOMAINE.LOCAL
mondomaine.local = MONDOMAINE.LOCAL

Initialiser la connexion avec le contrôleur de domaine en tant qu'administrateur :

kinit administrator
Password for administrator@MONDOMAINE.LOCAL:

Enregistrer la VM dans Active Directory pour obtenir son ticket Kerberos :

msktutil -c -b "CN=COMPUTERS" -s HTTP/serversquid.mondomaine.local -k /etc/squid3/squid.keytab --computer-name SERVERSQUID --upn HTTP/serversquid.mondomaine.local --server server-ad-1.mondomaine.local --verbose --enctypes 28

Ajouter le code suivant dans le fichier /etc/cron.d/kerb5-renew pour renouveler périodiquement le ticket Kerberos du serveur proxy

0 */12 * * * root /usr/sbin/msktutil --auto-update --verbose --computer-name SERVERSQUID -k /etc/squid3/squid.keytab | /usr/bin/logger -t msktutil

Détruiser la connexion Administrateur au domaine Bouvard.ad :

kdestroy

Autoriser Squid a lire le fichier Kerberos :

chgrp proxy /etc/squid3/squid.keytab
chmod g+r /etc/squid3/squid.keytab

Créer le fichier /etc/default/squid3 pour indiquer a Squid ou trouver le fichier Kerberos :

KRB5_KTNAME=/etc/squid3/squid.keytab
export KRB5_KTNAME


Squid

Configuration de Squid

cp /etc/squid3/squid.conf /etc/squid3/squid.conf.default
vim /etc/squid3/squid.conf

Fichier /etc/squid3/squid.conf

visible_hostname serversquid.mondomaine.local
http_port 3128
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid3
cache_mgr informatique@mondomaine.com
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log syslog:local5.debug combined
access_log /var/log/squid3/access.log combined
#redirect_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf
auth_param negotiate program /usr/lib/squid3/negotiate_kerberos_auth -r -s HTTP/serversquid.mondomaine.local@MONDOMAINE.LOCAL
auth_param negotiate children 50
auth_param negotiate keep_alive on
external_acl_type ldap_group_infra %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g GG-User-INFRA-Internet@ -D MONDOMAINE.LOCAL
external_acl_type ldap_group_pcphysique %LOGIN /usr/lib/squid3/ext_kerberos_ldap_group_acl -a -g GG-User-PCPhysique-Internet@ -D MONDOMAINE.LOCAL
#acl manager             proto cache_object
#acl localhost           src 127.0.0.1/32 ::1
#acl to_localhost        dst 127.0.0.0/8 0.0.0.0/32 ::1
acl from_srv_prod       src 192.168.1.0/24
acl from_poste_vdi      src 192.168.2.0/24
acl from_poste_physique src 192.168.3.0/24
acl to_srv_prod         dst 192.168.1.0/24
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 20-21       # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
acl WHITELIST dstdomain "/etc/squid3/whitelist.txt"
acl AUTHENTICATED proxy_auth REQUIRED
acl LDAP_GROUP_CHECK_VDI external ldap_group_infra
#acl LDAP_GROUP_CHECK_PHYS external ldap_group_pcphysique
#acl http proto http
#acl port_80 port 80
#acl port_443 port 443
http_access allow manager localhost
http_access allow to_srv_prod
http_access deny !Safe_ports
# Autorise
#   les users non authentifie
#   from_srv_prod from_poste_vdi from_poste_physique
#   a la WHITELIST site http
http_access allow from_srv_prod WHITELIST
http_access allow from_poste_vdi WHITELIST
http_access allow from_poste_physique WHITELIST
# Autorise
#   les users authentifie
#   from_srv_prod from_poste_vdi from_poste_physique
#   a l'internet sauf blacklist
http_access allow AUTHENTICATED from_srv_prod LDAP_GROUP_CHECK_VDI
http_access allow AUTHENTICATED from_poste_vdi LDAP_GROUP_CHECK_VDI
#http_access allow AUTHENTICATED from_poste_physhigh LDAP_GROUP_CHECK_PHYS
# Refuse tout autre connexion
http_access deny all

Créer le fichier /etc/squid3/whitelist.txt contenant les sites accessibles sans authentification :

.mondomaine.com
.mondomaine.local
.docs.google.com
lh4.googleusercontent.com
.perdu.com

Redémarrer Squid et ajouter le démarrage automatique :
systemctl restart squid3
systemctl enable squid3

Pour effectuer un test en local :

kinit monlogin
/usr/lib/squid3/negotiate_kerberos_auth_test serversquid.mondomaine.local | awk '{sub(/Token:/,"YR"); print $0}END{print "QQ"}' | /usr/lib/squid3/negotiate_kerberos_auth -r -s HTTP/serversquid.mondomaine.local@MONDOMAINE.LOCAL

Si le programme retourne une réponse de la forme suivante :
AF oRQwEqADCgEAoQsGCSqGSIb3EgECAg== olikiang
Alors l'authentification Kerberos dans Squid fonctionne correctement

Attention lors de la configuration des navigateurs sur les clients. Il est impératif d'utiliser le nom du serveur. Ne pas utiliser l'IP. Le protocole Kerberos se base sur le nom du serveur dans le processus de validation Kerberos.