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 : 90% completed
Vous souhaitez contribuer : Comment soutenir opendoc ?
Informations : Quelle est notre démarche ?
Licence : Contrat Creative Commons
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.

Comment réaliser une solution de filtrage de contenus avec Squid, Squiguard, HAVP et ClamAV ?

12 Présentation

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.

Les différents tests ont été réalisés sous une Debian Lenny. Cette documentation n'est pas valide pour la dernière version stable de debian (6) car le package HAVP est manquant. Dans l'immédiat, vous pouvez activer les dépôts SID seulement le temps de l'installation du package HAVP. Une solution vous sera proposée prochainement.

Alexandre

12.1 Schéma

12.2 Principe de fonctionnement

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

13 Squid

13.1 Présentation

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.

13.2 Paramétrage

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.

13.2.1 Paramètres serveur

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

13.2.2 Cache

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

13.2.3 Acl

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”

  • acl : syntaxe permettant de déclarer une acl
  • std-ports : nom de l'acl
  • port : de type port
  • /etc/squid/acls/std-ports.txt : indique le fichier contenant l'ensemble des ports (80, 21 …)

Le but de l'acl est de déclarer votre besoin.

13.2.4 Intégration de zeustracker pour les acls

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

13.2.4.1 scripts

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"
13.2.4.2 acls

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"

13.2.5 Https Access

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

13.3 Authentification de type digest

13.3.1 Script d'ajout

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

13.3.2 Intégration dans squid

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

14 Installation d'HAVP et ClamAV

14.1 Installation de ClamAV

 sudo apt-get install clamav clamav-docs clamav-freshclam clamav-daemon

Il n'y pas de configuration particulière

14.2 Installation HAVP

apt-get install havp
  • vous devez ajouter clam au group havp et havp au group clam
clamav:x:101:havp
havp:x:102:clamav
  • vous devez ajouter l'option “mand” pour votre montage /var
/dev/sda2       /var            reiserfs defaults,mand    0       2

15 Intégration de HAVP avec Squid

Reportez vous au schéma pour mieux comprendre l'intégration d'HAVP. Certains paramètres sont à modifier suivant votre architecture.

15.1 Fichier de configuration

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 

15.2 Intégration avec Squid

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 

16 Intégration de SquidGuard avec Squid

16.1 Fichier de configuration

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
  }
}

16.2 Intégration dans Squid

Voici les éléments a ajouter à la configuration de squid afin d'utiliser squidguard.

##############
# Squidguard #
##############
redirect_program /usr/bin/squidGuard
redirect_children 5

16.3 Mise à jour automatique

Afin de mettre à jour automatiquement vous SquidGuard, je vous propose cette solution :

16.3.1 Liste

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

16.3.2 Script

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.

16.4 Intégration du CGI SguidGuard avec Apache

L'intérêt du CGI est d'afficher une page informative lorsque vous accéder à un site bloqué.
Avant tout installer apache :

  • sur débian :
apt-get install apache2
  • toujours sous debian, rendez vous dans ”/usr/share/doc/squidguard/examples” et décompresser le cgi :
cd /usr/share/doc/squidguard/examples
gunzip squidGuard.cgi.gz
  • copier le CGI dans le répertoire de CGI d'Apache
cp /usr/share/doc/squidguard/examples/squidGuard.cgi /usr/lib/cgi-bin/ 

16.5 Intégration rapide par opendoc.net

Afin de vous faire gagner du temps vous pouvez télécharger un fichier préparé par opendoc.net.

  1. télécharger le fichier : squid-opendoc.tgz
  2. vérifier que le MD5 est identique à b780bc6b8b36ed96b45c06261070c2dc
  3. décompressez le fichier :
    tar xvzf squid-opendoc.tgz
  4. renommer votre répertoire squid d'origine
  5. copier le répertoire squid préparé par opendoc dans /etc/
  6. Amusez vous ! :D
solutions/comment-realiser-solution-filtrage-contenus-squid-squiguard-havp-clamav.txt · Dernière modification: 2013/07/14 17:19 (modification externe)
 
Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki