Ziirish's Home :: Blog

Ziirish's Pub

 
 

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 :

squid-1.png

squid-1.png (direct link)

squid-2.png

squid-2.png (direct link)

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 !