Et voilà, enfin le dernier billet de la série ! Je vous jure, j'essaie d'entretenir ce petit coin de potager qui deviendra peut-être un jour un jardin magique (ou pas).
Après avoir vu la configuration du formidable dd-wrt, puis la configuration de notre magnifique zor0, passons à la configuration de Guinness.
Il s'agit en réalité du proxy dédié au réseau FruitWifi. Un proxy, qu'est ce que c'est ?
C'est en réalité votre frigo. Vous faites vos courses pour les stocker dedans, puis avant de faire vos prochaines courses, vous vérifiez ce qu'il y manque.
Rapporté à notre modèle, c'est une machine entre la votre et le serveur web distant qui va en réalité faire la requête pour vous et stocker le résultat en cache. Ça permet dans certains cas d'économiser la bande passante. Plus il y a des "clients" qui consultent les mêmes saloperies sites (ex: facebook...), plus il y a de chances de rencontrer plusieurs fois les mêmes données (css, js, etc.).
Le deuxième avantage, c'est que cette seule machine centralise les requêtes de tout le monde, et comme c'est elle qui fait le GET, elle peut accepter ou non les réponses... Ça va nous permettre de mettre en place des listes de sites interdits !
Pour ce faire, j'ai donc utilisé l'excellent squid accompagné de squidGuard pour le filtrage d'URLs.
Je ne détaillerai pas l'installation, cela dépend de voter distribution.
Pour la configuration, on va modifier dans le fichier squid.conf les paramètres suivants :
# On ecoute le port 3128 et on est "transparent"
http_port 3128 transparent
# On met 256MB de cache en RAM
cache_mem 256 MB
# On stock 10000MB de donnees sur le disque dans /cache
cache_dir aufs /cache 10000 16 256
# On cree nos ACLs
acl localnet src 192.168.10.0/24
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
# And finally deny all other access to this proxy
http_access deny all
# Enfin, nous redirigeons les requêtes au parseur
url_rewrite_program /usr/bin/squidGuard
Nous devons activer le mode "transparent" car nous redirigeons le port destination 80 de nos clients sur le port 3128 de Guinness. Nous créons également l'ACL localnet que nous autorisons à accéder aux services par défaut gérés par squid. Puis nous redirigeons les requêtes vers squidGuard.
Je ne reviens pas non plus sur l'installation de squidGuard. Passons donc à sa configuration. Comme je le disais plus haut, il s'agit d'un parseur d'URLs qui va comparer l'URL demandée à une liste d'URL bloquées.
Nous n'allons bien entendu pas générer cette liste à la main... Il en existe plusieurs maintenant par des universités et/ou des chercheurs en sécurité. Elles sont également complétées par des robots (des programmes qui étudients les logs à la recherche d'URLs douteuses). La plus complète semble être celle de l'université de Toulouse. Servons-nous en !
% cd /var/lib/squidguard/db
% wget http://cri.univ-tlse1.fr/blacklists/download/blacklists.tar.gz
% tar xvzf blacklists.tar.gz
% rm blacklists.tar.gz
% chown -R proxy: blacklists
% find /var/lib/squidguard/db -type d | xargs chmod 755
% find /var/lib/squidguard/db -type f | xargs chmod 644
Passons maintenant à la configuration de squidGuard. Nous devons dans notre squidGuard.conf indiquer nos ACLs ainsi que nos différents filtres. La base de Toulouse étant assez conséquente, je vous file toute la conf ! (générer à coup de for et de ls je vous rassure )
#
# CONFIG FILE FOR SQUIDGUARD
#
dbhome /var/lib/squidguard/db/blacklists
logdir /var/log/squid
#
# TIME RULES:
# abbrev for weekdays:
# s = sun, m = mon, t =tue, w = wed, h = thu, f = fri, a = sat
time workhours {
weekly mtwhf 08:00 - 16:30
date *-*-01 08:00 - 16:30
}
#
# REWRITE RULES:
#
#
# SOURCE ADDRESSES:
#
src fruit-wifi {
ip 192.168.10.0/24
}
#
# DESTINATION CLASSES:
#
dest good {
}
dest local {
}
dest ads {
domainlist ads/domains
urllist ads/urls
expressionlist ads/expressions
}
dest adult {
domainlist adult/domains
urllist adult/urls
expressionlist adult/expressions
}
dest aggressive {
domainlist aggressive/domains
urllist aggressive/urls
expressionlist aggressive/expressions
}
dest agressif {
domainlist agressif/domains
urllist agressif/urls
expressionlist agressif/expressions
}
dest astrology {
domainlist astrology/domains
urllist astrology/urls
}
dest audio-video {
domainlist audio-video/domains
urllist audio-video/urls
}
dest blog {
domainlist blog/domains
urllist blog/urls
}
dest celebrity {
domainlist celebrity/domains
urllist celebrity/urls
}
dest chat {
domainlist chat/domains
urllist chat/urls
}
dest child {
domainlist child/domains
urllist child/urls
}
dest cleaning {
domainlist cleaning/domains
urllist cleaning/urls
}
dest dangerous_material {
domainlist dangerous_material/domains
urllist dangerous_material/urls
}
dest dating {
domainlist dating/domains
urllist dating/urls
}
dest drogue {
domainlist drogue/domains
urllist drogue/urls
}
dest drugs {
domainlist drugs/domains
urllist drugs/urls
}
dest filehosting {
domainlist filehosting/domains
urllist filehosting/urls
}
dest financial {
domainlist financial/domains
urllist financial/urls
}
dest forums {
domainlist forums/domains
urllist forums/urls
expressionlist forums/expressions
}
dest gambling {
domainlist gambling/domains
urllist gambling/urls
}
dest games {
domainlist games/domains
urllist games/urls
}
dest hacking {
domainlist hacking/domains
urllist hacking/urls
}
dest liste_bu {
domainlist liste_bu/domains
urllist liste_bu/urls
}
dest mail {
domainlist mail/domains
urllist mail/urls
expressionlist mail/expressions
}
dest malware {
domainlist malware/domains
urllist malware/urls
expressionlist malware/expressions
}
dest manga {
domainlist manga/domains
urllist manga/urls
}
dest marketingware {
domainlist marketingware/domains
urllist marketingware/urls
}
dest mixed_adult {
domainlist mixed_adult/domains
urllist mixed_adult/urls
}
dest mobile-phone {
domainlist mobile-phone/domains
urllist mobile-phone/urls
}
dest phishing {
domainlist phishing/domains
urllist phishing/urls
}
dest porn {
domainlist porn/domains
urllist porn/urls
expressionlist porn/expressions
}
dest press {
domainlist press/domains
urllist press/urls
}
dest proxy {
domainlist proxy/domains
urllist proxy/urls
expressionlist proxy/expressions
}
dest publicite {
domainlist publicite/domains
urllist publicite/urls
expressionlist publicite/expressions
}
dest radio {
domainlist radio/domains
urllist radio/urls
}
dest reaffected {
domainlist reaffected/domains
urllist reaffected/urls
}
dest redirector {
domainlist redirector/domains
urllist redirector/urls
expressionlist redirector/expressions
}
dest remote-control {
domainlist remote-control/domains
urllist remote-control/urls
}
dest sect {
domainlist sect/domains
urllist sect/urls
}
dest sexual_education {
domainlist sexual_education/domains
urllist sexual_education/urls
}
dest shopping {
domainlist shopping/domains
urllist shopping/urls
}
dest strict_redirector {
domainlist strict_redirector/domains
urllist strict_redirector/urls
expressionlist strict_redirector/expressions
}
dest strong_redirector {
domainlist strong_redirector/domains
urllist strong_redirector/urls
expressionlist strong_redirector/expressions
}
dest tricheur {
domainlist tricheur/domains
urllist tricheur/urls
}
dest violence {
domainlist violence/domains
urllist violence/urls
expressionlist violence/expressions
}
dest warez {
domainlist warez/domains
urllist warez/urls
expressionlist warez/expressions
}
dest webmail {
domainlist webmail/domains
urllist webmail/urls
}
acl {
fruit-wifi {
pass !porn !ads !warez !filehosting !proxy !redirector any
redirect http://redirect.ziirish.info/?targetclass=%t&url=%u
}
default {
pass local none
}
}
Les parties qui nous intéressent sont les deux suivantes :
src fruit-wifi {
ip 192.168.10.0/24
}
dans laquelle nous créons l'ACL nommée fruit-wifi
Et :
acl {
fruit-wifi {
pass !porn !ads !warez !filehosting !proxy !redirector any
redirect http://redirect.ziirish.info/?targetclass=%t&url=%u
}
default {
pass local none
}
}
dans laquelle nous interdisons à fruit-wifi d'accéder aux catégories porn, ads, warez, filehosting, proxy, et redirector. Si quelqu'un essayait d'accéder à ces sites bloqués, il serait redirigé sur la page http://redirect.ziirish.info/?targetclass=%t&url=%u
Exemples :
Et enfin, le code source de la page informant les gens de leur infraction :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Site INTERDIT !</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
L'accès au site <strong><?php echo $_GET['url']; ?></strong> est interdit !<br />
<br />
Il a été classé dans la catégorie <strong><?php echo $_GET['targetclass']; ?></strong>
<br /><br />
La tentative d’accès est enregistrée.
<?php
if ($_GET['targetclass'] == 'porn' ) {
?>
<center><img src="http://redirect.ziirish.info/img/owned.jpg" /></center>
<?php
}
?>
</body>
</html>
Facile !