Vous êtes sur la page 1sur 13

Proxy authentifiant et filtrage

1 sur 13

http://wblitz.free.fr/contrib/proxy.html

Mise en place d'un proxy authentifiant


avec Squid et SquidGuard
Sommaire
1.
2.
3.
4.

But recherch
Principe de fonctionnement du syst
Installation
Configuration
1. Samba
1. Test d'authentification
2. MySQL
1. Compilation et installation
2. Configuration
3. Test d'authentification
3. Squid
5. Filtrage avec squidGuard
1. Base de donnes
2. Configuration de base
3. Configuration avance
1. Source
1. Rgles sur les ip ou les domaines
2. Rgles sur les utilisateurs
3. Rgles complexes
2. Dest
1. domainlist
2. urllist
3. expressionlist
4. Groupe global
3. Groupe de temps : time
4. Rgles de filtrage : acl
1. Redirection
2. Filtrage minimal requis
3. Filtrage par source
4. Filtrage avec plage horaire
4. Exemple complet de fichier squidGuard.conf avec la base de
donnees mondiale
5. Base de donnes statiques
6. Gestion des utilisateurs
7. Liens

But recherch
Cet article a pour but de vous aider dans la mise en place d'un serveur proxy
cache avec authentification des utilisateurs (pour des contraintes lgales
notamment) ainsi que la mise en place d'un systme de filtrage souple et
facilement configurable.
Pour cet article, nous nous baserons sur une authentification ralise au travers
d'un serveur Samba. Notez toutefois que ce serveur servira uniquement raliser
l'authentification des utilisateurs tentant d'accder l'internet.

Principe de fonctionnement du systme


Le fonctionnement gnral se fera comme suit. Dans tout cet article, nous
considrerons l'utilisateur Jean-Kevin, qui aura pour login 'jean-kevin' (oui, je fais
dans l'originalit ;)
Jean-Kevin lance son navigateur favori pour aller regarder ses emails sur
www.hotmail.com (bouh le vilain) Sa requte est transmise au serveur Squid qui
effectue une premire vrification :
la machine (envoyant la requte) fait-elle partie des sous rseaux autoriss ?
est-on dans la plage horaire autorise ?

09.04.2008 16:32

Proxy authentifiant et filtrage

2 sur 13

http://wblitz.free.fr/contrib/proxy.html

Si tout est correct, le serveur demande au navigateur de s'authentifier. Jean-Kevin


est alors invit entrer son login et son mot de passe dans la fentre de dialogue
propose. Les informations sont transmises au serveur qui les transmet au
programme d'authentification (dans notre cas smb_auth, mais nous y reviendrons
plus tard)
Deux cas sont possibles :
1. l'authentification choue et Jean-Kevin (aprs moults essais infructueux) se
voient redirigs vers une page lui indiquant qu'il doit s'authentifier pour
accder au net.
2. l'authentification est un succs et la demande de Jean-Kevin passe dsormais
dans le filtre (squidGuard)
L encore, diverses vrification sont effectues :
plage horaire
adresse ip
login fourni
Ensuite, on regarde les rgles de filtrage mise en place pour savoir si la requte
est autorise ou non. Jean-Kevin se voit alors redirig vers une page indiquant
que la page demande n'est pas accessible car interdite ou bien peut
tranquillement surfer.
Dans tous les cas, l'accs de Jean-Kevin aura t crit dans les journaux du
systme.

Installation
Sur la plupart des distributions, il existe un paquet pour ces deux outils.
Sous Ubuntu :
$ sudo apt-get install samba squid squidguard

Sous Gentoo :
# emerge samba squid squidguard

Configuration
Samba
Pour rpondre la question que certains se posent sans doute - pourquoi Samba
et pas LDAP par exemple - j'ai choisi Samba car les postes clients sont tous sous
Windows et qu'il n'est pas exclus un jour de mettre disposition un espace de
stockage sur le serveur (qui lui restera sous Linux) et que c'est la solution qui
m'a paru la plus adapte. C'est mon choix mais rien ne vous empche de
configurer un serveur LDAP si vous prfrez cette mthode d'authentification (ou
bien dveloppez vous-mme le programme d'authentification de votre choix ;)
La premire tape consiste paramtrer le serveur samba pour permettre
l'authentification des utilisateurs. Ci-dessous, un fichier de configuration
minimale avec quelques commentaires :
[global]
## le nom du groupe de travail
workgroup = MYDOMAIN
## le nom de votre serveur
server string = "SAMBA DOMAIN CONTROLER"
## nom des fichiers journaux, ici 'log.<adresse ip>
log file = /var/log/samba/log.%m
## taille maximale des logs
max log size = 5000
## niveau d'information dans les journaux
log level = 3
## machines autorises se connecter au serveur samba
# seul le serveur peut se connecter rellement
hosts allow = 127.0.0.1 <adresse ip du serveur>
security = user
## les mots de passe sont stocks en
crypt
encrypt passwords = yes
## indique si le serveur samba doit tre considr comme contrleur
# de domaine principal
# (ici je considre que oui puisque le niveau maximum d'un "vrai" windows est de 32)
local master = yes
os level = 33

