Filtrer, mais bien filtrer

Dans le cas d'un système GNU/Linux, les solutions ne sembles pas être très nombreuses. Il existe néanmoins des possibilités de protection parentale, qui sont en fait des protections pour public sensible. Une solution employé par Free (FreeAngle) est d'utiliser le site/proxy Babygo pour effectuer un filtrage Web.

Il y a deux types de filtres destiné à un public différent :

  • les plus jeunes associé au moteur BabyGo ;
  • les plus vieux des jeunes, avec un moteur de recherche récemment baptisé KidiGo.

La différence se fait au choix du filtrage. Le filtre le plus contraignant est en fait une liste blanche de sites jugés « sans danger ». Le second niveau réside en une liste noir de sites « déconseillés ». La méthode d'application de ces filtres se fait par l'utilisation d'un proxy (avec d'ailleurs une mauvaise implémentation par FreeAngel). Il est donc possible de reprendre cette fonctionnalité pour l'appliquer à un système sous Linux.

Le but est d'avoir un compte utilisateur pour chaque personne de la famille avec des droits différents suivant leur niveau de maturité. Une fois la relation utilisateur / niveau de filtrage (fort, faible ou nul) établie, il convient de l'appliquer correctement pour chacun.

Une nouvelle génération de pare-feu authentifiant à vu le jour avec l'arrivée de NuFW, mais ici une simple utilisation des possibilités de Netfilter peut faire l'affaire pour une solution simple et efficace.

Depuis la version 2.4 de Linux, il existe une fonction très intéressante permettant de fixer des règles iptables en fonction des utilisateurs. Grâce à cela, on peut authentifier les connexions (sortantes et établies) d'un utilisateur par l'intermédiaire d'iptables.

Le module owner permet d'appliquer des règles en fonction de l'initiateur du paquet réseau sortant, ce qui est censé étant donné la notion de propriété. Il existe deux manières d'identifier le propriétaire : grâce à l'identifiant de l'utilisateur (UID), ou alors avec son « groupe principale » (GID).

Script

Avec ces outils en main, voici comment établir un ensemble de règles pour chaque utilisateur de la machine familiale :

#!/bin/sh

FREE_USERS="root maman papa"

# name host port user...
RULES="
BabyGo_web proxy1.babygo.fr 8118 petit
KidiGo_web proxy2.babygo.fr 8118 grand
MSN_auth 65.52.0.0/14 https grand
MSN_GW 207.46.0.0/16 msnp grand
MSN_web 207.46.0.0/16 http grand
Allocine_img a69.g.akamai.net http grand
"
# nexus.passport.com messenger.hotmail.com

LAN="192.168.0.0/16"

# flush
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
echo 0 > /proc/sys/net/ipv4/ip_forward

# input
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT --source "$LAN" -j ACCEPT

# output
iptables -A OUTPUT --destination "$LAN" -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

# free users
for user in $FREE_USERS
do
    echo "Freeing user $user ..."
    iptables -A OUTPUT -m owner --uid-owner "$user" -j ACCEPT
done

# rules
echo "$RULES" | while read name host port users
do
    for user in $users
    do
        echo "Adding rule $name for $user ..."
        iptables -A OUTPUT -m owner --uid-owner "$user" --destination "$host" -p tcp --dport "$port" -j ACCEPT
    done
done

Ce script est à lancer au démarrage de la machine, avant que les utilisateurs ne puissent s'y connecter (/etc/rc*). Les règles pour INPUT et FORWARD sont à adapter en fonction des besoins...

Dans ce cas, tous les utilisateurs sont autorisés à utiliser le réseau local, ce qui peut être une mesure de contournement de la protection (si proxy interne) mais on a ainsi un accès libre au ressources du LAN (DNS, DHCP, serveurs de fichiers, imprimante...).

Il est également possible de changer le groupe des utilisateurs ayant les mêmes droit réseau afin d'y appliquer un filtrage, mais cela peut ajouter des contraintes suivant l'utilisation du GID.

Nous avons ici deux utilisateur : petit et grand. Le premier est soumis à la liste blanche et le second à la liste noir. Des services supplémentaires (chat, bandes annonces) ont du être rajoutés (du fait d'une pression utilisateur) ce qui ouvre bien entendu des brèches supplémentaires dans les remparts ainsi érigés, mais qui semblent minimes étant donné l'usage. On peut noter que les services ne sont pas forcément identifiables à long terme par la résolution de nom ce qui implique de « prendre large » (expérience avec Windows Live Messenger).

Les utilisateurs émancipés doivent quant à eux se trouver dans la liste FREE_USERS, y compris le root et les utilisateurs des services qui utilisent le réseau !

Après cette intervention au niveau du système, il reste à configurer les navigateurs afin qu'ils utilisent le proxy qui leur est dédié (proxy1.babygo.fr:8118 pour petit et proxy2.babygo.fr:8118 pour grand en complétant avec les exceptions).

Et ça marche ?

Oui, ça fonctionne comme souhaité et de manière invisible. Il y a néanmoins deux inconvénients à utiliser un proxy externe :

  • la dépendance au service distant (qui n'est pas contrôlé) ;
  • la divulgation/utilisation des informations personnelles et habitudes de surf (qui devient possible).

Partant d'une bonne intention, on se rend compte que la dérive d'utilisation peut être facile pour celui qui contrôle le mandataire. La solution venant alors à l'esprit est de mettre soi-même en place ce filtre Web. Il est donc préférable d'utiliser un proxy filtrant tel que l'alliance Squid/Dansguardian avec une configuration aux petits oignons fixant les bonnes pondérations afin d'ajuster au mieux cette protection. Attention cependant au contenu chiffré qui ne peut alors plus être analysé pour le filtrage !

Avec une telle solution, complètement libre, il est possible d'avoir un très bon résultat qui n'a rien à envier aux solutions propriétaires, et qui est dans bien des cas meilleure (contrôle de la solution et connaissance des limites) !