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.

raspberry pi parental control

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 🙂

  1. 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
  2. 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.

  3. Sauvegarde de la configuration de Squid (en cas d’erreur)
    cp /etc/squid3/squid.conf /etc/squid3/squid.conf.origin
  4. 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
  5. 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
  6. 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).

  1. Créer le répertoire /cache
    mkdir /cache
  2. Dans le fichier /etc/fstab ajouter la ligne
    tmpfs /cache tmpfs defaults,noatime,nosuid,size=500m 0 0
  3. Dans le fichier /etc/squid3/squid.conf ajouter la ligne suivante à la fin du fichier
    cache_dir ufs /cache 400 16 256
  4. Reste à générer le cache et redémarrer Squid
    service squid3 stop
    squid3 -z
    service squid3 start

Configurer SquidGuard

  1. 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
  2. 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/
  3. 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
            }
    }
    
  4. 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/
  5. 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
  6. Vous pouvez tester la configuration de SquidGuard et Squid et générer les répertoires de cache
    service squid3 stop
    squid3 -z
  7. Démarrer Squid
    service squid3 restart

Voilà SquidGuard installé et configuré pour bloquer les sites adultes

raspberry pi squid squidguard filtering

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 :

raspberry pi proxy squid squidguard block screen

Installer webmin et calamaris pour les analyses de log

  1. 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
  2. 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éé :

  1. 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.

  2. Modifier les mime-types des fichiers .pac. Ajoutez à la fin du fichier /etc/nginx/mime.type
    application/x-ns-proxy-autoconfig .pac;
  3. Redémarrer Nginx
    service nginx restart
  4. 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.

Vous aimez cet article ? Supportez-moi sur Patreon!

Vous aimerez aussi...