09.04.2008 16:32

Proxy authentifiant et filtrage

3 sur 13

http://wblitz.free.fr/contrib/proxy.html

[NETLOGON]
comment = NETLOGON SHARE
## chemin vers le rpertoire
partag
path = /var/lib/samba/netlogon
## on interdit en criture
writable = no
## on autorise le parcours du rpertoire
browsable = yes
## on interdit l'accs anonyme (trs important, sinon tout le monde peut
# accder au net)
guest ok = no

Reste maintenant crer le rpertoire de partage NETLOGON. Cela va se faire trs


simplement :
# mkdir /var/lib/samba/netlogon
# chmod 755 /var/lib/samba/netlogon

Nous allons maintenant crer un unique fichier dans ce rpertoire. Ce fichier doit
contenir uniquement la ligne 'allow'. Ce fichier doit imprativement s'appeler
'proxyauth ' :
# echo allow > /var/lib/samba/netlogon/proxyauth
# chmod 644 /var/lib/samba/netlogon/proxyauth

Lancez alors la commande magique :


/etc/init.d/samba start

Test d'authentification
Nous allons prsent tester si l'authentification fonctionne. Pour cela, crons
un compte pour notre ami Jean-Kevin (entrez le mot de passe de votre choix
deux fois) :
# useradd -s /sbin/login jean-kevin
# smbpasswd -a jean-kevin
New SMB Password:
Retype new SMB password:
Added user jean-kevin
#

Vrifions que le compte est bien cr :


# grep jean-kevin /etc/samba/smbpasswd
jean-kevin:6000:E4F30DF20DEAAD3B435B51404EE:5D220DB0B7F14AA12CC3E47F7CA7:[U

]:

C'est bon, le compte existe (si vous ne voyez pas une ligne telle que ci-dessus,
il y a certainement eu une erreur ou alors votre fichier de mots de passe
samba est ailleurs). Maintenant, testons si le programme smb_auth nous
authentifie correctement :

# (echo jean-kevin <le mot de passe>) | /usr/lib/squid/smb_auth -U 127.0.0.1 -W MYDOMAI


OK

Si vous voyez 'ERR' et non 'OK', il y a un probl&egrav;me d'authentification.


Vrifiez bien que vous avez correctement entr le mot de passe, au besoin le
modifier avec la commande : smbpasswd jean-kevin.
Pensez bien mettre le nom du groupe que vous avez configur dans le fichier
smb.conf . Passons aux choses srieuses et configurons notre serveur proxy !

MySQL
Ayant galement ma disposition une base de donnes MySQL sur laquelle sont
stockes les informations des utilisateurs, j'ai galement test l'outil mysql_auth .
Vous trouverez la dernire version de cet outil ici. Dans mon cas personnel, j'ai
du modifier les sources afin de modifier la requte SQL qui ralise
l'authentification, ainsi que le Makefile pour le rpertoire d'installation. Mais
voyons tout cela en dtails.
Compilation et installation
Je me base sur la version 0.8 du projet. Placez-vous dans le rpertoire de
votre choix pour y dcompacter l'archive que vous venez de tlcharger. Nous
allons dans un premier temps diter le Makefile pour modifier le rpertoire
d'installation :

09.04.2008 16:32

Proxy authentifiant et filtrage

4 sur 13

http://wblitz.free.fr/contrib/proxy.html

