« Squid3 » : différence entre les versions

De NCad Wiki
Aller à la navigation Aller à la recherche
 
(42 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[Image:LOGO_Squid.gif|center]]
[[Image:LOGO_Squid.gif|center]]
__TOC__
__TOC__
<br />
{{ Box_Legislation | objet=Avant tout déploiement, vous êtes tenu d'informer vos utilisateurs qui devront signer une charte attestant reconnaître l’existence d'un tel dispositif et de respecter les règles d'usage de l'accès Internet dans votre entreprise / administration.
Squid3 est un serveur proxy. A ce titre, il enregistre l'ensemble des requêtes qui lui sont soumises à savoir : l'url demandée - l'IP du poste client et la date. De ce fait, ces informations étant nominative, elles doivent être déclarées auprès de la CNIL. }}
<br />
= Installation =
= Installation =


== Prérequis ==
== Depuis les dépôts ==
 
* Pour installer le serveur proxy '''Squid3''' sans prise en charge du module '''ssl''', il suffit d'installer le paquet '''squid3'''.
 
{{ Box Console | objet=sudo apt-get install squid3 }}
 
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Installation avec prise en charge SSL</div>
 
<div style="width:99%;padding:5px;">
 
{{ Box Attention | objet=Si vous souhaitez un support ssl, l'installation par les sources est obligatoire. }}
 
* Installation des paquets pour l'environnement de compilation :
 
{{ Box Console | objet=apt-get install dpkg-dev devscripts build-essential fakeroot libssl-dev }}
 
* Obtention des sources du paquet '''Squid3''' :
 
{{ Box Console | objet=cd /opt<br />
apt-get source squid3 }}
 
* Installation des dépendances :
 
{{ Box Console | objet=apt-get build-dep squid3 }}
 
* Pour activer le '''support SSL''', il faut éditer le fichier '''squid3-3.x.x/debian/rules''' et y ajouter la ligne suivante  :
 
--enable-ssl \
 
* Juste après la ligne :


La configuration dépend de l'étendu du réseau à filtrer. Plus le réseau regroupera de machines, plus les performances du serveur devront être élevée. A savoir que Squid sollicite particulièrement la mémoire vive.
--enable-ecap \


* Configuration minimum
* On lance le script de configuration :
** Processeur monocore 1 GHz
** Mémoire 2 Go
** OS Linux Ubuntu


* Configuration conseillée
{{ Box Console | objet=cd /opt/squid3-3.x.x<br />
** Processeur monocore 3,2 GHz
./configure }}
** Mémoire 4 Go
** OS Linux Ubuntu


== Installer Squid3 ==
* Puis on construit les nouveaux packages :


* Installer le paquet Squid3.
{{ Box Console | objet=debuild -us -uc -b }}
<br />
{{ Box Attention | objet=Ce processus peut prendre plusieurs heures. }}


{{ Box Console | objet=sudo apt-get install squid3 }}
* Une fois la compilation terminée les paquets suivants sont présents :
 
squid3_3.3.8-1ubuntu6.2_i386.deb        squid-cgi_3.3.8-1ubuntu6.2_i386.deb
squid_3.3.8-1ubuntu6.2_i386.deb        squidclient_3.3.8-1ubuntu6.2_i386.deb
squid3-common_3.3.8-1ubuntu6.2_all.deb  squid-purge_3.3.8-1ubuntu6.2_i386.deb
squid3-dbg_3.3.8-1ubuntu6.2_i386.deb
 
* On procède à l'installation des paquets '''squid3_3.3.8-1ubuntu6.2_i386.deb''' et '''squid3-common_3.3.8-1ubuntu6.2_all.deb'''.
 
{{ Box Console | objet=dpkg -i squid3_3.3.8-1ubuntu6.2_i386.deb squid3-common_3.3.8-1ubuntu6.2_all.deb }}


* Les fichiers de configuration se trouvent dans le répertoire '''/etc/squid3'''.
</div>
</div>


= Configuration de Squid3 =
= Configuration de base =


* Le fichier de configuration de '''squid3''' fournit par défaut est un fichier commenté. Ce dernier contient toutes les informations nécessaires à la compréhension de chacun des paramètres.
* Le fichier de configuration de '''squid3''' fournit par défaut est un fichier commenté. Ce dernier contient toutes les informations nécessaires à la compréhension de chacun des paramètres.
Ligne 39 : Ligne 81 :
== Architecture du réseau ==
== Architecture du réseau ==


* Dans notre topologie, le serveur '''Squid3''' se trouve entre le routeur ''(Box, Modem Internet)'' et le '''LAN'''.
* Dans notre topologie, le serveur '''Squid3''' se trouve entre le routeur ''(Box, Modem Internet)'' et le '''LAN'''. Les paramètres de connexion au serveur proxy '''Squid3''' devront être indiqués dans le navigateur web de chaque PC.


[[Image:squid_passerelle_map_network.png|center|thumb|350px|Intégration du serveur en tant que passerelle]]
[[Image:squid_passerelle_map_network.png|center|thumb|350px|Intégration du serveur en tant que passerelle]]
Ligne 57 : Ligne 99 :
== Définition des ACLs ==
== Définition des ACLs ==


Les '''ACLs''' permettent de définir les plages IPs qui seront exploitées par le fichier de configuration dans l'édition des règles d'accès. Ces plages IPs ne sont rien d'autres que celles utilisées par le réseau ''(en l'occurence dans notre exemple nous n'en exploitons qu'une seule)''. On en définira deux :
=== Fonctionnement ===
* la plage ip du réseau local;
* le localhost;


* '''Synthaxe :''' acl <nom_reseau> src <plage_ip/adresse_ip>
Les '''AC'''cess '''L'''ists ''(Listes d'accès)'' permettent d'établir des règles d'accès selon plusieurs critères ''(adresse IP, nom d'hôte, protocole)''.


acl goulouxiou src 10.0.0.0/24 # Plage IP du réseau
* La synthaxe d'une liste d'accès est la suivante :
acl prauxyla src 127.0.0.1/32  # Adresse de loopback du serveur


Maintenant nous allons lister les protocoles TCP/IP standards, toujours dans le but par la suite d'établir des règles d'accès :
acl <nom_reseau> src <plage_ip/adresse_ip>


* '''Synthaxe :''' acl <nom_protocol> port <numero_de_port>
=== Déclaration d'hôtes ===


{{ Box Remarque | objet=Pour des raisons de commodité nous nommons de la manière suivante les protocoles listés : Safe_ports pour les protocoles standard non sécurisé - et SSL_ports pour les protocoles sécurisés. }}
* Nous allons définir une ACL pour identifier les machines du réseau local.
 
acl reseaulocal src 10.0.0.0/24
 
=== Déclaration des protocoles ===
 
*Nous allons définir une liste des '''protocoles TCP/IP''' qui seront autorisés à traverser le proxy.


  acl SSL_ports port 443 563  
  acl SSL_ports port 443 563  
Ligne 93 : Ligne 138 :
  acl Safe_ports port 901        # SWAT
  acl Safe_ports port 901        # SWAT


== Définition des accès ==
{{ Box Remarque | objet=Pour des raisons de commodité nous nommons de la manière suivante les protocoles listés : Safe_ports pour les protocoles standard non sécurisé - et SSL_ports pour les protocoles sécurisés. }}
<br />
{{ Box Information | objet=Les règles d'accès seront définies par la suite. }}
 
== Règles d'accès ==


Nous allons maintenant définir les accès. Cette définition s'effectue en trois étape :
=== Initialisation du cache ===
* on intialise la configuration;
 
* on définit les autorisations;
* On procède à la purge du cache de Squid3. Ce dernier sauvegarde toutes les pages consultées par les utilisateurs afin d'éviter d'avoir à les télécharger de nouveau.
* on interdit le reste.


  acl purge method PURGE
  acl purge method PURGE
* On autorise l'établissement du tunnel HTTP entre les clients et le proxy.
  acl CONNECT method CONNECT
  acl CONNECT method CONNECT
=== Définition des autorisations ===
* On autorise uniquement les protocoles qui ont été listés dans l'ACL Safe_ports :
   
   
  http_access deny !Safe_ports # Tous les accès aux ports non définit par la directive Safe_ports sont refusés
  http_access deny !Safe_ports
http_access allow localhost  # On autorise les connexions au serveur depuis le serveur lui-même
http_access allow goulouxiou # On autorise les connexions depuis les stations du réseau


http_access deny all        # On refuse tous les autres accès
* On autorise les postes informatiques du réseau local à se connecter au serveur proxy :


Puis on termine la configuration par les lignes suivantes :
http_access allow reseaulocal
 
* On interdit tous les autres accès non listés :
 
http_access deny all
 
* Blocage des requêtes '''ICP''' :


  icp_access deny all
  icp_access deny all
 
* Blocage des requêtes '''HTCP''' :
 
  htcp_access deny all
  htcp_access deny all
=== Paramètres de fonctionnement du proxy ===
* '''Port d'écoute''' du serveur proxy :
   
   
  http_port 3128
  http_port 3128
* Ne pas interroger le cache pour l'accès à des scripts '''cgi''' :
   
   
  hierarchy_stoplist cgi-bin ?
  hierarchy_stoplist cgi-bin ?
* Chemin vers le fichier des logs d'accès de '''Squid3''' :
   
   
  access_log /var/log/squid3/access.log squid
  access_log /var/log/squid3/access.log squid
* Temps de rafraîchissement du cache et durée de vie du cache :
   
   
  refresh_pattern ^ftp: 1440 20% 10080
  refresh_pattern ^ftp: 1440 20% 10080
Ligne 125 : Ligne 196 :
  refresh_pattern (cgi-bin|\?) 0 0% 0
  refresh_pattern (cgi-bin|\?) 0 0% 0
  refresh_pattern . 0 20% 4320
  refresh_pattern . 0 20% 4320
* '''Port d'écoute''' du serveur proxy pour les requêtes '''ICP''' :
   
   
  icp_port 3130
  icp_port 3130
   
   
  coredump_dir /var/spool/squid3
  coredump_dir /var/spool/squid3
== Application de la configuration ==
* Pour appliquer les changements il est nécessaire de rafraîchir la configuration du proxy.
{{ Box Console | objet=service squid3 reload }}


== Fichier squid.conf ==
== Fichier squid.conf ==


Au final, voici le fichier de configuration ainsi obtenu :
* Voici le fichier de configuration ainsi obtenu :


  visible_hostname prauxyla.net.ncad.fr
  visible_hostname prauxyla.net.ncad.fr
Ligne 138 : Ligne 217 :
   
   
  acl goulouxiou src 10.0.0.0/24
  acl goulouxiou src 10.0.0.0/24
acl prauxyla src 127.0.0.1/32
   
   
  acl SSL_ports port 443 563  
  acl SSL_ports port 443 563  
Ligne 164 : Ligne 242 :
  acl CONNECT method CONNECT
  acl CONNECT method CONNECT
   
   
  http_access deny !Safe_ports # Tous les accès aux ports non définit par la directive Safe_ports sont refusés
  http_access deny !Safe_ports
  http_access allow localhost  # On autorise les connexions au serveur depuis le serveur lui-même
  http_access allow reseaulocal
  http_access allow goulouxiou # On autorise les connexions depuis les stations du réseau
  http_access deny all
   
   
  icp_access deny all
  icp_access deny all
Ligne 187 : Ligne 265 :
  coredump_dir /var/spool/squid3
  coredump_dir /var/spool/squid3


= Bloquer les services de chats, messageries instantanées et VoIP =
= Authentification =
 
{{ Box Attention | objet=Le module authentification n'est pas compatible avec le mode transparent/intercept de Squid3. }}
 
== Radius ==
 
{{ Box Information | objet=Pour l'installation et la configuration d'un serveur RADIUS, merci de vous reporter à la page [[FreeRadius]] }}
 
* Le programme d'authentification '''Radius''' pour '''Squid3''' se trouve dans le répertoire '''/usr/lib/squid3/'''. Ce programme attend comme paramètres l'adresse du serveur '''Radius''' suivit du mot de passe de connexion pour le client.
 
auth_param basic program /usr/lib/squid3/basic_radius_auth -h 192.168.1.47 -w 123abc!?
auth_param basic children 5
auth_param basic realm Passerelle Internet.
auth_param basic credentialsttl 30 minutes
 
* Pour appliquer les changements il est nécessaire de rafraîchir la configuration du proxy.
 
{{ Box Console | objet=service squid3 reload }}
 
<div style="width:100%;background-color:#dddddd;margin-top:15px; margin-bottom:15px">
<div style="width:100%;background-color:#CCCCCC;font-family:cursive;font-size:16px;height:25px;text-align:center">Pour aller plus loin</div>
 
<div style="width:99%;padding:5px;">
 
* Il est possible de tester ce programme directement en ligne de commande. Pour cela, il suffit d'ouvrir un terminal depuis le serveur où est installé '''Squid3''' et de saisir la ligne suivante :
 
{{ Box Console | objet=/usr/lib/squid3/basic_radius_auth -h 192.168.1.47 -w 123abc!? }}
 
* Une ligne vide apparaît, sur cette ligne il suffit de saisir le '''login de l'utilisateur''' et son '''mot de passe''' séparé par un '''espace''' puis de taper '''Entrée''' pour valider.
 
* Si le '''CLI''' retourne '''OK''', l'authentification s'est déroulée avec succès.
 
</div>
</div>
 
= Squid3 en mode transparent =
 
{{ Box Attention | objet=L'authentification des utilisateurs n'est pas compatible avec le mode transparent de Squid3. }}
 
* En mode transparent, '''Squid''' intercepte les requêtes '''HTTP''' pour répondre au client à la volé. Dans ce mode de configuration le proxy n'est pas configuré sur le client mais c'est le routeur - ou le pare-feu - qui lui redirige directement les requêtes.
 
* Pour activer ce fonctionnement, nous allons ajouter un port d'écoute dédié sur le proxy '''Squid'''. Ici, il s'agira du port '''TCP 3129'''. Dans le fichier de configuration '''/etc/squid3/squid.conf''' on va ajouter la ligne suivante après '''http_port 3128''' :
 
http_port 3129 intercept
 
{{ Box_Legislation | objet=Les personnes soumises au filtrage des requêtes via cette méthode ne pouvant se douter qu'elles sont derrières un proxy, vous êtes dans l'obligation de les informer de la présence d'un système de filtrage en amont sur le réseau.}}
 
* Pour appliquer cette modification, il est nécessaire de redémarrer '''Squid''' :
 
{{ Box_Console | objet=service squid3 restart }}
 
=== Règle iptables ===
 
* Si le serveur où est installé '''Squid''' fait également office de routeur, il faut rediriger le trafic Internet du port '''TCP 80''' sur le port '''TCP 3128''' de '''Squid'''. Pour cela il faut configurer une règle '''iptables'''. La règle se construit comme ceci :
 
{{ Box Console | objet=sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128 }}
 
* Sauvegarde de la règle pour être appliquée au démarrage du système :
 
{{ Box_Console | objet= netfilter-persistent save }}
 
= Squid3 avec filtrage https =
 
{{ Box Attention | objet=Cette configuration fonctionne avec Squid3 en mode transparent / intercept. }}
 
== Configuration générale ==
 
* Création d'un répertoire dans lequel seront générés le certificat encodé et sa clé privée.
 
{{ Box Console | objet=mkdir /etc/squid3/ssl_cert }}
 
* On génère une '''clé privée''' suivit du '''certificat'''. A cette étape, le '''CLI''' demandera quelques renseignements.


Il peut être nécessaire de bloquer l'accès à certaines applications comme la messagerie instantanée. Squid rend possible ce type de blocage. Pour cela il existe des ACLs spécifiques selon la stratégie de blocage envisagée :
{{ Box Console | objet=openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -keyout myCA.pem  -out myCA.pem }}
* en fonction de l'adresse web du service;
* ou encore selon le type mime de la page web;
* selon la plage ip du réseau de destination;
* en analysant le contenu de l'url de la page par une règle regexp.


Voici la synthaxe propre à chacune de ces méthode :
* Le résultat de la génération produit un fichier '''myCA.pem'''. Nous allons extraire - depuis ce fichier - le certificat encodé qui devra être installé sur chaque PC client du réseau.
* '''Définition de domaines :''' acl <nom_acl> dstdomain <.mydomain.tld> [.mydomain2.tld]
* '''Définition de type mime :''' acl <nom_acl> req_mime_type <application/x-msn-messenger>
* '''Définition par regexp :''' acl <nom_acl> urlpath_regex -i <subscribe.php> [subscribe.html]
* '''Définition de réseaux :''' acl <nom_acl> dst 178.33.001.0/24


== Blocage de MSN Messenger ==
{{ Box Console | objet=openssl x509 -in myCA.pem -outform DER -out myCA.der }}


Blocage du service MSN Messenger accessible depuis un navigateur web.
* Maintenant, on configure '''Squid3''' pour s'intercaler entre les échanges sur le port '''443 ''(SSL)'''''. Pour cela, on va lui indiquer d'écouter sur le port '''TCP 3127''', qui sera dédié exclusivement à ce type d'échange.


  acl msn urlpath_regex -i gateway.dll                                # Définition du fichier dll gateway
  https_port 3127 intercept ssl-bump \
acl msnd dstdomain messenger.msn.com gateway.messenger.hotmail.com  # Définition de certains noms de domaines
  cert=/etc/squid3/ssl_cert/myCA.pem \
acl msn1 req_mime_type application/x-msn-messenger                  # Définition du mime type relatif à l'application MSN Web Messenger
  generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
   
   
  http_access deny msnd msn msn1                                      # Blocage des directives listés ci-dessus
  always_direct allow all
ssl_bump server-first all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
 
* On effectue une redirection transparente des requêtes '''SSL''' ''(port TCP de destination 443)'' sur le connecteur d'entrée du serveur proxy ''(port d'écoute TCP 3127)''.
 
{{ Box Console | objet=iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3127 }}
 
* Pour appliquer les changements il est nécessaire de rafraîchir la configuration du proxy.
 
{{ Box Console | objet=service squid3 reload }}
 
== Liste d'exclusion ==
 
* Il est possible d'ignorer certains sites afin qu'ils ne soient intercepté. Tout d'abord, nous définissons une nouvelle '''acl''' qui contiendra le domaine du site à ignorer. Cette '''acl''' portera le nom de '''no_bump_ssl'''.
 
acl no_bump_ssl dstdomain .ovh.com
 
* Cette '''acl''' renferme le domaine de destination '''ovh.com''' ainsi que tous ses sous-domaines. Pour appliquer cette exclusion, nous ajouterons l'instruction suivante :
 
ssl_bump none no_ssl_bump
 
* Juste avant la ligne :
 
ssl_bump server-first all
 
* On redémarre '''Squid3''' pour appliquer la configuration.
 
{{ Box Console | objet=service squid3 restart }}
 
= Auto-configuration =


== Blocage de Yahoo! Messenger ==
* L'objectif est d'envoyer la configuration du proxy au client lors de la requête DHCP.


acl ym dstdomain .messenger.yahoo.com .psq.yahoo.com
* Dans cet exemple, notre serveur DHCP fait également office de serveur web. C'est sure ce dernier que le script '''proxy.pac''' sera hébergé.
acl ym dstdomain .us.il.yimg.com .msg.yahoo.com .pager.yahoo.com
acl ym dstdomain .rareedge.com .ytunnelpro.com .chat.yahoo.com
acl ym dstdomain .voice.yahoo.com
acl ymregex url_regex yupdater.yim ymsgr myspaceim
acl ym dstdomain .skype.com .imvu.com
http_access deny ym
http_access deny ymregex


== Blocage de Gizmo ==
== Configuration DHCP ==


acl gizmo dstdomain .gizmoproject.com
* On édite le fichier de configuration '''/etc/dhcp/dhcpd.conf''' en y ajoutant au début - avant la déclaration des subnets - les deux lignes suivantes :
acl gizmo dstdomain .talqer.com .gizmocall.com .fring.com
acl gizmo dstdomain .pidgin.im
http_access deny gizmo


== Blocage de ICQ ==
option local-pac-server code 252 = text;
option local-pac-server "http://10.0.0.1/proxy.pac";


acl icq dstdomain .icq.com
* Redémarrer le serveur pour appliquer la configuration :
http_access deny icq


== Blocage de AOL ==
{{ Box_Console | objet=/etc/init.d/isc-dhcp-server restart }}


acl aol dst 64.12.200.89/32 64.12.161.153/32 64.12.161.185/32
== Script PAC ==
acl aol dst 205.188.153.121/32 205.188.179.233/32
http_access deny aol


== Fichier squid.conf ==
* Le script permet d'indiquer au client quelle est l'adresse du serveur proxy. Il peut également être affiné en retournant une adresse en fonction de diverses paramètres liés au client ''(en fonction du réseau source, d'une adresse IP source spécifique, d'une url de destination, ...)''.


Voici le nouveau fichier de configuration avec les nouvelles directives
* Notre script '''proxy.pac''' - qui est hébergé sur le serveur DHCP - est renseigné avec les éléments suivants :


  visible_hostname prauxyla.net.ncad.fr
  function FindProxyForURL(url, host)
  cache_mgr tech@ncad.fr
  {
        return "PROXY 10.146.3.253:3128";
acl goulouxiou src 10.0.0.0/24
  }
acl prauxyla src 127.0.0.1/32
acl SSL_ports port 443 563
acl Safe_ports port 80        # http
acl Safe_ports port 20        # ftp-data
acl Safe_ports port 21        # ftp
acl Safe_ports port 443 563    # ssl
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 10000      # Administration
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 5190      # AIM
acl Safe_ports port 5222      # jabber
acl Safe_ports port 5050      # Yahoo Messenger
acl Safe_ports port 1863      # MSN Messenger
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 Safe_ports port 631        # cups
acl Safe_ports port 873        # rsync
acl Safe_ports port 901        # SWAT
acl msn urlpath_regex -i gateway.dll                                # Définition du fichier dll gateway
acl msnd dstdomain messenger.msn.com gateway.messenger.hotmail.com  # Définition de certains noms de domaines
acl msn1 req_mime_type application/x-msn-messenger                  # Définition du mime type relatif à l'application MSN Web Messenger
acl ym dstdomain .messenger.yahoo.com .psq.yahoo.com
acl ym dstdomain .us.il.yimg.com .msg.yahoo.com .pager.yahoo.com
acl ym dstdomain .rareedge.com .ytunnelpro.com .chat.yahoo.com
acl ym dstdomain .voice.yahoo.com
acl ymregex url_regex yupdater.yim ymsgr myspaceim
acl ym dstdomain .skype.com .imvu.com
acl gizmo dstdomain .gizmoproject.com
acl gizmo dstdomain .talqer.com .gizmocall.com .fring.com
acl gizmo dstdomain .pidgin.im
acl icq dstdomain .icq.com
acl aol dst 64.12.200.89/32 64.12.161.153/32 64.12.161.185/32
acl aol dst 205.188.153.121/32 205.188.179.233/32
acl purge method PURGE
acl CONNECT method CONNECT
http_access deny msnd msn msn1
http_access deny aol
http_access deny icq
http_access deny gizmo
http_access deny ym
http_access deny ymregex
http_access deny !Safe_ports # Tous les accès aux ports non définit par la directive Safe_ports sont refusés
http_access allow localhost  # On autorise les connexions au serveur depuis le serveur lui-même
http_access allow goulouxiou # On autorise les connexions depuis les stations du réseau
icp_access deny all
htcp_access deny all
http_port 3128
   
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid3/access.log squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
icp_port 3130
coredump_dir /var/spool/squid3

Dernière version du 18 février 2020 à 17:38

LOGO Squid.gif


ICON Balance.png

Conformité avec la loi...

Avant tout déploiement, vous êtes tenu d'informer vos utilisateurs qui devront signer une charte attestant reconnaître l’existence d'un tel dispositif et de respecter les règles d'usage de l'accès Internet dans votre entreprise / administration.

Squid3 est un serveur proxy. A ce titre, il enregistre l'ensemble des requêtes qui lui sont soumises à savoir : l'url demandée - l'IP du poste client et la date. De ce fait, ces informations étant nominative, elles doivent être déclarées auprès de la CNIL.


Installation

Depuis les dépôts

  • Pour installer le serveur proxy Squid3 sans prise en charge du module ssl, il suffit d'installer le paquet squid3.

sudo apt-get install squid3

Installation avec prise en charge SSL

Si vous souhaitez un support ssl, l'installation par les sources est obligatoire.

  • Installation des paquets pour l'environnement de compilation :

apt-get install dpkg-dev devscripts build-essential fakeroot libssl-dev

  • Obtention des sources du paquet Squid3 :

cd /opt
apt-get source squid3

  • Installation des dépendances :

apt-get build-dep squid3

  • Pour activer le support SSL, il faut éditer le fichier squid3-3.x.x/debian/rules et y ajouter la ligne suivante  :
--enable-ssl \
  • Juste après la ligne :
--enable-ecap \
  • On lance le script de configuration :

cd /opt/squid3-3.x.x
./configure

  • Puis on construit les nouveaux packages :

debuild -us -uc -b


Ce processus peut prendre plusieurs heures.

  • Une fois la compilation terminée les paquets suivants sont présents :
squid3_3.3.8-1ubuntu6.2_i386.deb        squid-cgi_3.3.8-1ubuntu6.2_i386.deb
squid_3.3.8-1ubuntu6.2_i386.deb         squidclient_3.3.8-1ubuntu6.2_i386.deb
squid3-common_3.3.8-1ubuntu6.2_all.deb  squid-purge_3.3.8-1ubuntu6.2_i386.deb
squid3-dbg_3.3.8-1ubuntu6.2_i386.deb
  • On procède à l'installation des paquets squid3_3.3.8-1ubuntu6.2_i386.deb et squid3-common_3.3.8-1ubuntu6.2_all.deb.

dpkg -i squid3_3.3.8-1ubuntu6.2_i386.deb squid3-common_3.3.8-1ubuntu6.2_all.deb

Configuration de base

  • Le fichier de configuration de squid3 fournit par défaut est un fichier commenté. Ce dernier contient toutes les informations nécessaires à la compréhension de chacun des paramètres.
  • Nous effectuons une sauvegarde de ce fichier :

cd /etc/squid3
cp ./squid.conf ./squid.conf.bak

  • Nous créons un nouveau fichier squid.conf vierge.

touch squid.conf

Architecture du réseau

  • Dans notre topologie, le serveur Squid3 se trouve entre le routeur (Box, Modem Internet) et le LAN. Les paramètres de connexion au serveur proxy Squid3 devront être indiqués dans le navigateur web de chaque PC.
Intégration du serveur en tant que passerelle

Dans ce type de configuration, le serveur Squid3 est utilisé comme passerelle. Pour configurer un équipement Linux comme routeur, veuillez vous reporter à l'article Routeur_Linux.

Paramètres généraux

  • Le fichier de configuration de Squid3 se trouve dans le répertoire /etc/squid3 et se nomme squid.conf.
  • On définit en premier lieu le hostname qui correspond au nom de la machine.
visible_hostname prauxyla.net.ncad.fr
  • On peut aussi renseigner l'adresse mail du responsable technique et qui sera communiquée dans les pages d'erreurs du proxy.
cache_mgr tech@ncad.fr

Définition des ACLs

Fonctionnement

Les ACcess Lists (Listes d'accès) permettent d'établir des règles d'accès selon plusieurs critères (adresse IP, nom d'hôte, protocole).

  • La synthaxe d'une liste d'accès est la suivante :
acl <nom_reseau> src <plage_ip/adresse_ip>

Déclaration d'hôtes

  • Nous allons définir une ACL pour identifier les machines du réseau local.
acl reseaulocal src 10.0.0.0/24

Déclaration des protocoles

  • Nous allons définir une liste des protocoles TCP/IP qui seront autorisés à traverser le proxy.
acl SSL_ports port 443 563 
acl Safe_ports port 80         # http 
acl Safe_ports port 20         # ftp-data 
acl Safe_ports port 21         # ftp 
acl Safe_ports port 443 563    # ssl 
acl Safe_ports port 70         # gopher 
acl Safe_ports port 210        # wais 
acl Safe_ports port 10000      # Administration 
acl Safe_ports port 1025-65535 # unregistered ports 
acl Safe_ports port 5190       # AIM
acl Safe_ports port 5222       # jabber
acl Safe_ports port 5050       # Yahoo Messenger
acl Safe_ports port 1863       # MSN Messenger
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 Safe_ports port 631        # cups 
acl Safe_ports port 873        # rsync 
acl Safe_ports port 901        # SWAT
Pour des raisons de commodité nous nommons de la manière suivante les protocoles listés : Safe_ports pour les protocoles standard non sécurisé - et SSL_ports pour les protocoles sécurisés.


Les règles d'accès seront définies par la suite.

Règles d'accès

Initialisation du cache

  • On procède à la purge du cache de Squid3. Ce dernier sauvegarde toutes les pages consultées par les utilisateurs afin d'éviter d'avoir à les télécharger de nouveau.
acl purge method PURGE
  • On autorise l'établissement du tunnel HTTP entre les clients et le proxy.
acl CONNECT method CONNECT

Définition des autorisations

  • On autorise uniquement les protocoles qui ont été listés dans l'ACL Safe_ports :
http_access deny !Safe_ports
  • On autorise les postes informatiques du réseau local à se connecter au serveur proxy :
http_access allow reseaulocal
  • On interdit tous les autres accès non listés :
http_access deny all
  • Blocage des requêtes ICP :
icp_access deny all
  • Blocage des requêtes HTCP :
htcp_access deny all

Paramètres de fonctionnement du proxy

  • Port d'écoute du serveur proxy :
http_port 3128
  • Ne pas interroger le cache pour l'accès à des scripts cgi :
hierarchy_stoplist cgi-bin ?
  • Chemin vers le fichier des logs d'accès de Squid3 :
access_log /var/log/squid3/access.log squid
  • Temps de rafraîchissement du cache et durée de vie du cache :
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern (cgi-bin|\?)	0	0%	0
refresh_pattern .		0	20%	4320
  • Port d'écoute du serveur proxy pour les requêtes ICP :
icp_port 3130

coredump_dir /var/spool/squid3

Application de la configuration

  • Pour appliquer les changements il est nécessaire de rafraîchir la configuration du proxy.

service squid3 reload

Fichier squid.conf

  • Voici le fichier de configuration ainsi obtenu :
visible_hostname prauxyla.net.ncad.fr
cache_mgr tech@ncad.fr

acl goulouxiou src 10.0.0.0/24

acl SSL_ports port 443 563 
acl Safe_ports port 80         # http 
acl Safe_ports port 20         # ftp-data 
acl Safe_ports port 21         # ftp 
acl Safe_ports port 443 563    # ssl 
acl Safe_ports port 70         # gopher 
acl Safe_ports port 210        # wais 
acl Safe_ports port 10000      # Administration 
acl Safe_ports port 1025-65535 # unregistered ports 
acl Safe_ports port 5190       # AIM
acl Safe_ports port 5222       # jabber
acl Safe_ports port 5050       # Yahoo Messenger
acl Safe_ports port 1863       # MSN Messenger
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 Safe_ports port 631        # cups 
acl Safe_ports port 873        # rsync 
acl Safe_ports port 901        # SWAT

acl purge method PURGE
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access allow reseaulocal
http_access deny all

icp_access deny all

htcp_access deny all

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /var/log/squid3/access.log squid

refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern (cgi-bin|\?)	0	0%	0
refresh_pattern .		0	20%	4320

icp_port 3130

coredump_dir /var/spool/squid3

Authentification

Le module authentification n'est pas compatible avec le mode transparent/intercept de Squid3.

Radius

Pour l'installation et la configuration d'un serveur RADIUS, merci de vous reporter à la page FreeRadius

  • Le programme d'authentification Radius pour Squid3 se trouve dans le répertoire /usr/lib/squid3/. Ce programme attend comme paramètres l'adresse du serveur Radius suivit du mot de passe de connexion pour le client.
auth_param basic program /usr/lib/squid3/basic_radius_auth -h 192.168.1.47 -w 123abc!?
auth_param basic children 5
auth_param basic realm Passerelle Internet.
auth_param basic credentialsttl 30 minutes
  • Pour appliquer les changements il est nécessaire de rafraîchir la configuration du proxy.

service squid3 reload

Pour aller plus loin
  • Il est possible de tester ce programme directement en ligne de commande. Pour cela, il suffit d'ouvrir un terminal depuis le serveur où est installé Squid3 et de saisir la ligne suivante :

/usr/lib/squid3/basic_radius_auth -h 192.168.1.47 -w 123abc!?

  • Une ligne vide apparaît, sur cette ligne il suffit de saisir le login de l'utilisateur et son mot de passe séparé par un espace puis de taper Entrée pour valider.
  • Si le CLI retourne OK, l'authentification s'est déroulée avec succès.

Squid3 en mode transparent

L'authentification des utilisateurs n'est pas compatible avec le mode transparent de Squid3.

  • En mode transparent, Squid intercepte les requêtes HTTP pour répondre au client à la volé. Dans ce mode de configuration le proxy n'est pas configuré sur le client mais c'est le routeur - ou le pare-feu - qui lui redirige directement les requêtes.
  • Pour activer ce fonctionnement, nous allons ajouter un port d'écoute dédié sur le proxy Squid. Ici, il s'agira du port TCP 3129. Dans le fichier de configuration /etc/squid3/squid.conf on va ajouter la ligne suivante après http_port 3128 :
http_port 3129 intercept
ICON Balance.png

Conformité avec la loi...

Les personnes soumises au filtrage des requêtes via cette méthode ne pouvant se douter qu'elles sont derrières un proxy, vous êtes dans l'obligation de les informer de la présence d'un système de filtrage en amont sur le réseau.

  • Pour appliquer cette modification, il est nécessaire de redémarrer Squid :

service squid3 restart

Règle iptables

  • Si le serveur où est installé Squid fait également office de routeur, il faut rediriger le trafic Internet du port TCP 80 sur le port TCP 3128 de Squid. Pour cela il faut configurer une règle iptables. La règle se construit comme ceci :

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128

  • Sauvegarde de la règle pour être appliquée au démarrage du système :

netfilter-persistent save

Squid3 avec filtrage https

Cette configuration fonctionne avec Squid3 en mode transparent / intercept.

Configuration générale

  • Création d'un répertoire dans lequel seront générés le certificat encodé et sa clé privée.

mkdir /etc/squid3/ssl_cert

  • On génère une clé privée suivit du certificat. A cette étape, le CLI demandera quelques renseignements.

openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -keyout myCA.pem -out myCA.pem

  • Le résultat de la génération produit un fichier myCA.pem. Nous allons extraire - depuis ce fichier - le certificat encodé qui devra être installé sur chaque PC client du réseau.

openssl x509 -in myCA.pem -outform DER -out myCA.der

  • Maintenant, on configure Squid3 pour s'intercaler entre les échanges sur le port 443 (SSL). Pour cela, on va lui indiquer d'écouter sur le port TCP 3127, qui sera dédié exclusivement à ce type d'échange.
https_port 3127 intercept ssl-bump \
  cert=/etc/squid3/ssl_cert/myCA.pem \
  generate-host-certificates=on dynamic_cert_mem_cache_size=4MB

always_direct allow all
ssl_bump server-first all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
  • On effectue une redirection transparente des requêtes SSL (port TCP de destination 443) sur le connecteur d'entrée du serveur proxy (port d'écoute TCP 3127).

iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3127

  • Pour appliquer les changements il est nécessaire de rafraîchir la configuration du proxy.

service squid3 reload

Liste d'exclusion

  • Il est possible d'ignorer certains sites afin qu'ils ne soient intercepté. Tout d'abord, nous définissons une nouvelle acl qui contiendra le domaine du site à ignorer. Cette acl portera le nom de no_bump_ssl.
acl no_bump_ssl dstdomain .ovh.com
  • Cette acl renferme le domaine de destination ovh.com ainsi que tous ses sous-domaines. Pour appliquer cette exclusion, nous ajouterons l'instruction suivante :
ssl_bump none no_ssl_bump
  • Juste avant la ligne :
ssl_bump server-first all
  • On redémarre Squid3 pour appliquer la configuration.

service squid3 restart

Auto-configuration

  • L'objectif est d'envoyer la configuration du proxy au client lors de la requête DHCP.
  • Dans cet exemple, notre serveur DHCP fait également office de serveur web. C'est sure ce dernier que le script proxy.pac sera hébergé.

Configuration DHCP

  • On édite le fichier de configuration /etc/dhcp/dhcpd.conf en y ajoutant au début - avant la déclaration des subnets - les deux lignes suivantes :
option local-pac-server code 252 = text;
option local-pac-server "http://10.0.0.1/proxy.pac";
  • Redémarrer le serveur pour appliquer la configuration :

/etc/init.d/isc-dhcp-server restart

Script PAC

  • Le script permet d'indiquer au client quelle est l'adresse du serveur proxy. Il peut également être affiné en retournant une adresse en fonction de diverses paramètres liés au client (en fonction du réseau source, d'une adresse IP source spécifique, d'une url de destination, ...).
  • Notre script proxy.pac - qui est hébergé sur le serveur DHCP - est renseigné avec les éléments suivants :
function FindProxyForURL(url, host)
{
       return "PROXY 10.146.3.253:3128";
}