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 aimerez aussi...

  • Pingback: Raspberry Pi Home Server : Un contrôle parental grâce au Raspberry Pi, Squid et SquidGuard - Maison et Domotique()

  • Roman REY ARIAS

    Très sympa, on ne pense pas souvent que l’on va être confronté à ça et pourtant cela vient plus vite que prévu en général 🙂

    Je vais tester tout ça 🙂

  • kix

    J’ai actuellement ce système installé sur une machine Ubuntu et j’aurai aimé savoir quel est le niveau de performance d’une telle solution sur un Raspberry. Bien entendu il s’agit aussi d’une installation dans le cadre familial.
    Merci 😉

  • Nous sommes 3 à la maison : 2 pc, 2 tablettes, 2 telephones et un ipod. Tous passent par le proxy et pas de probleme. Coté performance personne ne trouve à redire donc c’est validé 😉

    • lecameleon99

      Hello. Quel version de raspberry tu utilises?
      Est ce que ton proxy bloques également les pubs indésirables?

      • Salut. Raspberry Pi 2. Non pas de blocage de pub je n’ai pas regardé comment Squid pouvait s’en occuper

        • lecameleon99

          Merci pour la réponse.

  • superjey

    Sur openwrt j’ai mis un proxy transparent pour éviter de configurer.
    Par contre avec squid+dansguardian je bypass le tout dès que je suis en https ça me glande. As tu vérifier avec ta configuration proposée ici ?

    Et aussi, ça ne bloquera rien si l’ado passe par une appli genre « chanu » pour aller sur 4chan

    • J’arrive à activer le passage en HTTPS sans erreur mais coté performance je n’ai pas vu de différence

      Pour le moment à 9 ans j’ai encore un peu de marge. Et puis je n’ai pas verrouillé la configuration du proxy sur l’iPod donc c’est pas 100% secure

  • Daniel Coquette

    Extra ce tuto. J’ai cédé à la facilité en installant Ipfire sur un B+.

  • Arkanak

    Bonjour,

    Je ne parviens pas à créer une page d’erreur personnalisée.
    Dans le fichier de configuration de squidguard, je met « redirect adresse_rpi/block.html
    Je retombe bien sur la page block.html que j’ai créé mais je voudrais que l’adresse affichée ne soit pas celle de mon rpi mais celle du site bloqué. Pourriez-vous m’aider svp ?
    Merci d’avance

    • Bonjour,

      Chez moi je redirige vers une page PHP qui analyse les paramètres. Dans la configuration squidguard j’ai ceci :

      redirect http://192.168.1.28/index.php?caddr=%a&cname=%n&user=%i&group=%s&target=%t&url=%u

      Plus d’information sur les paramètres possibles lors d’une redirection : http://www.squidguard.org/Doc/redirect.html

      • Arkanak

        Bonjour, pourriez vous indiquer le contenu de votre page index.php, je ne parviens pas à changer l’URL.
        Cordialement

        • <html>

          <head>

          <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

          </head>

          <body>

          <img style="margin:30px; display: block; margin-left: auto; margin-right: auto" src="http://192.168.1.28/stop.png"/>

          <h3 style="text-align: center">

          Le site <?php echo htmlspecialchars($_GET["url"]); ?> n'est pas autorisé

          </h3>

          <pre style="text-align: center">Source : <?php echo htmlspecialchars($_GET["caddr"]); ?></pre>

          <pre style="text-align: center">Target : <?php echo htmlspecialchars($_GET["target"]); ?></pre>

          <pre style="text-align: center">URL : <?php echo htmlspecialchars($_GET["url"]); ?></pre>

          </body>

          </html>

          • Arkanak

            Bonjour, merci de votre réponse rapide.

            Dans ma page j’ai bien
            l’IP source, etc … mais dans la barre d’adresse j’ai l’adresse de ma
            page qui est mon serveur web local (192.168.1.X/index.php avec les
            paramètres). D’après ce que je vois, vous avez l’url saisie dans la
            barre d’adresse mais le contenu de ‘index.php’ qui est affiché.
            Comment avez-vous fait ?

          • Aucune idée … désolé

  • Abdullah Irfan

    Or you could use GateSentry on the RPI, just flash the image onto your sd card and you’re good to go: http://www.abdullahirfan.com/my-projects/gatesentry/

  • Pingback: Contrôle parental maison avec Raspberry Pi, Squid et SquidGuard - Gentil virus Open Source()

  • Jimmy Van den Bliek

    Je teste la solution pour ma petite famille, pour bloquer youtube notamment à certaines heures. Ca fonctionne très bien sauf que l’accès aux mails ne fonctionnent plus. J’explique un peu ma configuration. J’ai une Freebox sur laquelle j’interdit par défaut tous les accès internet à toutes les machines pour forcer le passage via le proxy. Donc seul le proxy à un accès internet. Dans la config Squid, j’ai enlevé tout ce qui concerne le blocage des ports. Sous IOS ou OSX (iMac et iPhone), je définie le proxy mais la connection au serveur email est impossible. Voici ma config squid:

    acl CONNECT method CONNECT
    acl home_network src 192.168.0.0/24
    acl parents src 192.168.0.51
    acl youtube_hours time M T W H F 17:00-20:30
    acl youtube dstdomain .youtube.com
    http_access deny CONNECT youtube !parents !youtube_hours
    deny_info http://localhost/block.php youtube
    http_access deny youtube !parents !youtube_hours
    http_access allow localhost manager
    http_access deny manager
    http_access allow localhost
    http_access allow home_network
    http_access deny all
    http_port 3128
    coredump_dir /var/spool/squid3
    refresh_pattern ^ftp: 1440 20% 10080
    refresh_pattern ^gopher: 1440 0% 1440
    refresh_pattern -i (/cgi-bin/|?) 0 0% 0
    refresh_pattern . 0 20% 4320
    cache_dir ufs /cache 400 16 256
    url_rewrite_program /usr/bin/squidGuard -c /etc/squidguard/squidGuard.conf

    Quelqu’un a t-‘il était confronté à ce problème? Merci

    • Bonjour
      Les accès à des serveurs sur d’autres ports que le 80 ou 443 fonctionnent ? Genre un ftp ou ssh. Pour savoir si ca vient spécifiquement du mail ou des ports. Ca serait bizarre que seuls les ports pour le mail soient bloqués.
      As tu regardé les logs de squid dans /var/log/squid3 ?

      • Jimmy Van den Bliek

        En fait tout ce qui n’est pas sur les ports 80 ou 443 est bloqué ou du moins ne transite pas par le proxy. Je vois bien le trafic sur les ports 80 et 443 dans les logs mais rien concernant les autres ports. C’est comme si le proxy était ignoré pour tout le reste et essaye de passer directement. Comme j’ai bloqué par défaut sur la freebox tous les accès Internet et seul le serveur proxy peut accéder à Internet, tout le reste est bloqué.

        Pour l’instant, j’ai ouvert de nouveau l’accès Internet pour tous les appareils et je mets manuellement la configuration du proxy pour le port 80/443. Ca permet un minimum de contrôle quand même.

        • Il y a dans la configuration de squid la possibilité de gerer les ports mais je ne l’ai jamais utilisé.

  • Hugo Tofani

    Bonjour et merci pour ce très bon tuto, cependant tu ne parles par de la réécriture safesearch, as-tu des informations à ce sujet ?

    • Bonjour
      De ce que j’en ai vu et compris, Google etant full HTTPS et Squid en HTTP la reecriture pour forcer SafeSearch n’a pas l’air.
      Si tu veux tester tu peux installer squirm qui permet de faire de la reecriture d’url avec des regex

  • Damian Raspachini

    Hello, I do apologise for not writing in french, but my skills is french are quite poor yet. I have a question about this magnificent guideline. Have you tried this setup as a transparent proxy? I have a 8 years old son, and I would like to force the proxy use in my LAN without setting up manually in each device. Could you kindly give me a hand with that? Recently I bought an usb to ethernet interface for my Pi in order to make a bridge between both interfaces.

    Thank you in advance.

    Best regards,

    • Hi. I did not define a transparent proxy, i change the configuration only on my daughter’s iPod (for now she has only that device)
      You can try to define a hotspot on the Raspberry Pi, add Squid on it and link the Pi to your home router via Ethernet link (and of course disable the router wifi if you have one) ?

      • ced

        Hi,

        Thanks for the tuto… I’m also looking for a transparent proxy solution. One idea would be to tweak the DHCP server configuration of the router (or disable it on the router and have the Rpi play that role) and do provide the rPI as the default gateway instead of the router itself. All trafic would be then redirected to rpi. Depending on the MAC address, we could even think of providing different default gateways…. keeping for the parent or the tv or anything a direct access to the router instead of the rPI.

        This is an initial thought that i need to confirm

        Ced

  • Olly Lennox

    Hi There,

    Is there any chance you could upload a system image of your Raspberry Pi memory card? This guide is brilliant but I’m not the most technical and it sounds like you already have it setup really well

    Thanks!

  • boogieman

    Bonjour, merci pour ce tuto qui repond a quelque chose que je cherchais depuis un moment.
    je suis encore novice dans l’utilisation de debian et du coup, j’ai des difficultés à mettre en place les caches.

    peut-etre que vous avez la solution.
    sous root, la console me renvoie l’erreur suivante:

    2017/05/12 12:33:50 kid1| /cache exists
    FATAL: Failed to make swap directory /cache/00: (13) Permission denied

    si j’ai bien compris, il s’agirait d’une erreur de chown, mais je ne comprends pas bien. Les seuls topics que j’ai trouvé datent pas mal et j’ai peur de faire plus de mal en les suivant alors que c’est peut etre quelque chose de tout simple.
    j’ai l’impression qu’il y a deja un swap qui se monte au démarrage de ma machine sans savoir si ça peut faire un conflit. ce n’est d’ailleurs pas un raspberry mais un banana pi…

    plus loin dans voir tuto, vous vous mettez en place webmin depuis /root j’imagine que le probleme de permission risque de se poser à nouveau…?
    merci pour votre réponse

    • boogieman

      je pense avoir resolu le probleme en mettant

      chown -R proxy:proxy /cache

      mais ma 2eme question reste d’actualité 🙂

      • Le repertoire est utilisé pour lancer l’installation. Idealement il faudrait un.autre user dans un autre répertoire

    • Le message d’erreur dit que le repertoire existe deja. Pourquoi le recreer ? Attention le cache pour squid n’a rien a voir avec le swap de linux. Regardez le contenu du repertoire et regarder les droits positionnes.

      Pas.de.difference banana pi ou raspberry les deux restent des linux compatibles avec le sujet

  • Eric Le Meur

    Bonjour, et merci pour toutes ces informations. J’ai déjà installé Squid + Squidguard sur un serveur, pour un réseau local, et je voulais faire la même chose sur un Raspberry. Mais je suis confronté à un problème de branchement : sur mon « gros » serveur, il y a deux cartes réseaux, une pour l’entrée depuis la box, l’autre pour la sortie vers la baie de brassage. Or sur le Raspberry, sauf erreur, il n’y a qu’une prise RJ45. Est-ce que cela signifie que, depuis votre Raspberry, votre réseau familial n’est connecté qu’en wifi ? Bien à vous !

    • Bonjour Eric
      Oui qu’en wifi. Il est possible de mettre un adatateur reseau USB pour creer une 3eme interface qui sera utilisee pour Squid

      • Eric Le Meur

        Merci pour la réponse ! Je vais voir ce que je fais. A bientôt peut-être…