Squid authentification

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Authentification des clients d'un proxy Squid
Schémas Basic · Digest · NTLM · Negotiate (Kerberos)
Directive squid.conf auth_param
Voir aussi Squid · Squid notes · SquidGuard

Squid sait vérifier l'identité des clients avant de leur donner accès au Web, via plusieurs schémas d'authentification HTTP standard. Cette page recense les paramètres auth_param disponibles pour chacun d'eux. Pour un déploiement concret NTLM ou Kerberos face à un Active Directory (jonction Samba, génération de keytab…), voir Squid notes.

Authentification Basic

L'authentification HTTP Basic transite en clair (encodée en base64, pas chiffrée) dans l'en-tête Authorization — à ne jamais utiliser sans HTTPS entre le client et le proxy si le réseau n'est pas de confiance :

Authorization: Basic dXNlcjpwYXNzd29yZA==

Décodage :

echo 'dXNlcjpwYXNzd29yZA==' | base64 -d

Paramètres communs à tous les backends Basic :

auth_param basic program command       # commande/helper d'authentification à appeler
auth_param basic children number       # nombre de processus helper lancés en parallèle
auth_param basic realm string          # domaine affiché dans la popup d'authentification du navigateur
auth_param basic credentialsttl time   # durée avant re-négociation (ex : 1 hour)

Exemple avec le helper PAM :

auth_param basic program /usr/lib/squid/pam_auth
auth_param basic children 10
auth_param basic realm My Awesome Squid Cache
auth_param basic credentialsttl 1 hour

acl KnownUsers proxy_auth REQUIRED
http_access allow KnownUsers

Backends Basic disponibles

NCSA

Stocke identifiants et mots de passe dans un fichier plat local, au format NCSA (le même que celui utilisé par Apache pour .htaccess) :

auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd

LDAP

S'appuie sur un annuaire (nécessite au minimum un hostname et un DN de base) :

auth_param basic program /usr/lib/squid/squid_ldap_auth -b "ou=people,dc=exemple,dc=com" ldap.exemple.local

MSNT

S'interface avec un ou plusieurs contrôleurs de domaine NT/SMB :

server pdc1_host bdc1_host domaine_nt_1
server pdc2_host bdc2_host domaine_nt_2

SMB multi-domaine (via helper smb_auth)

Reste un schéma Basic côté HTTP, mais le helper s'appuie sur Samba pour dialoguer avec plusieurs contrôleurs de domaine — à ne pas confondre avec le schéma natif NTLM détaillé plus bas :

auth_param basic program /usr/lib/squid/smb_auth -W MONDOMAINE

Plusieurs domaines peuvent être listés en répétant l'option -W.

GETPWAM

Réutilise directement /etc/passwd de la machine Linux hébergeant Squid — un compte système par utilisateur du proxy.

PAM

Authentification système classique (/etc/pam.conf) :

squid auth required pam_unix.so try_first_pass

SASL

Simple Authentication and Security Layer, dans l'esprit de PAM — nécessite la bibliothèque Cyrus SASL.

Windbind

Permet d'authentifier via winbind plutôt que via un helper SMB dédié :

auth_param basic program /usr/lib/squid/wb_basic_auth

YP / NIS

auth_param basic program /usr/lib/squid/yp_auth mondomaine.nis passwd.byname

API des helpers Basic

Le protocole entre Squid et un helper Basic reste volontairement simple : Squid envoie sur l'entrée standard le nom d'utilisateur et le mot de passe séparés par un espace, encodés en URL ; le helper répond OK ou ERR sur la sortie standard, une ligne par requête :

echo "utilisateur motdepasse" | ./mon_helper /etc/squid/passwd

Exemple de squelette de helper personnalisé :

#!/usr/bin/perl -wl
use URI::Escape;
$|=1; # ne pas bufferiser stdout
while (<>) {
    ($u,$p) = split;
    $u = uri_unescape($u);
    $p = uri_unescape($p);
    if (&valid($u,$p)) {
        print "OK";
    } else {
        print "ERR";
    }
}
sub valid {
    my ($user, $pass) = @_;
    # ... vérification ...
}

Authentification Digest

Nativement plus sûre que Basic : le mot de passe n'est jamais transmis en clair, seul un résumé (digest) du challenge est échangé.

