| Intitulé du document : | Comment réaliser une solution de filtrage de contenus avec Squid, Squiguard, Havp et ClamAV ? |
|---|---|
| Localisation : | http://www.opendoc.net/comment-realiser-solution-filtrage-contenus-squid-squiguard-havp-clamav |
| Auteur : | Alexandre Bray |
| Vos questions : | support@opendoc.net |
| Date de création : | 2011/02/11 |
| Date de modification : | 2011/06/06 |
| Source : | Expérience professionnelle www.squid-cache.org www.server-side.de http://www.squidguard.org http://cri.univ-tlse1.fr/documentations/cache |
| Tags : | |
| Etat de la documentation : | |
| Vous souhaitez contribuer : | Comment soutenir opendoc ? |
| Informations : | Quelle est notre démarche ? |
| Licence : | ![]() opendoc.net est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Partage à l'Identique 3.0 non transcrit. |
Je vais essayer dans cet article de donner une première approche sur l'utilisation de squid et des composants qui peuvent graviter autour. La documentation de squid est parfois tellement complète qu'elle en décourage quelques un. Nous verrons quels sont les paramètres de base de squid, réaliser un premier type d'authentification, réaliser des ACLS … Comme dans mon habitude je vais essayé de vulgariser la technique afin qu'elle soit accessible à tous.
Je vais aborder plusieurs points d'explications afin que l'ensemble de la solution soit compréhensible. Un fichier zippé sera disponible en fin de document afin de pouvoir télécharger l'ensemble de la configuration.
| N° | Explications |
|---|---|
| 1 | Demande du client de la page web au proxy |
| 2 | Application des ACLs : Squid valide (ou pas), l'adresse source/destination, domaine… en fonction des ACLs. SQUID choisi de poursuivre (ou pas) le traitement. |
| 3 | Si la demande n'est pas bloquée, SQUID initie une connexion à HAVP par l'intermédiaire du cache_peer |
| 4 | HAVP a reçu la demande. Il va donc devoir charger la page pour pouvoir l'analyser. HAVP initie une connexion vers SQUID en utilisant ses paramètres : PARENTPROXY localhost PARENTPORT 3128 |
| 5 | SQUID a reçu la demande depuis HAVP. Cependant, il n'effectue pas le traitement classique grâce à l'acl cache_peer_access havp deny localhost car il n'autorise pas l'utilisation du cache_peet si la source est localhost, sinon cela pourrait créer une boucle. SQUID effectue donc la demande auprès du serveur Web (Internet) |
| 6 | Réponse du serveur Web |
| 7 | SQUID répond à HAVP qui a initié la demande |
| 8 | HAVP effectue le traitement anti-virus. Deux réponses sont possibles : - Aucun virus n'a été trouvé, HAVP renvoie l'URL d'origine à SQUID - Un virus a été détecté, HAVP renvoie une URL spécifique qui pointe vers une page informative |
| 9 | SQUID a reçu la réponse et effectue la classification d'URL par l'intermédiaire de SQUIDGUARD en utilisant l'option redirect_program /usr/bin/squidGuard. Deux réponses sont possibles : - L'URL testée ne fait partie d'aucune classification, SQUIGUARD renvoie l'URL d'origine. - L'URL est classifiée, SQUIDGUARD renvoie une URL spécifique qui pointe vers une page informative |
| 10 | SQUID répond au client |
source : http://fr.wikipedia.org/wiki/Squid
Un serveur Squid est un serveur mandataire (proxy) capable d'utiliser les protocoles FTP, HTTP, Gopher, et HTTPS. Contrairement aux serveurs proxy classiques, un serveur Squid gère toutes les requêtes en un seul processus d'entrée/sortie, non bloquant. C'est un logiciel libre distribué selon les termes de la licence GNU GPL. Squid garde les meta-données et plus particulièrement les données les plus fréquemment utilisées en mémoire. Il conserve aussi en mémoire les requêtes DNS, ainsi que les requêtes ayant échoué. Les requêtes DNS sont non bloquantes. Les données mémorisées peuvent être rangées en hiérarchies ou en mailles pour utiliser moins de bande passante.
Vous trouvez dans cette section les paramètres de base pour configurer Squid. Ces paramètres sont à titre indicatif, ils sont à modifier suivant vous besoins.
http_port 127.0.0.1:3128
http_port 192.168.20.10:3128
icp_port 0
snmp_port 0
visible_hostname proxy.local
httpd_suppress_version_string on
cache_mgr cache@proxy.local
cache_effective_user proxy
cache_effective_group proxy
forwarded_for delete
ftp_user ftp_user@proxy.local
logformat forward_for %ts.%03tu %6tr %{X-Forwarded-For}>h/%>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
pid_filename /var/run/squid.pid
coredump_dir /var/spool/squid
cache_access_log /var/log/squid/access.log forward_for
cache_log /var/log/squid/cache.log
useragent_log /var/log/squid/useragent.log
referer_log /var/log/squid/referer.log
cache_store_log /var/log/squid/cache_store.log
hosts_file /etc/hosts
cache_mem 32 MB
cache_dir ufs /var/cache/squid 128 32 256
cache_swap_low 90
cache_swap_high 95
maximum_object_size 1 GB
minimum_object_size 0 KB
maximum_object_size_in_memory 64 KB
cache_replacement_policy lru
memory_replacement_policy lru
quick_abort_min 64 KB
quick_abort_max 64 KB
quick_abort_pct 50
# Cache Policy
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
Dans cette section vous allez pouvoir déclarer vos premières ACLS. Comme vous pouvez le constater, un répertoire à été créé ”/etc/squid/acls” contenant des fichiers. Chaque fichier est une liste qui est modifiable suivant vous besoins.
acl CONNECT method CONNECT acl QUERY urlpath_regex cgi-bin \? .asp .jsp acl AUTH proxy_auth REQUIRED acl all src 0.0.0.0/0.0.0.0 acl localhost src 127.0.0.0/8 acl ssl-ports port "/etc/squid/acls/ssl-ports.txt" acl std-ports port "/etc/squid/acls/std-ports.txt" acl whitelist-src-ip src "/etc/squid/acls/whitelist-src-ip.txt" acl blacklist-src-ip src "/etc/squid/acls/blacklist-src-ip.txt" acl zeus-dst dst "/etc/squid/acls/zeus-dst.txt" acl zeus-dstdom dstdomain "/etc/squid/acls/zeus-dstdom.txt" acl zeus-dstdomreg dstdom_regex -i "/etc/squid/acls/zeus-dstdomreg.txt"
Prenons l'exemple de : acl std-ports port ”/etc/squid/acls/std-ports.txt”
Le but de l'acl est de déclarer votre besoin.
Le site zeustracker.abuse.ch fournis des informations concernant des nom de domaine ou ip frauduleux. Nous allons voir comment intégrer ces listes à squid sous formes d'acl
Ce script permet de récupérer le contenu des urls de zeustracker et de les mettre en forme pour Squid. Il ne vous reste plus qu'a créer 3 nouvelles acls.
#!/bin/bash ############################### # Auteur : Alexandre Bray # # Mail : abray@opendoc.net # # Source : http://opendoc.net # ############################### dst="/etc/squid/acls/zeus-dst.txt" dstdom="/etc/squid/acls/zeus-dstdom.txt" dstdomreg="/etc/squid/acls/zeus-dstdomreg.txt" curl -s http://www.abuse.ch/zeustracker/blocklist.php?download=ipblocklist | tail -n +7 > "$dst" curl -s http://www.abuse.ch/zeustracker/blocklist.php?download=domainblocklist | tail -n +7 > "$dstdom" curl -s http://www.abuse.ch/zeustracker/blocklist.php?download=domainblocklist | tail -n +7 | sed 's/\./\\\./g' |sed 's/^/\\\./' > "$dstdomreg"
Voici les acls correspondant aux différentes listes sur de zeustracker.
acl zeus-dst dst "/etc/squid/acls/zeus-dst.txt" acl zeus-dstdom dstdomain "/etc/squid/acls/zeus-dstdom.txt" acl zeus-dstdomreg dstdom_regex -i "/etc/squid/acls/zeus-dstdomreg.txt"
Les http_access fonctionnent un peu comme un firewall. Vous avez besoin de créer des hosts (192.168.1.xx) et des ports (80,81 …) considérez cela comme les acls. Maintenant vous allez créer des règles en prenant en compte les différents éléments déclarés dans les acls.
# interdit tous les accès vers ports ou des ports non définis http_access deny !std-ports !ssl-ports http_access deny CONNECT !ssl-ports # on interdit tous les domaines et ip listés par zeustracker http_access deny zeus-dst http_access deny zeus-dstdom http_access deny zeus-dstdomreg # Les réseaux ou ip dans la blacklist sont bloqués, le but est de ne pas faire de traitement inutiles http_access deny blacklist-src-ip # tout ce qui n'est pas dans la whitlist est bloqué aussi, cela indique implicitement # que seuls les réseaux ou ip déclarées dans la whitelist-src-ip peuvent accéder au proxy. # Cependant si on souhaite bloquer une ip dans une plage réseau on peu utiliser blacklist-src-ip http_access deny !whitelist-src-ip # si la source vient de localhost on autorise. En faite cela correspond à la demande de HAVP (voir schéma) http_access allow localhost # on autorise les users authentifiés http_access allow AUTH # on interdit tout le reste. Cette règle n'est pas forcément utile mais cela correspondre à la politique # on autorise ce que l'on souhaite et on bloque le reste http_access deny all # si la source vient de localhost, indirectement HAVP, on ne reboucle pas sur lui-même (voir schéma) cache_peer_access havp deny localhost # si la source vient de localhost, indirectement HAVP, on filtre pas avec squidguard redirector_access deny localhost
Voici un petit script que vous servira à ajouter des utilisateur pour une authentification de type digest.
#!/bin/bash
###############################
# Auteur : Alexandre Bray #
# Mail : abray@opendoc.net #
# Source : http://opendoc.net #
###############################
user=$1
pass=$2
realm="Proxy Server"
dst="/etc/squid/digest_password.txt"
if [ -z "$1" -o -z "$2" ] ; then
echo "Usage: $0 user password";
exit 1
fi
ha1=$(echo -n "$user:$realm:$pass"|md5sum |cut -f1 -d' ')
echo "$user:$realm:$ha1" >> "$dst"
Il est très simple à utiliser :
/etc/squid/digest_user.sh user pass
Voici les paramètres à insérer dans le fichier de configuration de Squid pour forcer l'authentification des users.
######## # Auth # ######## auth_param digest program /usr/lib/squid/digest_pw_auth -c /etc/squid/digest_password.txt auth_param digest children 5 auth_param digest realm OPS (Proxy Server) auth_param digest nonce_garbage_interval 5 minutes auth_param digest nonce_max_duration 30 minutes auth_param digest nonce_max_count 50
sudo apt-get install clamav clamav-docs clamav-freshclam clamav-daemon
Il n'y pas de configuration particulière
apt-get install havp
clamav:x:101:havp havp:x:102:clamav
/dev/sda2 /var reiserfs defaults,mand 0 2
Reportez vous au schéma pour mieux comprendre l'intégration d'HAVP. Certains paramètres sont à modifier suivant votre architecture.
USER havp GROUP havp DAEMON true PIDFILE /var/run/havp/havp.pid SERVERNUMBER 8 MAXSERVERS 50 USESYSLOG true SYSLOGNAME havp SYSLOGFACILITY daemon SYSLOGLEVEL info LOG_OKS false LOGLEVEL 1 TRANSPARENT false PARENTPROXY localhost PARENTPORT 3128 PORT 3129 BIND_ADDRESS 127.0.0.2 SOURCE_ADDRESS 127.0.0.2 TEMPLATEPATH /etc/havp/templates/fr/ WHITELISTFIRST true WHITELIST /etc/havp/whitelist BLACKLIST /etc/havp/blacklist FAILSCANERROR false SCANNERTIMEOUT 10 RANGE false SCANIMAGES true MAXSCANSIZE 10000000 KEEPBACKBUFFER 200000 KEEPBACKTIME 5 TRICKLING 30 STREAMUSERAGENT Player Winamp iTunes QuickTime Audio RMA/ MAD/ Foobar2000 XMMS STREAMSCANSIZE 20000 CLAMBLOCKENCRYPTED false CLAMBLOCKMAX false CLAMMAXFILES 200 CLAMMAXFILESIZE 10 CLAMMAXRECURSION 8 ENABLECLAMD true CLAMDSOCKET /var/run/clamav/clamd.ctl
Vous devez ajouter l'élément suivant dans le fichier de configuration de squid afin d'intégrer HAVP.
############## # Cache peer # ############## cache_peer 127.0.0.2 parent 3129 0 name=havp no-query no-digest connect-timeout=1
dbhome /var/lib/squidguard/db
logdir /var/log/squid
time workhours {
weekly mtwhf 00:00 - 23:59
date *-*-01 00:00 - 23:59
}
src users {
ip 0.0.0.0/0
}
destination adult {
urllist blacklists/adult/urls
domainlist blacklists/adult/domains
}
destination agressif {
urllist blacklists/agressif/urls
domainlist blacklists/agressif/domains
}
destination dangerous_material {
urllist blacklists/dangerous_material/urls
domainlist blacklists/dangerous_material/domains
}
destination drogue {
urllist blacklists/drogue/urls
domainlist blacklists/drogue/domains
}
destination hacking {
urllist blacklists/hacking/urls
domainlist blacklists/hacking/domains
}
destination phishing {
urllist blacklists/phishing/urls
domainlist blacklists/phishing/domains
}
destination publicite {
urllist blacklists/publicite/urls
domainlist blacklists/publicite/domains
#redirect http://127.0.0.1/bannerfilter/banner.gif
}
destination redirector {
urllist blacklists/redirector/urls
domainlist blacklists/redirector/domains
}
destination warez {
urllist blacklists/warez/urls
domainlist blacklists/warez/domains
}
destination sect {
urllist blacklists/sect/urls
domainlist blacklists/sect/domains
}
destination malware {
urllist blacklists/malware/urls
domainlist blacklists/malware/domains
}
destination remote-control {
domainlist blacklists/remote-control/domains
}
acl {
users {
pass !agressif !dangerous_material !drogue !hacking !phishing !publicite !redirector !warez !sect !malware !remote-control all
# redirect http://127.0.0.1/squidguard.html
redirect http://127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
}
default {
pass none
# redirect http://127.0.0.1/squidguard.html
redirect http://127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
}
}
Voici les éléments a ajouter à la configuration de squid afin d'utiliser squidguard.
############## # Squidguard # ############## redirect_program /usr/bin/squidGuard redirect_children 5
Afin de mettre à jour automatiquement vous SquidGuard, je vous propose cette solution :
Voici la liste qui est utilisée pour le script de mise à jour. Vous pouvez bien évidemment en ajouter. Cette liste s'appuie exclusivement sur les listes de l'université de Toulouse (listes utilisées dans Olféo).
ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/adult.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/agressif.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/dangerous_material.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/drogue.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/hacking.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/phishing.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/publicite.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/redirector.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/warez.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/sect.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/malware.tar.gz ftp://ftp.univ-tlse1.fr/pub/reseau/cache/squidguard_contrib/remote-control.tar.gz
Il est évident que ce script n'est pas bien difficile, cependant si vous avez un soucis vous pouvez le contacter directement.
#!/bin/bash ############################### # Auteur : Alexandre Bray # # Mail : abray@opendoc.net # # Source : http://opendoc.net # ############################### LIST=/etc/squid/squidguard/liste-cat.txt BLACKLISTS=/var/lib/squidguard/db/blacklists #on stop le service squid /etc/init.d/squid stop # suppression des répertoires cd $BLACKLISTS ls | while read line do rm -fr $line done # téléchargement des bases cat $LIST | while read line do curl -O $line done # suppression de gz ls | while read line do tar xvzf $line done rm $BLACKLISTS/*.gz # création des db /usr/bin/squidGuard -C all chown -R proxy:proxy $BLACKLISTS/* #on start le service /etc/init.d/squid start
Cela vous permettra de gagner un peu de temps.
L'intérêt du CGI est d'afficher une page informative lorsque vous accéder à un site bloqué.
Avant tout installer apache :
apt-get install apache2
cd /usr/share/doc/squidguard/examples gunzip squidGuard.cgi.gz
cp /usr/share/doc/squidguard/examples/squidGuard.cgi /usr/lib/cgi-bin/
Afin de vous faire gagner du temps vous pouvez télécharger un fichier préparé par opendoc.net.
tar xvzf squid-opendoc.tgz