Maniatux's Blog

Welcome to the internet

Cent OS 6 + Squid + SquidGuard

Rédigé par Xavier - -

L'objectif de cet article va être la mise en place d'un serveur Proxy tournant sur Linux CentOS 6. Il fournira un filtrage des pages Web visitées (pour un contrôle parental, par exemple).

Plan du tutoriel

  • Choix de l'OS
  • Présentation des différents éléments
  • Configuration de CentOS
  • Configuration basique de Squid
  • Configuration de SquidGuard
  • Authentification

Avertissement : Squid est dangereux pour votre santé mentale et pour le cuir chevelu. C'est le logiciel typique sur lequel vous passez 4 heures à configurer une fonction de base pour finalement y parvenir sans vraiment savoir pourquoi. Le dernier qui m'a fait ça est Asterisk, et je le hais aujourd'hui de toute ma personne. Vous êtes prévenu.

C'est parti !

Choix de l'OS

Le choix est toujours très subjectif, chaque OS a ses avantages et inconvénients. On pourrait partir sur FreeBSD mais j'ai beaucoup de doutes sur les procédures de mises à jour qui demandent de la compilation, du suivi, et un deuxième serveur dédié à cela ou l'utilisation de chroot et de jail... bref on va plutôt se tourner vers un système Linux qui va tout faire à notre place. Deux retiennent mon attention : Debian et CentOS. Nous allons partir sur le deuxième.

Présentation des différents éléments

  • Squid : le serveur Proxy (mandataire) qui va traiter les requêtes des clients. Il permet l'utilisation d'ACL pour autoriser ou refuser l'accès selon certaines conditions. Il est packagé dans CentOS.
  • SquidGuard : C'est un "redirecteur" il est chargé d'intercepter certaines requêtes HTTP en fonction de filtres et de fournir autre chose à la place. Par exemple une page d'erreur.

Nous allons donc commencer par mettre en place Squid et le tester depuis une machine cliente. Si cela fonctionne, nous pourrons configurer SquidGuard avec quelques filtres pour le porno, par exemple.

Configuration de CentOS

On peut se contenter d'une installation minimale et ajouter ce que nous voulons par la suite. Lorsque cela est fait, nous devons configurer le réseau. Nous partons sur les critères suivants:

  • La carte s'appelle eth0
  • Nous voulons une IP fixe : 192.168.1.50 / 24
  • Passerelle : 192.168.1.1 et DNS : 8.8.8.8

La configuration des cartes réseau se fait dans /etc/sysconfig/network-scripts/.

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

Puis entrez les paramètres suivants:

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.1.50
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8

Pour plus de renseignements sur la configuration réseau de CentOS, reportez-vous à la documentation Relancez maintenant le réseau :

# service network restart
Arrêt de l'interface eth0 :                                [  OK  ]
Arrêt de l'interface loopback :                            [  OK  ]
Activation de l'interface loopback :                       [  OK  ]
Activation de l'interface eth0 :                           [  OK  ]

Vous pouvez maintenant vérifier que les paramètres ont bien été pris en compte :

# ping -c 4 google.fr
PING google.fr (74.125.39.106) 56(84) bytes of data.
64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=1 ttl=51 time=53.1 ms
64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=2 ttl=51 time=46.3 ms
64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=3 ttl=52 time=62.3 ms
64 bytes from fx-in-f106.1e100.net (74.125.39.106): icmp_seq=4 ttl=52 time=44.9 ms

--- google.fr ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3052ms
rtt min/avg/max/mdev = 44.918/51.707/62.367/6.891 ms

Là on voit que notre routage vers internet est nos résolutions DNS sont OK. Nous pouvons donc mettre à jour notre système :

# yum update -y

Après plusieurs minutes, c'est bon. Si il y a eu une mise à jour du kernel vous devriez redémarrer la machine :

# shutdown -r now

Configuration basique de Squid

Passons maintenant aux choses sérieuses. Nous devons commencer par configurer le nom d'hôte de notre machine, sinon Squid ne se lancera pas. Il faut l'ajouter dans le fichier hosts :

# vi /etc/hosts

A mettre :

127.0.0.1   localhost proxy.mondomaine.org
::1         localhost proxy.mondomaine.org

Ensuite installons le paquet squid :

# yum install squid -y

Dans l'état, la configuration est déjà correcte. Elle autorise l'accès au localhost ainsi qu'aux machines du réseau local. Par contre le port d'écoute est le 3128 et celui-ci est fermé dans le parefeu. Il faut donc l'ouvrir :

# vi /etc/sysconfig/iptables

La ligne à ajouter est en gras ci-dessous :

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3128 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

Ensuite relancez iptables :

# service iptables restart
iptables : Suppression des règles du pare-feu :            [  OK  ]
iptables : Configuration des chaînes sur la politique ACCEP[  OK  ]er 
iptables : Déchargement des modules :                      [  OK  ]
iptables : Application des règles du pare-feu :            [  OK  ]

Vous devez également démarrer squid :

# service squid start
Démarrage de squid : .                                     [  OK  ]

Nous pouvons maintenant faire un essai. Sur une autre machine du réseau, lancez votre navigateur Web et configurez l'utilisation du proxy. Par exemple, sur Seamonkey :

Lors que vous ouvrez des sites vous devez maintenant voir sur votre switch que votre proxy est sollicité.

Configuration de SquidGuard

SquidGuard n'est pas packagé pour CentOS, il faut activer les dépôts RPMFusion. La documentation nous indique les manipulations à suivre.

# yum install wget -y
# wget http://urlpaquet.rpm
# rpm --import http://urlgpg.txt
# yum localinstall paquet.rpm

Les vraies URL sont compliquées et variables donc je ne les ai pas recopiées ici. Vous les trouverez dans la documentation.