CC = gcc
CFLAGS = -I/usr/local/include -L/usr/local/lib
LDFLAGS = -lmysqlclient
SRC = src
OBJS = $(SRC)/mysql_auth.o $(SRC)/confparser.o $(SRC)/mypasswd.o
INSTALL = /usr/bin/install
CONF = $(SRC)/mysql_auth.conf
UID = proxy
GID = proxy
all : mysql_auth mypasswd
clean:
rm -rf src/*.o *.o mysql_auth mypasswd
mysql_auth: $(OBJS)
$(CC) -o $@ $(SRC)/mysql_auth.c $(SRC)/confparser.c $(LDFLAGS) $(CFLAGS)
mypasswd: $(OBJS)
$(CC) -o $@ $(SRC)/mypasswd.c $(SRC)/confparser.c $(LDFLAGS) $(CFLAGS)
install:

$(INSTALL) -o ${UID} -g ${GID} -m 755 mysql_auth /usr/local/lib/squid/mysql_aut


$(INSTALL) -o ${UID} -g ${GID} -m 700 mypasswd /usr/local/lib/squid/mypasswd
$(INSTALL) -o ${UID} -g ${GID} -m 600 $(CONF) /usr/local/lib/squid/mysql_auth.c

Vous remarquerez l'utilisation de deux variables (UID et GID) pour la gestion


des droits sur les fichiers installs (c'est plus pratique si vous avez besoin de le
modifier) Le rpertoire d'installation n'existe peut-tre pas dans votre
arborescence. Pensez le crer :
$ sudo mkdir /usr/local/lib/squid

Nous allons maintenant faire un petit tour dans le rpertoire des sources. Tout
d'abord, le programme utilise par dfaut n'utilise pas le bon emplacement pour
le fichier de configuration. Editez donc le fichier src/define.h comme suit :
/*
* mysql_auth.conf - config file location and name
* example: /usr/local/squid/etc/mysql_auth.conf
*/
#define CONFIG_FILE "/usr/local/lib/squid/mysql_auth.conf"
...

Ensuite, vous pouvez suivre les instructions du site officiel pour installer la
base de donnes d'authentification et configurer votre nouvel outil. Sinon, pour
mon systme, j'ai galement du modifier le fichier mysql_auth.c de manire
modifier la requte d'authentification. La requte en question se trouve ligne
164. Il ne reste plus qu' compilez :
$ make

Avant de lancez l'installation (avec sudo make install), ditez le fichier de


configuration.
Configuration
Tout d'abord, copiez le fichier de configuration original :
$ cp src/mysql_auth.conf src/mysql_auth.conf.default

Le retour arrire sera ainsi plus facile. Vous aurez certainement modifier les
options :
user (nom d'utilisateur MySQL se connectant &agrav;e la base de donnes),
password (son mot de passe),
database (le nom de la base de donnes contenant les informations des
comptes des utilisateurs),
mysqld_socket (la scoket d'&eacoute;coute pour la connexion la base de
donnes),
table, user_column et password_column (le nom de la table interroger dans la
base de donnes, la colonne contenant le login de l'utilisateur et la colonne
contenant son mot de passe)
Si vous utilisez la fonction password() de MySQL pour chiffrer les mots de passe
contenu dans la base de donnes, positionnez galement l'option
encrypt_password_form YES.

09.04.2008 16:32

Proxy authentifiant et filtrage

5 sur 13

http://wblitz.free.fr/contrib/proxy.html

Test d'authentification
Il est maintenant temps de tester ! Ouvrez un shell et lancer la commande :
$ /usr/local/lib/squid/mysql_auth

Si vous obtenez un message d'erreur ou bien si le programme termine avant


que n'ayez pu taper quoique ce soit, jeter un oeil aux journaux systme (dans
/var/log/messages par dfaut) pour connatre l'ventuelle erreur qui survient.
Pour tester, entrez (sur la mme ligne) un nom d'utilisateur et son mot de
passe (non chiffr) et validez. Si tout fonctionne correctement, vous devez voir
apparatre le mot OK sur la ligne suivante :
$ /usr/local/lib/squid/mysql_auth
jean-kevin monmotdepasseamoi
OK
toto mauvaismotdepasse
ERR

Pour sortir du programme, utilisez CTRL-C.

Squid
Ci-dessous un exemple de fichier de configuration, avec les parties importantes
commentes :
## debug trs fournis... attention surveiller la taille du fichier cache.log
## dcommentez cette ligne pour activer ce mode
#debug_options ALL,1 28,9
## port d'coute, vous pouvez le modifier si vous le souhaitez
http_port 3128

## on interdit tout de suite (= avant tout autre filtrage) les cgi-bin et les command.bat
hierarchy_stoplist cgi-bin ?
hierarchy_stoplist command.bat ?
acl QUERY urlpath_regex cgi-bin\?
no_cache deny QUERY
cache_mem 16 MB
dns_timeout 45 seconds
## obligation pour les utilisateurs de s'authentifier
# commande d'authentification
auth_param basic program /usr/lib/squid/smb_auth -U 127.0.0.1 -W MYDOMAIN
# utilisez celle-ci dessous, en la dcommentant et en commentant celle ci-dessus,
# si vous souhaitez utiliser mysql_auth la place de samba
#auth_param basic program /usr/lib/squid/mysql_auth
auth_param basic realm "Entrez votre login et votre mot de passe"
# obligation des utilisateurs s'authentifier
acl Users proxy_auth REQUIRED
refresh_pattern ^ftp:
refresh_pattern ^gopher:
refresh_pattern .

