46. Installation d’un service mandataire (Serveur Proxy SQUID)

Squid est un service serveur proxy-cache sous GNU/Linux. Les objets consultés par les clients sur internet, sont stockés en cache disque par le serveur. À partir du deuxième accès, la lecture se fera en cache, au lieu d’être réalisée sur le serveur d’origine. De ce fait il permet "d’accélérer" les connexions à l’internet en plaçant en cache les documents les plus consultés. On peut aussi utiliser la technique du service serveur mandataire pour effectuer des contrôles d’accès aux sites.

Les services proxy peuvent être organisés de façon hiérarchique.

Ls serveurs peuvent être paramétrés pour les autorisations d’accès et les synchronisations.

Les postes clients sont souvent configurés pour utiliser un serveur proxy. Le client s’adresse au serveur proxy, et c’est ce dernier qui traite la requête sur internet. Un fois la réponse reçue, le serveur met en cache la réponse et la retourne au client interne. Le service proxy est fréquemment configuré sur un routeur qui remplit aussi le service de translation d’adresse ou translation de port, mais toutes ces fonctions sont bien différentes.

Dans certains cas, on peut ne pas souhaiter que la configuration soit réalisée au niveau du client. On souhaite que celle-ci soit faite au niveau du serveur. Cela peut arriver par exemple si l'on a plusieurs centaines de postes à configurer ou bien si l'on ne souhaite pas que les utilisateurs puissent modifier ou avoir accès à cette partie de la configuration. On parlera de "service proxy transparent". Le service serveur proxy peut être sur le routeur d’accès à l’internet ou sur une autre machine.

Exemple de service proxy transparent :

Figure 26. Serveur proxy installé sur le routeur

Figure 27. Serveur proxy non-intégré

Sur le deuxième schéma, les requêtes du client (1), sont redirigées vers le proxy par le routeur (2), qui retourne au client la réponse ou redirige vers le routeur (3) pour un envoi sur l’extérieur.

46.1. Installer Squid

L'installation de Squid s'effectue de manière classique via les dépôts Debian.


vanvincq@CP2L ~/Bureau/CPLL/JournalDeBord $ sudo apt-get install squid
[sudo] password for vanvincq: 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
[...]

Squid comporte de très nombreux paramètres. L’optimisation n’en est pas toujours simple. Nous allons voir uniquement quelques options permettant un fonctionnement du service. Il sera nécessaire, pour un site en production, de se référer à la documentation officielle.

Pour démarrer une configuration simple, il est possible d’utiliser le fichier de configuration /etc/squid.conf, dont chaque paramètre est documenté.

46.2. Configuration de squid

Toute la configuration de Squid se trouve dans le fichier squid.conf. La plupart des options par défaut du fichier ne sont pas à changer. Les principales options sont :

46.3. Initialisation de Squid

Cette commande n'est qu'à réaliser qu'une fois normalement afin de générer le cache :


vanvincq@CP2L ~/Bureau/CPLL/JournalDeBord $ sudo squid -z
2012/04/24 20:33:58| Creating Swap Directories
vanvincq@CP2L ~/Bureau/CPLL/JournalDeBord $ sudo /etc/init.d/squid start
Starting Squid HTTP proxy: squid.

46.4. Les options de démarrage de Squid

On peut démarrer Squid en lui passant des commandes sur la ligne de commande. Différents paramètres peuvent être passés sur la ligne de commande. Les options passées de cette façon remplacent les paramètres du fichier de configuration de Squid squid.conf.


-h : Pour obtenir les options possibles
-a : Pour indiquer un port particulier
-f : pour utiliser un autre fichier de conf au lieu de squid.conf
-u : spécifie un port pour les requêtes ICP. (3110 par défaut)
-v : pour indiquer la version de Squid
-z : Pour initialiser le disque cache.
-k : Pour envoyer des instructions à Squid pendant son fonctionnement.
     Il faut faire suivre -k d’une instruction
     (rotate|reconfigure|shutdown|interrupt|kill|debug|check).
-D : pour démarrer squid lorsque vous n’êtes pas connecté en
     permanence à internet (évite de vérifier si le serveur DNS répond).

46.5. Contrôler les accès

Pour contrôler tout ce qui passe par votre serveur proxy, vous pouvez utiliser ce que l’on appelle les ACL (Access Control List). Les ACL sont des règles que le serveur applique. Cela permet par exemple d’autoriser ou d’interdire certaines transactions.

On peut autoriser ou interdire en fonction du domaine, du protocole, de l’adresse IP, du numéro de port, d’un mot, on peut aussi limiter sur des plages horaires.

La syntaxe d’une ACL est la suivante :

acltype peut prendre comme valeur :


src (pour la source) : indication de l’adresse IP du client sous la
    forme adresse/masque. On peut aussi donner une plage d’adresses
    sous la forme adresse_IP_debut-adresse_IP_fin
dst (pour la destination) : idem que pour src, mais on vise
    l’adresse IP de l’ordinateur cible.
srcdomain : Le domaine du client
dstdomain : Le domaine de destination.
url_regex : Une chaîne contenu dans l’URL
   (on peut utiliser les jokers ou un fichier).
urlpath_regex : Une chaîne comparée avec le chemin de l’URL
   (on peut utiliser les jokers).
proto : Pour le protocole.

Exemple 1 : Interdire l’accès à un domaine : supposons que nous souhaitions interdire l’accès à un domaine (par exemple le domaine pas_beau.fr). On a donc :


acl		veuxpas dstdomain	pas_beau.fr
http_access	deny    veuxpas
http_access	allow   all     # On accepte tout

La dernière ligne ne doit exister qu’une fois dans le fichier squid.conf.