auth_param digest program command
auth_param digest children number
auth_param digest realm string
auth_param digest nonce_garbage_interval time    # fréquence de nettoyage des nonces (5 min par défaut)
auth_param digest nonce_max_duration time        # durée de validité d'un nonce
auth_param digest nonce_max_count number         # nombre max de réutilisations d'un nonce
auth_param digest nonce_strictness on|off        # tolérance aux erreurs de séquence

Exemple :

auth_param digest program /usr/lib/squid/digest_pw_auth /etc/squid/digest_passwd
auth_param digest children 8
auth_param digest realm Access to Squid
auth_param digest nonce_garbage_interval 10 minutes
auth_param digest nonce_max_duration 45 minutes
auth_param digest nonce_max_count 100
auth_param digest nonce_strictness on

acl KnownUsers proxy_auth REQUIRED
http_access allow KnownUsers

Le fichier de mots de passe Digest stocke une empreinte MD5 de utilisateur:realm:motdepasse plutôt que le mot de passe lui-même.

Authentification NTLM

Repose sur un mécanisme de three-way handshake (challenge/réponse) propre aux environnements Microsoft :

auth_param ntlm program command
auth_param ntlm children number
auth_param ntlm max_challenge_reuses number      # nombre de réutilisations autorisées du token (0 = illimité par défaut)
auth_param ntlm max_challenge_lifetime time      # durée de validité du token

auth_param ntlm program /usr/lib/squid/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 12
auth_param ntlm max_challenge_reuses 5
auth_param ntlm max_challenge_lifetime 2 minutes

acl KnownUsers proxy_auth REQUIRED
http_access allow KnownUsers

(corrigé) les descriptions historiquement associées à ces deux derniers paramètres étaient dupliquées mot pour mot dans le document source (les deux décrivaient max_challenge_reuses) ; la définition ci-dessus rétablit la distinction entre nombre de réutilisations et durée de vie du token.

Déclinaisons

  • SMB (identique au schéma Basic + smb_auth ci-dessus, mais ici en schéma NTLM natif) : auth_param ntlm program /usr/lib/squid/ntlm_auth domaine\contrôleur [domaine\contrôleur ...]
  • Winbind : auth_param basic program /usr/lib/squid/wb_ntlm_auth

Échange protocolaire (pour référence)

  • YR : Squid demande un nouveau token à son helper (soumis à max_challenge_lifetime)
  • TT : le helper renvoie le challenge à transmettre au client, en réponse au YR
  • KK : Squid transmet au helper les identifiants reçus du client
  • AF username : le helper confirme que l'authentification a réussi
  • NA reason : le helper signale que l'authentification est invalide
  • BH reason : échec de la procédure côté communication (bug/panne du helper)
  • LD username : proche de BH, mais le helper a tout de même pu renvoyer le nom d'utilisateur

Authentification Negotiate (Kerberos)

Squid supporte aussi le schéma Negotiate pour dialoguer avec un KDC Kerberos (typiquement un Active Directory) — voir Squid notes pour le déploiement complet (keytab, jonction DNS, tests kinit/klist).

ACL externes

Au-delà de l'authentification proprement dite, Squid peut déléguer une décision d'ACL à un programme externe — utile pour mapper IP/utilisateur, ou vérifier une appartenance à un groupe LDAP/Unix sans dupliquer cette logique dans squid.conf.

external_acl_type ip_user_helper %SRC %LOGIN /usr/lib/squid/ip_user -f /etc/squid/ip_user.conf
acl AclName external ip_user_helper

%SRC est remplacé par l'IP du client et %LOGIN par l'utilisateur authentifié de chaque requête. Fichier ip_user.conf :

ip_addr[/mask] user|@group|ALL|NONE

127.0.0.1        ALL
192.168.1.0/24   utilisateur1
10.8.1.0/24      @groupe_utilisateurs
172.16.0.0/16    NONE

Groupe LDAP

Nécessite un annuaire LDAP accessible :

external_acl_type ldap_group_helper %LOGIN /usr/lib/squid/squid_ldap_group -b "ou=people,dc=exemple,dc=com" ldap.exemple.local
acl AclName external ldap_group_helper GroupRDN

Groupe Unix

external_acl_type unix_group_helper %LOGIN /usr/lib/squid/check_group -g groupe1 -g groupe2
acl AclName external unix_group_helper

Voir aussi

  • Squid — configuration générale du proxy
  • Squid notes — déploiement pratique NTLM (Samba/Winbind) et Kerberos (keytab, AD)
  • SquidGuard — combiner filtrage par catégorie et authentification par utilisateur