1440
1440

20%
0%
0

10080
1440
20%

4320

## rgles d'accs ip
# un sous rseau
acl tartampion src 192.168.xxx.0/255.255.255.0
# une adresse particulire
acl trucmuche src 192.168.10.135
## laisser cette rgle
acl all src 0.0.0.0/0.0.0.0
## rgles d'accs horaire : ici, du lundi au vendredi de 8h 20h
acl working_hours time MTWHF 08:00-20:00
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
## dfintion des ports autoriss (attention bien les laisser ouvert sur le firewall
# en sortie galement)
acl Safe_ports port 80
# pour naviguer sur le web
acl Safe_ports port 443
# idem, mais pour les sites utilisant SSL
acl Safe_ports port 21
# pour les accs ftp
acl Safe_ports port 20
# idem

09.04.2008 16:32

Proxy authentifiant et filtrage

6 sur 13

http://wblitz.free.fr/contrib/proxy.html
acl Safe_ports port 873
acl Safe_ports port 1025-65535

# pour le protocole rsync


# ports dynamiques (penser faire du filtrage avec tat

## acl administratives
acl purge method PURGE
acl CONNECT method CONNECT
## utile pour bloquer skype :)
acl numerals urlpath_regex ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
## taille maximale des reponses : 15Mo
reply_body_max_size 15000KB allow tartampion trucmuche
## rgles d'accs
http_access allow
http_access allow
http_access allow
## on boque
http_access
http_access
http_access

administratives
manager localhost
purge localhost
localhost

en dehors des heures et les ports qui ne sont pas dfinis plus haut
deny !working_hours
deny !Safe_ports
deny CONNECT !Safe_ports

## accs administratif interdit sauf en local, comme indiqu par la rgle prcdente
http_access deny manager
http_access deny purge
## pour bloquer SKYPE... du moins pour le moment
http_access deny CONNECT numerals
## on autorise le sous rseau aux utilisateus authentifis
http_access allow tartampion Users
## on autorise l'adresse ip aux utilisateurs authentifis
http_access allow trucmuche Users
## on bloque tout le reste
http_access deny all
http_reply_access allow all
icp_access allow all
## filtrage des urls demandes
# programme de redirection
redirect_program /usr/bin/squidGuard -c /usr/local/lib/squidGuard/squidGuard.conf
# nombre de processus ralisant le filtrage
redirect_children 5

Le paramtre 'redirect_children ' est important. En effet, toutes les requtes