Exemple 2 : interdire l’accès aux pages contenant le mot jeu.


acl		jeu	url_regex	jeu
http_access	deny	jeu
http_access	allow	all

Attention url_regex est sensible aux majuscules/minuscules. Pour interdire JEU, il faut aussi ajouter JEU dans votre ACL. Il n’est pas besoin de réécrire toute l’ACL. On peut ajouter JEU derrière jeu en laissant un blanc comme séparation (cela correspond à l’opérateur logique OU).

On peut placer un nom de fichier à la place d’une série de mots ou d’adresses, pour cela donner le nom de fichier entre guillemets. Chaque ligne de ce fichier doit contenir une entrée.

n.b : à l'université du Littoral Côte d'Opale, on utilise également Squid. Le seul inconvénient concerne le filtrage. La chaîne "cul" a bien entendu été censurée mais il est également impossible de consulter le site http://www.culturecommunication.gouv.fr/

Exemple 3 : utilisation d'un fichier.


# URL interdites
acl          url_interdites url_regex "/etc/squid/denied_url"
http_access deny            url_interdites

Des produits associés à Squid (redirecteurs) permettent un contrôle plus simple. SquidGuard, par exemple, permet d’interdire des milliers de sites. Le site d’information est référencé plus loin dans la rubrique “ liens ”. Pensez, si vous utilisez SquidGuard, à configurer la ligne suivante dans le fichier squid.conf :


redirect_program /usr/local/squid/bin/SquidGuard

Exemple 4 : pour contrôler qui a le droit d’utiliser votre cache, créez une ACL du type :


acl		si_OK src     192.168.0.0/255.255.0.0
http_access allow localhost
http_access allow site_OK
http_access deny  all

46.6. Contrôler les accès par authentification

Parmi les demandes qui reviennent le plus souvent, la question de l’utilisation de Squid pour contrôler qui a le droit d’aller sur internet, est l’une des plus fréquentes.

On peut imaginer deux solutions :

Si l'on utilise un annuaire LDAP, vous devez avoir dans le fichier squid.conf les lignes suivantes :


acl              identification   proxy_auth        REQUIRED
http_access      allow            identification
authentificate_program /usr/lib/squid/squid_ldap_auth \
                                     -b $LDAP_USER -u uid SERVEUR_LDAP
LDAP_USER est l’ou (organizational unit) dans laquelle se trouve les clients
(par exemple ou=people, ou= ac-limoges, ou=education, ou=gouv, c=fr).

Exemple de configuration avec NCSA_auth :


authenticate_program /usr/lib/ncsa_auth /etc/squid/passwd
acl                  foo                proxy_auth REQUIRED
acl                  all                src 0/0
http_access          allow              foo
http_access          deny               all

46.7. Interface web de Squid et produits complémentaires

Squid dispose en standard de quelques outils, mais sinon on peut utiliser webmin. On trouvera également, sur le site officiel de Squid, une liste de produits supplémentaires pouvant être interfacés avec Squid.

46.8. La journalisation

Squid journalise les transactions dans un fichier access.log. Ce fichier donne les informations sur les requêtes qui ont transité par Squid. Le fichier cache.log informe sur l’état du serveur lors de son démarrage. Le fichier store.log informe sur les objets stockés dans le cache.

Les dates indiquées dans le fichier access.log indique le temps en secondes depuis le 1 janvier 1970 (format epoch), ce qui n’est pas très facile à lire. Un petit script en perl, permet de recoder les dates :


#! /usr/bin/perl -p
s/^\d+\.\d+/localtime $&/e;

46.9. Configurer les clients

Pour configurer les clients, on peut utiliser la configuration manuelle ou la configuration automatique avec des fichiers .pac ou des fichiers .reg que l’on place dans le script de connexion des clients.

configuration automatique

46.10. Forcer le passage par Squid (Proxy transparent)

Il existe plusieurs solutions :

Configurer votre navigateur avec le bon proxy ou en utilisant le fichier de configuration automatique et le rendre impossible à changer. Mais cela nécessite que vous contrôliez les clients ce qui n’est pas toujours le cas.

Intercepter les requêtes sur le port 80 du routeur pour les rediriger sur Squid. Vous devez alors avoir dans votre fichier squid.conf :


# Configuration de traitement des requêtes du client
    httpd_accel_host virtual
    httpd_accel_port 80
    httpd_accel_with_proxy on
    httpd_accel_uses_host_header on
    httpd_accel_single_host off

Puis ajouter la règle pour netfilter de redirection des requêtes sur le port 80 :


iptables -t nat -F PREROUTING
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
                                            -j REDIRECT --to-port 8080
# Les clients peuvent envoyer leurs requêtes sur le port 80 du proxy
# Le service NAT du routeur les redirige sur le port 8080

46.11. Le redirecteur SquidGuard

Squid dispose d’une fonctionnalité qui permet de passer une URL (requête entrante) à une application externe. Cela présente l’avantage de pouvoir bénéficier des services d’applications spécialisées. C’est par exemple le cas pour le redirecteur SquidGuard, largement utilisé pour protéger les accès sur des sites déclarés comme “ impropres ”. Une base de données de ces sites est tenue à jour. C’est cette dernière qui est utilisée pour filtrer les accès.

46.12. Les applications non prises en charge par un service proxy

Certaines applications ne sont pas prises en charge par Squid (https, smtp, pop, ftp...). Les raisons peuvent être diverses. Soit le service n’est pas pris en charge (pop, smtp...), soit il n’est pas conseillé de stocker en cache certaines informations d’authentification par exemple (https).

Pour les applications ou services non pris en charge par un service proxy, vous devrez utiliser l’ipmasquerade, un service de translation d’adresse ou utiliser une autre technologie.