Squid notes

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Squid intégré à un domaine Windows (NTLM/Kerberos via Samba/AD)
Prérequis Winbind, Samba, ntlm_auth
Voir aussi Squid · Squid authentification · SquidGuard

Notes pratiques de déploiement autour de Squid, complémentaires à la référence des schémas d'authentification disponible sur Squid authentification : types d'ACL courants, puis un déploiement concret NTLM et Kerberos face à un Active Directory.

Rappel : durcir la configuration de base

Squid gère nativement HTTP, HTTPS, FTP et Gopher :

apt-get install squid

Principes de base pour une configuration en production :

  • n'ouvrir que les protocoles réellement nécessaires ;
  • restreindre l'accès aux seuls utilisateurs/domaines authentifiés attendus ;
  • limiter la taille des requêtes acceptées pour réduire la surface d'attaque de type déni de
 service ;
  • bloquer le tunneling non-HTTP via CONNECT (empêche notamment de faire passer un
 VPN par le proxy en dehors des ports SSL_ports autorisés).

Types d'ACL disponibles

Squid peut construire une ACL sur de nombreux critères, à combiner selon le besoin :

  • adresse IP source / destination
  • domaine source / destination
  • expression régulière sur un domaine
  • mot contenu dans une URL
  • mots contenus dans un domaine
  • date / jour courant, plage horaire
  • port de destination
  • protocole (FTP, HTTP, SSL)
  • méthode HTTP (GET, POST, CONNECT…)
  • type de navigateur (User-Agent)
  • nom d'utilisateur (protocole Ident)
  • numéro d'AS (Autonomous System)
  • identifiants login/mot de passe (proxy_auth)
  • requête SNMP

Syntaxe générale :

acl nom type ("chaîne"|"fichier") [chaîne2] [chaîne3] ["fichier2"]

Authentification NTLM via Samba/Winbind

Prérequis : Winbind (récupère utilisateurs et groupes du domaine), Samba (jonction au domaine) et l'outil ntlm_auth (négociation avec l'AD).

Configuration Samba

[global]
security = domain
winbind separator = /
encrypt passwords = yes
winbind cache time = 15
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
idmap uid = 10000-20000
idmap gid = 10000-20000

Jonction au domaine puis validation :

net join -U administrateur_domaine

wbinfo -g   # liste les groupes du domaine
wbinfo -u   # liste les utilisateurs du domaine
wbinfo -t   # teste le canal sécurisé vers le contrôleur de domaine

Configuration Squid

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 5
auth_param basic realm Squid AD
auth_param basic credentialsttl 2 hours

acl ntlm proxy_auth REQUIRED
http_access allow ntlm
append_domain .exemple.local

Détail des paramètres auth_param : voir Squid authentification.

Authentification Kerberos (Negotiate) via Active Directory

Prérequis : un contrôleur de domaine (DC), un DNS et un DHCP fonctionnels. Le nom DNS/PTR de la machine Squid doit être correctement enregistré côté DNS avant toute tentative de jonction Kerberos — une résolution inverse incohérente est la cause la plus fréquente d'échec.

Génération du keytab

Depuis un poste Windows disposant des « Support Tools » (utilitaire Ktpass.exe) :

Ktpass -princ HTTP/proxy.exemple.local@EXEMPLE.LOCAL -mapuser svc_proxy -pass "mot_de_passe_a_definir" -ptype KRB5-NT_PRINCIPAL -crypto rc4-hmac-nt -out c:\squid.keytab.svc_proxy

Vérification côté AD :

setspn -L svc_proxy

Configuration Squid

auth_param negotiate program /usr/lib/squid/squid_kerb_auth -d -s HTTP/proxy.exemple.local
auth_param negotiate children 10
auth_param negotiate keep_alive on
acl Authenticated proxy_auth REQUIRED
http_access allow Authenticated
http_access deny all

-d active le mode debug du helper, -s précise le principal de service attendu.

Configuration côté client Kerberos (sur la machine Squid)

apt-get install krb5-config krb5-pkinit krb5-user

Copier le keytab généré côté AD sur le serveur, puis /etc/krb5.conf :

[libdefaults]
default_realm = EXEMPLE.LOCAL

[realms]
EXEMPLE.LOCAL = {
        kdc = srv-dc.exemple.local
}

Variables d'environnement utilisées par les outils Kerberos :

export KRB5_CONFIG="/etc/krb5.conf"
export KRB5_KTNAME="/etc/squid/squid.keytab.svc_proxy"

Test du principal :

kinit -k -t /etc/squid/squid.keytab.svc_proxy HTTP/proxy.exemple.local
klist -e

Pour diagnostiquer un échec de négociation, capturer le trafic Kerberos côté client et côté proxy :

# côté client
tcpdump -XX -s0 -i eth0 src net IP_DU_CLIENT

# côté proxy
tcpdump -XX -s0 -i eth0 src net IP_DU_PROXY

Anonymisation côté cache

Quelques options pour limiter ce que Squid révèle de lui-même et des clients :

client_netmask 255.255.255.0
anonymize_headers deny Referer Server From User-Agent
fake_user_agent Nutscrape/1.0 (CP/M; 8-bit)

(corrigé) la directive citée dans les notes d'origine (anomyze_headers) est une faute de frappe — la directive Squid réelle est anonymize_headers.

Voir aussi