passant par le squid seront rediriges (sauf blocage avant d'atteindre la rgle)
vers le programme squidguard. Ce paramtre indique le nombre de processus
squidguard qui tourneront simultanment. Pensez donc bien le choisir.
S'il est trop faible, il y aura un fort ralentissment du traffic.
S'il est trop lev, la machine consommera beaucoup plus que ncessaire de
ressources.
Faites des tests pour dterminer le meilleur compromis !

Filtrage avec squidGuard


Bases de donnes
SquidGuard est un outil vous permettant d'effectuer un filtrage des urls visites
par les utilisateurs. Vous pouvez filtrer sur un domaine, une url particulire ou
bien sur une expression rgulire. Le tout est organis sous forme d'une "base
de donnes" ( ne pas prendre au sens littral du terme)
Il existe des bases de donnes prtes l'emploi. Vous pouvez par exemple en
tlcharger ici (maintenue par l'universit de Toulouse) ou ici (base mondiale)

Configuration de base
Vous pouvez placer le fichier de configuration o vous le souhaitez, pensez juste
modifier votre fichier 'squid.conf ' pour y indiquer le chemin correct vers le
fichier. La structure gnrale du fichier est la suivante :
ensemble de sources (ip, utilisateurs, les deux combins)
ensemble de destinations (les filtres)
rgles d'accs (acl)
Voici un exemple de fichier simpliste :

09.04.2008 16:32

Proxy authentifiant et filtrage

7 sur 13

http://wblitz.free.fr/contrib/proxy.html

## Repertoire accueillant les bases de donnees


dbhome /usr/local/lib/squidGuard/db
## Repertoire accueillant le fichier de log
logdir /var/log/squid
## les sites caractres pornographique
dest porn {
domainlist
base/porn/domains
urllist
base/porn/urls
}
## rgles d'accs
acl {
default {
pass !porn all
redirect http://localhost/block.html
}
}

Dans cette configuration on autorise l'accs tous les sites sous ceux dfinis
sous porn, depuis n'importe quel poste. Testons prsent que tout fonctionne.
Lancez le service squid :
# /etc/init.d/squid start

Si tout c'est bien pass, ouvrez votre navigateur favori et entrez les identifiants
de Jean-Kevin. Vous devriez pouvoir surfer ! Sinon, regardez dans les journaux
pour voir s'il n'y a pas d'erreur.
Nous allons prsent dtaill un peu plus chacune des diffrentes sections que
vous pourrez dfinit dans le fichier de configuration : source, dest, time et acl.

Configuration avance
Source
Rgles sur les ip ou les domaines

Les dfinitions de source permettent de dfinir des plages ou des listes


d'adresse ip ainsi que des listes de logins. Cela vous permet de faire une
gestion fine des filtres appliqus chaque source dfinie. Voyons les
diffrentes possibilits qui vous sont offertes.
Jean-Kevin travaille sur les machines 10.0.0.1 et 10.0.0.2 et nous souhaitons
donner l'accs au net depuis ces deux machines :
source jean-kevin {
ip
10.0.0.1 10.0.0.2
}

Vous pouvez prciser plusieurs ip sur une mme ligne ou bien crire n lignes
"ip <adresse ip>".
Jean-Kevin des collgues et nous savons que leur machine sont dans le
range d'ip 10.0.0.1 10.0.0.20 :
source range-jean-kevin {
ip
10.0.0.1-10.0.0.20
}

Finalement, vous souhaitez donner l'accs tous le sous rseau 10.0.0.0/24


:
source network-jean-kevin {
ip
10.0.0.0/24
}

Vous pouvez galement utiliser l'autre notation : 10.0.0.0/255.255.255.0 .


Si vous avez spcifi l'option 'log_fqdn' dans votre fichier de configuration
squid ('squid.conf ') et que le serveur DNS vous permet de faire une rsolution
inverse des adresses ip, vous pouvez galement utilisez l'option domain :
source domain-jean-kevin {
domain jean-kevin.com
}

Toutes les machines qui sont sur ce domaine seront intgres cette source.
Vous pouvez galement dporter la dfinition des adresses ip dans un fichier
ddi :

09.04.2008 16:32

Proxy authentifiant et filtrage

8 sur 13

http://wblitz.free.fr/contrib/proxy.html

source jean-kevin-ip-adresses {
iplist /usr/local/lib/squidGuard/config/jean-kevin.ips
}

Le fichier '/usr/local/lib/squidGuard/config/jean-kevin.ips ' contiendra alors


toutes les dfinitions de rseau, plages d'adresses et machines. Indiquez soit
le chemin absolu soit le chemin relatif depuis le rpertoire dfini par dbhome.
Par exemple, pour dfinir les machines 10.0.0.1, 10.0.0.2 et la plage
d'adresses 10.0.0.20-10.0.0.30, ce fichier contiendra les deux lignes
suivantes :
10.0.0.1 10.0.0.2
10.0.0.20-10.0.0.30

De mme pour l'option 'domain, il existe domainlist. Indiquez alors un


domaine par ligne du fichier correspondant.
N'oubliez pas de relancer le service squid chaque modification de votre
configuration :
# /etc/init.d/squid reload
Rgles sur les utilisateurs

Vous pouvez crer des groupes d'utilisateurs plutt que des groupes
d'adresse ip. Par exemple, Jean-Kevin et Bob seront des utilisateurs
privilgis et ne subiront pas le mme filtrage que les autres :
source privileged {
user jean-kevin bob
}

Vous pouvez indiquer plusieurs logins par ligne ou bien faire n lignes 'user
<user>', votre convenance. Vous pouvez galement prfrer la mthode
dcrite plus haut pour les ip :
source privileged {
userlist
}

/usr/local/lib/squidGuard/config/privileged.users

ou le fichier '/usr/local/lib/squidGuard/config/privileged.users ' contiendra les n


logins, un par ligne :
$ cat /usr/local/lib/squidGuard/config/privileged.users
jean-kevin
bob
$
Rgles complexes

Maintenant que nous avons vu les principales possibilits de 'source',


imaginons le cas suivant. Jean-Kevin doit pouvoir accder certains sites
sensibles sans que les autres utilisateurs en aient, eux, la possibilit. L o
les choses se compliquent, c'est que Jean-Kevin ne doit pouvoir accder
ces sites que depuis le poste (film en permance) 10.0.0.200 :
source jean-kevin-delicate {
ip
10.0.0.200
user
jean-kevin
}

Ainsi, nous avons dfini un groupe qui pourra servir autoriser (ou pas)
Jean-Kevin accder certains sites uniquement depuis la machine
10.0.0.200. Vous pouvez bien entendu utiliser plusieurs utilisateurs et ip
pour la dfinition de vos groupes. Vous pouvez galement utiliser les
directives 'iplist', 'userlist' et 'domainlist '. Bref, les possibilits sont presque
sans limite ( part celle de votre imagination peut-tre ;)
Dest
Il existe trois directives pour la cration des groupes de destination. Ce sont
ces groupes qui vont effectivement filtrer les url demandes par les
utilisateurs.
domainlist

Vous spcifiez un fichier contenant la liste des domaines - un par ligne contenus par cette destination. Par exemple, si vous avez un fichier

09.04.2008 16:32

Proxy authentifiant et filtrage

9 sur 13

http://wblitz.free.fr/contrib/proxy.html

contenant divers domaines pornographiques :


dest porn {
domainlist
}

porn.domains

Le fichier 'porn.domains ' (dans notre configuration) doit se trouver dans le


rpertoire dfini par 'dbhome' donc dans (ici) '/usr/local/lib/squidGuard/db '.
urllist

De la mme manire que prcdemment, vous pouvez spcifier une liste


d'adresses contenues par une destination :
dest porn {
urllist porn.urls
}

L aussi, une seule adresse par ligne. Attention cependant, si vous souhaitez
que l'adresse www.google.fr soit dans cette destination, le fichier porn.urls
devra contenir google.fr (si vous mettez www.google.fr, ce n'est pas pris en
compte, surement un bug)
expressionlist

Dernire possibilit, l'utilisation d'expressions rgulires. Pour ce faire :


dest porn {
expressionlist
}

porn.regexp

Je ne vais pas faire ici un cours sur les expressions rgulires, d'autres s'en
sont dj trs bien chargs (tapez expressions rgulires dans google ;) Je
vous donnerai seulement quelques expressions simples pour bloquer les
tlchargements de fichiers potentiellement dangereux :
fichiers excutables
fichiers excutables
fichiers excutables
la plupart des sites de blog

*.\.exe$
*.\.msi$
*.\.bin$
*.blog.*

Vous pouvez bien entendu utiliser des rgles bien plus complexes. N'oubliez
pas de mettre une seule expression par ligne du fichier. Gardez toujours
aussi en tte que les expressions rgulires sont gourmandes en ressources
au moment de la comparaison avec l'url demande : utilisez les on escient.
Groupe global

Vous pouvez utiliser une ou plusieurs de ces trois directives simultanment.


Par exemple, si vous avez un fichier d'adresses, un fichier de domaines et un
fichier d'expressions rgulires :
dest porn {
expressionlist
domainlist
urllist
}

porn.regexp
porn.domains
porn.urls

Votre groupe est constitu par l'ensembles des expressions du fichier


'porn.regexp ,' des domaines du fichier 'porn.domains 'et des adresses du fichier
'porn.urls '.
Groupe de temps : time
Vous avez galement la possibilit de dfinir des plages horaires. Cela
peut-tre pratique si vous souhaitez donner accs certains sites (ou autre)
seulement le midi par exemple (consultation de messagerie personnelle, etc)
Pour dfinir vos plages horaires, vous pouvez utilisez les directives weekly et
date. Les jours de la semaine sont abrgs de la manire suivante (bases sur
les noms anglais) :

s (Sunday) = dimanche, m (Monday) = lundi, t (Tuesday) = mardi, w (Wednesday) = mercred


h (tHursday) = jeudi, f (Friday) = vendredi, a (sAturday) = samed

Dfinissons donc les plages horaires pendant lesquelles Jean-Kevin (encore lui
;) est sens travailler : 8h30 - 12h30 et 14h-18h, sauf le vendredi o il
termine 17h (et oui, il n'a pas le droit de travailler 40 heures dans la

09.04.2008 16:32

Proxy authentifiant et filtrage

10 sur 13

http://wblitz.free.fr/contrib/proxy.html

semaine :)
time jean-kevin-working-hours {
weekly m 08:30-12:30 14:00-18:00
weekly t 08:30-12:30 14:00-18:00
weekly w 08:30-12:30 14:00-18:00
weekly h 08:30-12:30 14:00-18:00
weekly f 08:30-12:30 14:00-17:00
}

Jean-Kevin ne travaille pas le 1er mai ni Nol, on va donc dfinir un groupe


jours fris :
time holidays {
date
*.05.01 # tous les 1er Mai de chaque anne
date
*.25.12 # tous les 25 Dcembre de chaque ann
date
*.01.01 # tous les 1er de l'An
}

Rgles de filtrage : acl


Redirection

Une acl est constitue d'une source et de rgles appliquer en fonction d'une
ou plusieurs destination et d'une action de redirection. La redirection est
gnralement faite vers une page web accessible par le client sans passer
par le proxy (pensez donc bien configurer les navigateurs clients)
Comme vous avez peut-tre envie que vos utilisateurs aient un minimum
d'informations vous communiquer lorsqu'ils pensent dtecter une erreur de
filtrage, squidguard vous transmets diverses informations sur la requte qu'il
est en train de traiter :
%a contient l'adresse ip du client
%i contient l'identifiant du client ou l'adresse ip si aucun login n'a t
fourni
%n contient le domaine du client ou "unknown" s'il n'est pas disponible
%p contient toute la partie options d'une url (tout ce qui se trouve derrire
le premier caractre '&' rencontr)
%s contient l'identifiant du groupe 'source' auquel appartient le client, tel
que dfini dans le fichier de configuration
%t contient l'identifiant du premier groupe 'dest' pour lequel l'url
demande possde une correspondance
%u contient l'adresse demande, sans ses ventuelles options (cf %p)
Vous pouvez ainsi avoir crit un script qui traitera ces donnes :
redirect

http://www.foo.bar/blocked.php?user=%i&&url=%u&target=%t

Filtrage minimal requis

Il est dsormais temps de faire un tout de nos diffrentes petites parties !


Commenons par l'acl minimale autorisant tout traffic :
acl {
default {
pass
}

all

}
Filtrage par source

Nous avanons dsormais : seul la source 'tartampion ' peut accder au net,
toutes les autres sources sont bloques et rediriges :
acl {
# on indique pour quelle source on va appliquer les rgles
tartampion {
pass all
}
default {
pass none
redirect http://www.foo.bar/blocked.php?user=%i&&url=%u&target=%t
}
}

Compliquons encore un peu les choses. Nous souhaitons maintenant interdire

09.04.2008 16:32

Proxy authentifiant et filtrage

11 sur 13

http://wblitz.free.fr/contrib/proxy.html

les diffrents groupes 'dest' que nous avons crs pour le groupe source
'tartampion ', rediriger les demandes interdites et rediriger tous les autres
groupes :
acl {
tartampion {
pass
!porn all
redirect http://www.foo.bar/blocked.php?user=%i&&url=%u&target=%t
}
default {
pass none
redirect http://www.foo.bar/blocked.php?user=%i&&url=%u&target=%t
}
}

Ainsi, 'tartampion ' a accs tous les sites sauf ceux ayant une
correspondance avec les dfinitions (domaines, urls, expressions rgulires)
du groupe 'porn'. Le caractre '!' plac devant le nom d'un groupe revient
dire "tout sauf ce qui a une correspondance avec".
Notez bien que l'ordre dans lequel vous indiquez les groupes est
important. En effet, c'est la premire correspondance qui prime. Si vous
crivez :
'pass

all !porn'

toutes les requtes seront en ralit satisfaites et le filtrage souhait


inexistant. N'oubliez donc pas de placer la rgle 'all' en dernire position.
Filtrage avec plage horaire

Voici un exemple avec utilisation des plages horaires :


acl {
tartampion within jean-kevin-working-hours {
pass
!adv !tracker !porn all
redirect http://www.foo.bar/blocked.php?user=%i&&url=%u&target=%t
} else {
pass none
redirect http://www.foo.bar/nonworkinghours.html
}
default {
pass
!porn all
redirect http://www.foo.bar/blocked.php?user=%i&&url=%u&target=%t
}
}

Dans cette acl, nous indiquons que le groupe source 'tartampion ' peut accder
tous les sites web, l'exception de ceux correspondant aux groupes 'adv',
'tracker' et 'porn', pendant les heures dfinies dans la rgle 'time
jean-kevin-working-hours '. Si le groupe 'tartampion ' accde au net en dehors de
ces heures, il est redirig vers la page nonworkinghours.html . Tous les autres
groupes ont accs au net, l'exception des sites correspondant au groupe
'porn', avec redirection en cas d'adresse interdite.

Exemple complet de fichier squidGuard.conf avec la base de


donnees mondiale
Notez bien que pour crer vos propres fichiers de domaines, d'urls ou
d'expression rgulires, la seule contrainte est que ces fichiers soient accessibles
relativement au rpertoire 'dbhome' ou bien que vous indiquiez leur chemin
absolu.
# Rpertoire accueillant les bases de donnes
dbhome /usr/local/lib/squidGuard/db
# Rpertoire accueillant le fichier journal
logdir /var/log/squid
##########
### Dfinition des groupes
##########
# Administrateurs
source administrators {
# contient les logins des administrateurs

09.04.2008 16:32

Proxy authentifiant et filtrage

12 sur 13

http://wblitz.free.fr/contrib/proxy.html
userlist
/usr/local/lib/squidGuard/config/administrators.users
# contient les ip des machines des administrateurs
iplist
/usr/local/lib/squidGuard/config/administrators.ips
}
# Les profs : pas d'ip, ils n'ont pas de postes attitrs
source teachers {
userlist
/usr/local/lib/squidGuard/config/teachers.users
}
# Les sous-rseaux pour grer globalement les lves
source students {
# contient les diffrents sous-rseaux
iplist
/usr/local/lib/squidGuard/config/students.ips
}
###########
### Bases de donnes
###########
# Base de donnes auto : fournies par le fichier tlchargs
dest ads {
domainlist
base/ads/domains
urllist
base/ads/urls
}
dest aggressive {
domainlist
urllist
}
dest audio-video {
domainlist
urllist
}
dest drugs {
domainlist
urllist
}
dest gambling {
domainlist
urllist
}
dest hacking {
domainlist
urllist
}
dest mail {
domainlist
}
dest porn {
domainlist
urllist
}
dest proxy {
domainlist
urllist
}
dest violence {
domainlist
urllist
}
dest warez {
domainlist
urllist
}

base/aggressive/domains
base/aggressive/urls
base/audio-video/domains
base/audio-video/urls
base/drugs/domains
base/drugs/urls
base/gambling/domains
base/gambling/urls
base/hacking/domains
base/hacking/urls
base/mail/domains
base/porn/domains
base/porn/urls
base/proxy/domains
base/proxy/urls
base/violence/domains
base/violence/urls
base/warez/domains
base/warez/urls

# Base de donnes manuelles


dest manual_blocked { ## blacklist manuelle
domainlist
manual/blocked.domains
urllist
manual/blocked.urls
expressionlist manual/blocked.expressions
}
dest manual_auth { ## whitelist manuelle
domainlist
manual/auth.domains
urllist
manual/auth.urls
expressionlist manual/auth.expressions
}

09.04.2008 16:32

Proxy authentifiant et filtrage

13 sur 13

http://wblitz.free.fr/contrib/proxy.html

###########
# Rgles d'accs
###########
acl {
# Regles pour l'administrateur
administrators {
pass all
}

# Regles pour les profs


teacher {
# ne passez pas la ligne si vous fates un copier/coller
pass !ads !aggressive !audio-video !drugs !gambling !hacking !mail !porn
!proxy !violence !warez a
redirect http://<le serveur qui va bien>/blocked.php?user=%i&&url=%u&targ
}

# Regles pour les eleves


students {
# ne passez pas la ligne si vous fates un copier/coller
pass manual_auth !manual_blocked !ads !aggressive !audio-video !drugs !ga
!mail !porn !proxy !viole
redirect
http://<le serveur qui va bien>/blocked.php?user=%i&&url=
}

# Regles par defaut


default {
pass none
redirect http://<le serveur qui va bien>/blocked.php?user=%i&&url=%u&targ
}
}

Base de donnes statiques


Il peut vous tre utile de compiler vos diffrents fichiers constituant cette
base de donnes. En effet, chaque lancement de squid, les bases sont
compiles sous forme de table de hachage. Si votre base est stable, il est
intressant de ne pas recompiler les bases chaque lancement.
Pour ce faire, lancer la commande suivante en tant qu'utilisateur root - ou d'un
compte administratreur de la machine - (on suppose que l'utilsateur lanant
squid est l'utilisateur proxy) :

sudo -u proxy /usr/bin/squidGuard -d -c /usr/local/lib/squidGuard/squidGuard.conf -C all && /etc/

Gestion des utilisateurs


Il ne vous reste maintenant plus qu' crer les diffrents utilisateurs de votre
systme et tester. Pour ma part, j'utilise une interface "web maison" qui permet la
cration, la suppression et le blocage des comptes samba des utilisateurs.
N'hsitez pas laisser vos commentaires : wblitz 'at' free 'point' fr.

Liens
Page officielle du projet mysql_auth

09.04.2008 16:32

Vous aimerez peut-être aussi