Nous pouvons maintenant installer SquidGuard :

# yum install squidguard -y

Nous devons maintenant dire à Squid de faire appel à SquidGuard. Nous allons donc éditer son fichier de configuration (après l'avoir sauvegardé) :

# cp /etc/squid/squid.conf /root/
# vi /etc/squid/squid.conf

Nous allons devoir ajouter quelques paramètres. Placez-les quelque part où vous pourrez les retrouver facilement, par exemple dans la section "INSERT YOUR OWN RULE(S) HERE...."

redirect_program /usr/bin/squidGuard -c /etc/squid/squidguard.conf
redirect_children 5

La prochaine étape est la configuration de SquidGuard lui-même. Que doit-il filtrer ? Et comment ? En fait il va utiliser des blacklist. On peut les récupérer gratuitement et elles sont divisées en catégories.

# wget ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/blacklists.tar.gz
# mkdir /var/lib/squidguard/db
# tar zxvf blacklists.tar.gz -C /var/lib/squidguard/db/
# rm blacklists.tar.gz

Maintenant que nous avons nos blacklists nous pouvons configurer SquidGuard. Par défaut il y a beaucoup de choses paramétrées, même trop, et pas tellement bien expliqué. Donc après une petite sauvegarde, on part sur un fichier propre :

# cp /etc/squid/squidguard.conf /root/
# rm /etc/squid/squidguard.conf
# vi /etc/squid/squidguard.conf

A mettre :

#
# CONFIG FILE FOR SQUIDGUARD
#

dbhome /var/lib/squidguard/db/blacklists
logdir /var/log/squidguard

# Dest filters

dest adult {
        domainlist adult/domains
        urllist adult/urls
        }

dest porn {
        domainlist porn/domains
        urllist porn/urls
        }

# ACL

acl {
        default {
                pass !porn !adult all
                redirect http://www.ovh.com/fr/images/hosting/astuce_htaccess/interdit.jpg
                }
   }

La première ligne défini où sont stockées les blacklist. Par la suite, on définit des catégories et on indique où aller chercher les fichiers qui contiennent les url et domaines à bannir. Vers la fin, dans les ACL, on demande à rediriger vers l'url explicitée tout ce qui est banni. Cette url pointe sur un panneau rouge.

Les blacklists ne sont pas directement exploitables elles doivent être "compilées". Au passage nous allons créer le dossier pour les logs de squidguard :

# mkdir /var/log/squidguard
# squidGuard -C all
2011-08-27 20:03:32 [1313] New setting: dbhome: /var/lib/squidguard/db/blacklists
2011-08-27 20:03:32 [1313] New setting: logdir: /var/log/squidguard
2011-08-27 20:03:32 [1313] init domainlist /var/lib/squidguard/db/blacklists/adult/domains
Processing file and database /var/lib/squidguard/db/blacklists/adult/domains
    [==================================================] 100 % done
2011-08-27 20:04:27 [1313] create new dbfile /var/lib/squidguard/db/blacklists/adult/domains.db
2011-08-27 20:04:27 [1313] init urllist /var/lib/squidguard/db/blacklists/adult/urls
Processing file and database /var/lib/squidguard/db/blacklists/adult/urls
    [==================================================] 100 % done
2011-08-27 20:04:29 [1313] create new dbfile /var/lib/squidguard/db/blacklists/adult/urls.db
2011-08-27 20:04:29 [1313] init domainlist /var/lib/squidguard/db/blacklists/porn/domains
Processing file and database /var/lib/squidguard/db/blacklists/porn/domains
    [==================================================] 100 % done
2011-08-27 20:05:25 [1313] create new dbfile /var/lib/squidguard/db/blacklists/porn/domains.db
2011-08-27 20:05:26 [1313] init urllist /var/lib/squidguard/db/blacklists/porn/urls
Processing file and database /var/lib/squidguard/db/blacklists/porn/urls
    [==================================================] 100 % done
2011-08-27 20:05:27 [1313] create new dbfile /var/lib/squidguard/db/blacklists/porn/urls.db
2011-08-27 20:05:28 [1313] squidGuard 1.3 started (1314468212.506)
2011-08-27 20:05:28 [1313] db update done
2011-08-27 20:05:28 [1313] squidGuard stopped (1314468328.015)

Seules les listes explicitées dans SquidGuard.conf sont compilées. Maintenant il faut donner les bonnes permissions et relancer Squid :

# chown -R squid:squid /var/lib/squidguard/db/
# pkill squid
# service squid start

Le squid stop ne fonctionne pas, je ne sais pas si c'est un cadeau de CentOS6, mais il faut utiliser le pkill pour l'arrêter réellement. Puis pour le relancer il faut passer par service squid start, parce qu'on peut aussi le lancer par la commande "squid -z" mais votre configuration ne sera pas prise en compte. J'ai perdu quelques cheveux à comprendre ça.

Maintenant, retournez sur votre ordinateur client et essayez d'accéder à un site interdit comme youporn. Vous devriez être redirigé vers la page que nous avons spécifié dans la configuration. Si cela ne fonctionne pas, essayez de désactiver SELinux avec la commande setenforce 0 (temporaire).

Il est bien entendu conseillé de faire votre propre page web, par exemple une qui explique pourquoi le visiteur a été redirigé ici.

Lancement automatique de Squid

Pour que Squid soit lancé au démarrage du système :

# chkconfig --level 3 squid on

A venir

A terme nous mettrons en place des redirections/filtrages différents selon les utilisateurs et les thèmes. Un site porno bloqué pointera sur une page expliquant que le porno saimal pour la productivité tandis qu'un site de phishing affichera autre chose. Restez branchés.

Classé dans : Sysadmin - Mots clés : aucun