Un contrôle parental grâce au Raspberry Pi, Squid et SquidGuard
L’arrivée récente d’un iPod pour ma fille de 9 ans, nous a confronté à la dure réalité : les enfants grandissent vite et l’accès aux nouvelles technologies doit être encadré. D’où le besoin d’un système de contrôle pour les accès Internet.
Sans vouloir devenir un dictateur ou au contraire se reposer totalement sur un outil de contrôle parental, il a fallu quand même trouver une solution. La première consiste à expliquer les risques, que des choses ne sont pas à voir, mais rien ne vaut un bon contrôle informatique en plus 🙂
- Pour des questions de performances, j’ai utilisé une distribution minimaliste et qui venait juste d’être installée. Vous pouvez trouver toutes les informations sur cette page. Si besoin, mettez à jour votre distribution
apt-get update && apt-get upgrade -y
- Installer Squid et SquidGuard
apt-get install -y squid3 squidguard
Retenez qu’un utilisateur proxy a été créé. Il va nous être utile pour positionner correctement l’ensemble des droits pour le bon fonctionnement des logiciels.
- Sauvegarde de la configuration de Squid (en cas d’erreur)
cp /etc/squid3/squid.conf /etc/squid3/squid.conf.origin
- Générer une configuration plus légère en supprimant les nombreuses (mais utiles) lignes de commentaire.
cat /etc/squid3/squid.conf.origin | egrep -v -e '^[[:blank:]]*#|^$' > /etc/squid3/squid.conf
- Ajouter votre réseau à la fin de la liste des ACL. Chez moi je suis en local sur le 192.168.1.x. J’ai donc ajouté la ligne suivante
acl LocalNet src 192.168.1.0/24
- Autoriser les machines du réseau à se connecter au proxy. Ajouter la ligne rouge. Le lien se fait avec le nom. Ici LocalNet.
http_access allow localhost http_access allow LocalNet http_access deny all
Vous pouvez maintenant configurer votre navigateur ou OS pour utiliser le proxy en HTTP avec l’ip du Raspberry Pi et le port (par défaut) 3128.
Vous pouvez changer le paramètre de votre cache : emplacement, taille, etc. Le but est avant tout de filtrer les accès Internet mais aussi d’améliorer la navigation. Chez moi j’ai créé un répertoire dédié, de type tmpfs de 500Mb. Pour ne pas trop solliciter la carte SD, je monte ce répertoire en mémoire. Le cache ne doit pas occuper 100% de cet espace (80% est idéal donc 400Mb).
- Créer le répertoire /cache
mkdir /cache
- Dans le fichier /etc/fstab ajouter la ligne
tmpfs /cache tmpfs defaults,noatime,nosuid,size=500m 0 0
- Dans le fichier /etc/squid3/squid.conf ajouter la ligne suivante à la fin du fichier
cache_dir ufs /cache 400 16 256
- Reste à générer le cache et redémarrer Squid
service squid3 stop squid3 -z service squid3 start
Configurer SquidGuard
- Télécharger les blacklists. Le filtrage des accès par SquidGuard se fait sur base de listes de domaines, URLs ou mots clés. L’université de Toulouse maintient à jour des listes utilisables directement depuis SquidGuard.
wget http://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz tar -zxvf blacklists.tar.gz
- Installer les listes dans le répertoire accessible par SquidGuard. Ne pas oublier de changer les droits pour que SuidGuard puisse y accéder
mv blacklists /var/lib/squidguard/db/ chown -R proxy:proxy /var/lib/squidguard/db/
- Changer la configuration de SquidGuard dans le fichier /etc/squidguard/squidGuard.conf Dans l’exemple ci-dessous, tous les accès listés à des sites pornographiques seront bloqués pour tous les utilisateurs sauf les appareils dont les IP du groupe parents. Les accès non autorisés sont loggués dans un fichier pornaccesses.
dbhome /var/lib/squidguard/db logdir /var/log/squidguard src parents { ip 192.168.1.10 192.168.1.18 192.168.1.30 } dest porn { domainlist blacklists/porn/domains urllist blacklists/porn/urls log pornaccesses } acl { parents { pass all } default { pass !porn all redirect http://localhost/block.html } }
- Intégrer les blacklists dans SquidGuard. Vous devrez relancer cette commande à chaque changement de configuration de SquidGuard (/etc/squidguard/squidGuard.conf). Soyez patient, c’est relativement long sur nos petites machines.
squidGuard -C all chown -R proxy:proxy /var/lib/squidguard/db/
- Ajouter la ligne suivante à la fin du fichier de configuration de Squid /etc/squid3/squid.conf
url_rewrite_program
/usr/bin/squidGuard
-c
/etc/squidguard/squidGuard.conf
- Vous pouvez tester la configuration de SquidGuard et Squid et générer les répertoires de cache
service squid3 stop squid3 -z
- Démarrer Squid
service squid3 restart
Voilà SquidGuard installé et configuré pour bloquer les sites adultes
Vous constatez que l’erreur n’est pas la bonne. En effet, en cas d’erreur la configuration retourne l’utilisateur vers la page block.html. Comme nous ne l’avons pas installée, cela génère une erreur. Si vous voulez personnaliser le message, je vous conseille d’installer Nginx et de créer la page block.html avec la mise en forme que vous souhaitez. Voici ce que j’ai chez moi :
Installer webmin et calamaris pour les analyses de log
- Installer Webmin. J’ai fait ça depuis le répertoire /root (oui je sais c’est pas bien …)
mkdir webmin cd webmin/ wget http://prdownloads.sourceforge.net/webadmin/webmin-1.760.tar.gz tar zxvf webmin-1.760.tar.gz cd webmin-1.760/ ./setup.sh /usr/local/webmin
- Installer l’analyseur de log calamaris, très pratique pour les informations d’utilisation du proxy
apt-get install calamaris
Vous pouvez maintenant vous connecter sur l’ip de votre Raspberry Pi sur le port 10000. Vous vous identifiez avec l’id et le mot de passe de l’étape 1. Le module Squid se trouve dans la catégorie Serveur. Si vous souhaitez accélérer la navigation, je vous conseille le thème de StressFree.
Un autre outil d’analyse de long que j’ai installé est LightSquid (une démo est disponible ici). Il permet d’avoir des informations par jours/mois/utilisateurs, etc. Assez pratique pour voir ce qui passe sur le réseau.
Script de mise à jour automatique des blacklists
Les listes ne sont pas figées pour toujours. Elles sont maintenues à jour et évoluent régulièrement (je ne connais pas la fréquence exacte). Il faut donc télécharger et mettre à jour SquidGuard. Voici un exemple de script que vous pouvez mettre dans votre cron table pour une exécution quotidienne ou hebdomadaire :
#!/bin/sh cd /var/lib/squidguard/db rm -rf blacklists wget http://dsi.ut-capitole.fr/blacklists/download/blacklists.tar.gz tar -zxvf blacklists.tar.gz rm blacklists.tar.gz squidGuard -C all chown -R proxy:proxy /var/lib/squidguard/db/ service squid3 restart
J’ai donc créé ce script dans /etc/cron.daily. L’heure par défaut étant 6h25, j’ai changé pour 1h le matin pour être certain que la mise à jour ne dérange pas, étant donné que Squid est redémarré.
URL de configuration automatique du proxy
Grâce à votre serveur Web vous pouvez distribuer la configuration de votre proxy à votre système. Un fichier .pac doit être créé :
- Créer le fichier de configuration automatique. Vous le créez dans /usr/share/nginx/www et je l’ai appelé proxy.pac. Le contenu est une fonction javascript :
function FindProxyForURL(url, host) { if ( isInNet(myIpAddress(), "127.0.0.0", "255.0.0.0") || isInNet(myIpAddress(), "192.168.0.0", "255.255.255.0")) { return "DIRECT"; } else { if (shExpMatch(url, "http:*")) return "PROXY 192.168.1.28:3128" ; if (shExpMatch(url, "https:*")) return "PROXY 192.168.1.28:3128" ; return "DIRECT"; } }
Ce fichier donne le proxy HTTP et HTTPS. Pour localhost et le réseau local, l’appareil peut y accéder directement.
- Modifier les mime-types des fichiers .pac. Ajoutez à la fin du fichier /etc/nginx/mime.type
application/x-ns-proxy-autoconfig .pac;
- Redémarrer Nginx
service nginx restart
- Configurer votre appareil pour utiliser une configuration automatique à l’URL http://<ip de votre raspberry>/proxy.pac
Plus besoin de saisir chaque information.
Script de génération des destinations basées sur les blacklists
Voici un petit script pour générer les destinations en fonction des listes téléchargées. Ca peut vous aider à ne pas devoir tout taper.
#!/bin/sh SQUIDLIB=/var/lib/squidguard/db SQUIDLIB_BLACKLISTS=$SQUIDLIB"/blacklists" if [ -d $SQUIDLIB_BLACKLISTS ]; then for folderName in `ls $SQUIDLIB_BLACKLISTS`; do if [ -d "$SQUIDLIB_BLACKLISTS/$folderName" ]; then echo "dest $folderName {" if [ -e "$SQUIDLIB_BLACKLISTS/$folderName/domains" ]; then echo " domainlist blacklists/$folderName/domains" fi if [ -e "$SQUIDLIB_BLACKLISTS/$folderName/urls" ]; then echo " urllist blacklists/$folderName/urls" fi echo "}" fi done fi
Voilà ! Je vais maintenant regarder du coté de Apple Configurator pour mettre en place la configuration du proxy sans que ce soit modifiable par l’utilisateur. Si certains d’entre vous connaissent un équivalent pour Android, n’hésitez pas à partager dans les commentaires vos outils.
Pingback: Raspberry Pi Home Server : Un contrôle parental grâce au Raspberry Pi, Squid et SquidGuard - Maison et Domotique()
Pingback: Contrôle parental maison avec Raspberry Pi, Squid et SquidGuard - Gentil virus Open Source()