Procédure/documentation d'installation et configuration
d'un serveur proxy filtrant
SQUID/SQUIDGUARD
Sous GNU/Debian Linux et sous Windows
Stéphane JOLY/tatane <sjolye@club-internet.fr>
Adrien STUTZMANN <Adrien.Stutzmann@inpl-nancy.fr>
vous trouverez ce document section articles sur
http://tatane-on-xbox.homelinux.org/~live
Le 13 mai 2006
1.1/ Présentation
« Squid » est un proxy cache applicatif (serveur mandataire), couplé à « SquidGuard » qui est un logiciel redirecteur, ils permettent surtout de faire du contrôle d 'accès avancé, mais aussi du cache.
Squid, principal composant de ce système, assure les fonctions de :
cache, pour optimiser la bande passante,
authentification des utilisateurs, nous en verrons une simpliste,
filtrage d'accès "basique", mais déjà intéressant,
partage de connexion à internet.
SquidGuard propose un filtrage puissant d'accès au web, en fonction :
de groupes d'utilisateurs, définis de diverses manières,
de listes de domaines et d'URI qui serviront à définir soit des cibles autorisées, soit des cibles interdites,
de listes de domaines et d'URI qui ne serviront qu'à interdire l'accès aux cibles spécifiées,
de plages horaires pendant lesquelles l'accès sera autorisé ou interdit.
1.2/ Objectif
Le but de cette procédure/documentation est de développer le déroulement de l'installation d'un proxy cache applicatif pour une entreprise « type ». Le serveur mandataire (proxy), doit filtrer les accès à internet pour les protocoles HTTP, FTP et SSL.
Trois cas d'utilisations sont développés :
Cas 1, tous les accès sur le web sont totalement refusés. Dans ce cas l'utilisateur est redirigé vers le serveur web de l'intranet qui lui dit qu'il n'a pas accès à internet.
Cas 2, quelques accès sont autorisés pour l'utilisateur. S'il consulte une page qui ne fait pas partie de sa liste, il est redirigé vers le serveur web de l'intranet qui lui dit qu'il n'a pas accès à cette URI. S'il tente d'accéder à des sites qui font partis d'une liste noire, un message d'avertissement apparaît (par les serveurs web de l'entreprise)
Cas 3, tous les accès sont autorisés sauf ceux qui font parti de la liste noire. De la même manière que le deuxième cas, s'il tente d'accéder à des sites qui font parti d'une liste noire, un message d'avertissement apparaît.
On suppose que le système d'exploitation est fonctionnel, ce qui implique que le réseau fonctionne correctement. Pour notre procédure nous allons prendre l'exemple d'un réseau simple comme l'illustre la figure ci dessous.
Le réseau de notre exemple à un idNet 192.168.1.0/24 avec un modem adsl connecté à internet suivit d'un pare-feux/routeur et d'un réseau local muni de quelques stations clientes et d'un serveur HTTP. Le routeur s'appel « routeur », le routeur héberge le proxy, le serveur HTTP s'appelle « apache » et les stations du réseau local machine_01, machine_02 etc.
2/ Procédure pour Gnu/Debian Linux
2.1/ Plate-forme
Cette installation d'un serveur mandataire « Squid+SquidGuard » a été faite sur une distribution « Gnu/Debian Linux i386 sarge ». Squid est dans la version 2.5.9, et squidguard en 1.2.0
2.2/ Squid
Installation de « Squid » :
Connectez-vous à travers ssh par exemple sur la machine qui va héberger le serveur proxy « Squid » (dans notre exemple le routeur/pare-feux) et lancer les commandes ci dessous sur lignées en jaune.
routeur:~# apt-get install squid Lecture des listes de paquets... Fait Construction de l'arbre des dépendances... Fait Les paquets supplémentaires suivants seront installés : squid-common Paquets suggérés : squidclient squid-cgi logcheck-database resolvconf Les NOUVEAUX paquets suivants seront installés : squid squid-common 0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour. Il est nécessaire de prendre 963ko dans les archives. Après dépaquetage, 6005ko d'espace disque supplémentaires seront utilisés. Souhaitez-vous continuer ? [O/n] O Réception de : 1 http://ftp.at.debian.org stable/main squid-common 2.5.9-10sarge2 [195kB] Réception de : 2 http://ftp.at.debian.org stable/main squid 2.5.9-10sarge2 [768kB] 963ko réceptionnés en 2s (390ko/s) Préconfiguration des paquets ... Sélection du paquet squid-common précédemment désélectionné. (Lecture de la base de données... 43136 fichiers et répertoires déjà installés.) Dépaquetage de squid-common (à partir de .../squid-common_2.5.9-10sarge2_all.deb) ... Sélection du paquet squid précédemment désélectionné. Dépaquetage de squid (à partir de .../squid_2.5.9-10sarge2_i386.deb) ... Paramétrage de squid-common (2.5.9-10sarge2) ... Paramétrage de squid (2.5.9-10sarge2) ... Creating squid spool directory structure 2006/03/30 19:28:43| Creating Swap Directories Starting proxy server: squid. routeur:~#
Test si « Squid» est à l'écoute :
user@machine_01:~$ nmap routeur Starting Nmap 4.00 ( http://www.insecure.org/nmap/ ) at 2006-03-30 19:32 CEST Interesting ports on routeur (192.168.1.20): (The 1666 ports scanned but not shown below are in state: closed) PORT STATE SERVICE 22/tcp open ssh 111/tcp open rpcbind 113/tcp open auth 3128/tcp open squid-http Nmap finished: 1 IP address (1 host up) scanned in 1.952 seconds
On voit que « squid » est à l'écoute sur le port tcp 3128 (ligne orange). Ensuite, on configure un client HTTP pour voir si le proxy fonctionne.
Test avec un navigateur web :
(Exemple avec Mozilla-Firefox)
Configuration des navigateurs sur les postes clients :
Aller dans Edition/Préférences, une fenêtre s'ouvre à l 'image de celle qui est représentée juste après.
Cliquer ensuite sur Paramètres de connexion... la fenêtre ci-dessous s'ouvre.
Cliquer sur configuration manuelle du proxy, entrer le nom ou @ip du serveur où est installé « Squid », et le port où écoute le proxy dans notre cas 3128. Vous pouvez éventuellement cliquer sur « Utiliser le même proxy pour tous les protocoles ».
Maintenant on lance une requête HTTP vers le web http://www.google.fr
On obtient bien évidement le même résultat avec d'autres requête tel que FTP etc. Donc le proxy fonctionne correctement mais ne nous autorise pas à nous connecter sur le net.
Configuration de « Squid » :
Editer le fichier de configuration de « Squid » /etc/squid/squid.conf avec votre éditeur préféré et rechercher la ligne # TAG: visible_hostname . Juste après et en dessous de #none mettre le nom du proxy pour permettre à « Squid » de renvoyer un nom de machine correct lors des messages d 'erreurs.
Par exemple :
#Default:
# none
visible_hostname proxy_mon_entreprise
Ensuite nous allons configurer l'adresse de messagerie du responsable du serveur, pour cela dans le même fichier rechercher la ligne # TAG: cache_mgr .
Juste après cette ligne et en dessous de # cache_mgr webmaster mettre l'adresse du responsable de l'administration du serveur :
# cache_mgr webmaster
cache_mgr administratreur@mon_entreprise
Maintenant que le nom du proxy et l'adresse de courriel de l'administrateur sont configurés, nous allons autoriser une machine de notre réseau local à se connecter vers internet. Pour cela nous devons configurer une acl (Liste de contrôle d'accès)
Exemple pour une machine qui possède l'adresse ip 192.168.1.11 :
Dans le fichier de configuration de « Squid » rechercher la ligne acl to_localhost dst 127.0.0.0/8
et juste en dessous créer une acl pour cette machine :
acl to_localhost dst 127.0.0.0/8
acl ordinateur_01 src ordinateur_01
Ensuite rechercher la ligne http_access allow localhost
Afin d'autoriser l'ordinateur_01 à se connecter à « Squid », juste en dessous de http_access allow localhost mettre :
http_access allow localhost
http_access allow ordinateur_01
Pour rendre effectif toutes ces modifications relancer le service « Squid » :
routeur:/etc/squid# invoke-rc.d squid restart
Restarting proxy server: (waiting....done) squid.
routeur:/etc/squid#
Lancer une requête depuis cette machine (ordinateur_01), l'accès à internet doit fonctionner !
Si vous ne souhaitez pas entrer toutes les machines de votre réseau une à une, vous pouvez autoriser la totalité de votre réseaux local à accéder à internet par le proxy « squid ».
A la place de acl ordinateur_01 src ordinateur_01 , mettre tout votre réseau :
acl mon_lan src 192.168.1.0/24
et à la place de http_access allow ordinateur_01 mettre :
http_access allow mon_lan
Finalement relancer « Squid », faite des tests.
Méthodes d'authentifications :
Il existe plusieurs méthode pour authentifier des utilisateurs, nous avons vu l'authentification par IP(s), c'est une méthode qui n'est pas sure. En effet, un utilisateur A peut très bien utiliser la machine d'un utilisateur B, et ainsi bénéficier des droits d'accès à internet de l'utilisateur B.
Parmi les méthode les plus intéressantes, nous pouvons citer :
ldap_auth, qui permet d'authentifier les utilisateurs depuis un annuaire LDAP (si vous maîtrisez déjà LDAP),
smb_auth, qui permet d'utiliser un contrôleur de domaine Windows NT.
ncsa_auth, qui utilise un fichier d'utilisateurs local.
Méthode simple avec ncsa_auth :
Cette méthode utilise un fichier d'authentification. Connectez-vous avec les droits super-utilisateur (root) au serveur qui héberge « Squid », nous allons créer deux utilisateurs (user_01 et user_02).
routeur:~# cd /etc/squid/ routeur:/etc/squid# routeur:/etc/squid# ls squid.conf routeur:/etc/squid# touch users routeur:/etc/squid# ls squid.conf users routeur:/etc/squid# htpasswd -b users user_01 user_01 Adding password for user user_01 routeur:/etc/squid# htpasswd -b users user_02 user_02 Adding password for user user_02 routeur:/etc/squid# cat users user_01:3dn4YnJkWR93w user_02:GHNwGkxpx5AQc routeur:/etc/squid#
Dans cette exemple, nous avons ajouté deux utilisateurs dans le fichier /etc/squid/users, grace à la commande :
/usr/bin/htpasswd -b /etc/squid/users « utilisateur » « mot de passe utilisateur »
Le fichier « users » contient au final, les noms des utilisateurs avec leur mot de passe codé en MD5, dans notre cas le mot de passe est identique au compte utilisateur.
Nous allons vérifier à présent le fonctionnement de l'authentification grâce à ncsa_auth. Pour ce faire faite ainsi :
(pour sortir de la boucle faite un ctrl-c)
routeur:/etc/squid# /usr/lib/squid/ncsa_auth /etc/squid/users tatane bien_les_cours ERR user_01 toto ERR user_01 user_01 OK user_02 user_02 OK routeur:/etc/squid#
Important! Pour que l'authentification fonctionne correctement, il est indispensable de commenter ou supprimer l'authentification par ip.
Editer le fichier de configuration de « squid », rechercher la ligne acl CONNECT method CONNECT
, juste en dessous ajouter la ligne :
acl CONNECT method CONNECT # Demandel'authentification des utilisateurs acl Users proxy_auth REQUIRED
En dessous de la ligne http_access allow localhost ajouter :
http_access allow localhost http_access allow Users
Ensuite rechercher la ligne #auth_param basic casesensitive off, et en dessous ajouter les lignes suivantes :
#auth_param basic casesensitive off auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/users auth_param basic children 5 auth_param basic realm Identification utilisateur auth_param basic credentialsttl 2 hours auth_param basic casesensitive on
Finalement redémarrer le service Squid :
routeur:/etc/squid# invoke-rc.d squid restart
Restarting proxy server: (waiting....done) squid.
routeur:/etc/squid#
Faite des tests ça doit fonctionner!
Capture d'écran
Méthode d'authentification avec ldap :
Il existe deux binaires pour authentifier des utilisateurs avec ldap, qui sont ldap_auth et squid_ldap_group. Ces 2 binaires sont placés dans le répertoire /usr/lib/squid, ldap_auth permet l'authentification d'utilisateurs, tandis que le second vérifie l'appartenance d'un utilisateur à un groupe. Dans les deux cas les fonctions renvoient « OK » pour la positive et « ERR » pour la négative.
Pour modéliser notre entreprise, un groupe enseignants est crée avec l'uid de l'enseignant. Nous allons des utilisateurs de notre année d'étude au CNAM appartement tous au groupe auditeurs et des utilisateurs inventés pour le groupe élèves.
La racine du serveur ldap choisie est dc=cnam, dc=fr
dc=cnam, dc=fr cn=admin, dc=cnam, dc=fr ou=Peoples,dc=cnam, dc=fr uid=user001 uid=user002 uid=user..... ou=Groups,dc=cnam, dc=fr cn=enseignants cn=auditeurs cn=eleves
Les utilisateurs (Peoples) sont des objets de type « inetOrgPerson », les groups (Groups) quand à eux sont de type « groupOfUniqueNames »
L'installation du serveur ldap ne sera pas évoqué dans cette procédure, mais les fichiers de configuration et ldif propre à notre configuration sont listés dans l'annexe.
Capture d'écran de notre annuaire avec ldap Browser java
Nous allons dans la suite, autoriser les utilisateurs du groupe enseignants et du groupe auditeurs a accéder au cache mais pas les élèves. Dans notre cas le serveur ldap est configuré et fonctionnel sur le routeur.
Rechercher la ligne #auth_param basic casesensitive off, et adapter les lignes suivantes à votre configuration :
#auth_param basic casesensitive off auth_param basic program /usr/lib/squid/ldap_auth -b "dc=cnam,dc=fr" -D "cn=admin,dc=cnam,dc=fr" -w "azerty" -h 127.0.0.1 -p 389 -u uid -f "uid=%s" auth_param basic children 5 auth_param basic realm Identification utilisateur! auth_param basic credentialsttl 2 hours auth_param basic casesensitive on
Après avoir configuré l'authentification des utilisateur grace à ldap, nous allons vérifier l'appartenance d'un utilisateur à un groupe. Pour cela rechercher dans le fichier de configuration de squid la ligne # TAG: external_acl_type après quelques lignes vous devriez trouver les deux lignes suivantes :
#Default: # none
Juste après ces lignes ajouter celle-ci:
#Default:
# none
external_acl_type ldap_group ttl=3600 %LOGIN /usr/lib/squid/squid_ldap_group -b "ou=Groups,dc=cnam,dc=fr" -B "ou=Peoples,dc=cnam,dc=fr" -f "(&(cn=%g)(objectClass=groupOfUniqueNames)(uniqueMember=%u))" -F "(&(sn=%s)(objectClass=inetOrgPerson))" -h 127.0.0.1 -p 389
Ensuite, il ne reste plus cas réaliser les acls, rechercher la ligne acl to_localhost dst 127.0.0.0/8 et ajouter :
acl to_localhost dst 127.0.0.0/8 acl group_ldap_auditeurs external ldap_group auditeurs acl group_ldap_enseignants external ldap_group enseignants
Finalement, dans ce même fichier rechercher la ligne #http_access allow our_networks , et ajouter en dessous les autorisations suivantes :
#http_access allow our_networks http_access allow group_ldap_enseignants http_access allow group_ldap_auditeurs
Pour finir vous pouvez relancer squid vous devriez obtenir la même fenêtre d'authentification qu'avec la méthode ncsa_auth.
routeur:/etc/squid# invoke-rc.d squid restart
Restarting proxy server: (waiting....done) squid.
routeur:/etc/squid#
Autres contrôles d'accès
Les contrôles d'accès sont réalisés avec des acl, dans les exemples qui vont suivre nous allons faire des restrictions d'accès au cache pour des protocoles, pour certaines plages horaires mais aussi à certains types de fichiers. Pour que les modifications soient prises en comptes, il est nécessaire de redémarrer le serveur proxy cache(invoke-rc.d squid restart).
Exemple de restriction par protocoles(FTP)
En dessous de la ligne acl CONNECT method CONNECT ajouter :
acl CONNECT method CONNECT
# interdit l'utilisation du protocole FTP
acl protocole_ftp proto FTP
et juste après #http_access allow our_networks ajouter :
#http_access allow our_networks
http_access deny protocole_ftp
Exemple de restriction horaire on suppose que l'entreprise travaille de 7H00 à 19H00 du lundi au vendredi
En dessous de la ligne acl CONNECT method CONNECT ajouter :
acl CONNECT method CONNECT # Autorise l'accès au cache de 7h à 19h
acl horaire time M-F 07:00-19:00
# Refuse l'accès au cache de 0h à 6h59
acl hors_horaire1 time MTWHF 00:00-06:59
# Refuse l'accès au cache de 19h01 à 23h59
acl hors_horaire2 time MTWHF 19:01-23:59
# Refuse l'accès au cache du samedi au dimanche.
acl week_end time A-S
et juste après #http_access allow our_networks ajouter :
#http_acces allow our_networks http_access allow horaire http_access deny hors_horaire1 http_access deny hors_horaire2 http_access deny week_end
Exemple de contrôle d'accès au cache pour certaines extensions de fichiers
En dessous de la ligne acl CONNECT method CONNECT ajouter :
(exemple pour les mp3 et les fichiers avi)
acl CONNECT method CONNECT # Interdit l'accès au fichiers mp3 et avi acl url_mp3 url_regex -i \.mp3$ acl url_avi url_regex -i \.avi$
puis juste après #http_access allow our_networks ajouter :
#http_acces allow our_networks http_access deny url_mp3 http_access deny url_avi
Exemple de contrôle d'accès au cache pour des sites à caractère pornographique
En dessous de la ligne acl CONNECT method CONNECT ajouter :
acl CONNECT method CONNECT # Interdit l'accès à des sites à caractère pornographique acl sites_sex url_regex -i "/etc/squid/sites_sex.txt"
Puis juste après #http_access allow our_networks ajouter :
#http_acces allow our_networks
http_access deny sites_sex
Il faut créer un fichier /etc/squid/sites_sex.txt sous la forme :
# Fichier de sites a caractère pornographique .microsoft.com .msn.com
2.3/ SquidGuard
« SquidGuard » est complémentaire à « Squid », c'est un redirecteur qui va permettre d'analyser les requêtes et de les comparer avec des listes noires « chastity-list ». Les listes noires contiennent des URL ou @IP à caractère pornographique, violent etc.
Installation de « SquidGuard et chastity-list »
Connectez-vous sur le routeur et lancer l'installation des applications comme ci-dessous.
routeur:~# apt-get install squidguard chastity-list Lecture des listes de paquets... Fait Construction de l'arbre des dépendances... Fait Les NOUVEAUX paquets suivants seront installés : chastity-list squidguard 0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour. Il est nécessaire de prendre 936ko dans les archives. Après dépaquetage, 3867ko d'espace disque supplémentaires seront utilisés. Réception de : 1 http://ftp.at.debian.org stable/main squidguard 1.2.0-5 [132kB] Réception de : 2 http://ftp.at.debian.org stable/main chastity-list 0.5.20020928-8.1 [804kB] 936ko réceptionnés en 1s (578ko/s) Préconfiguration des paquets ... Sélection du paquet squidguard précédemment désélectionné. (Lecture de la base de données... 44424 fichiers et répertoires déjà installés.) Dépaquetage de squidguard (à partir de .../squidguard_1.2.0-5_i386.deb) ... Sélection du paquet chastity-list précédemment désélectionné. Dépaquetage de chastity-list (à partir de .../chastity-list_0.5.20020928-8.1_all.deb) ... Paramétrage de squidguard (1.2.0-5) ... Double checking directory and file permissions...done! Re-building SquidGuard db files...done! Reloading Squid...done! Paramétrage de chastity-list (0.5.20020928-8.1) ... Double checking directory and file permissions...done! Re-building Chastity SquidGuard db files...done! Reloading Squid...done! routeur:~#
Pendant cette phase d'installation, au moment de la préconfiguration des paquets, 3 fenêtres de Shell graphique s'ouvrent pour vous poser quelques questions, prendre les valeurs par défaut(appuyer sur entrée). Après cette étape il faut renseigner « Squid » pour qu'il utilise « SquidGuard ». Pour cela éditer le fichier de configuration de « Squid » et ajouter à la fin du fichier les lignes suivantes :
# Redirection de Squid vers SquidGuard redirect_program /usr/bin/squidGuard redirect_children 4
Copier ensuite le fichier squidGuard-chastity.conf dans le répertoire de « Squid » sous le nom de squidguard.conf pour qu'il soit reconnu par « Squid »
routeur:~# cp /etc/chastity/squidGuard-chastity.conf /etc/squid/squidGuard.conf routeur:~#
Ensuite copier le script cgi exemple dans /usr/lib/cgi-bin/ de la manière suivante, décompresser le fichier et le rendre exécutable :
routeur:~# cp /usr/share/doc/squidguard/examples/squidGuard.cgi.gz /usr/lib/cgi-bin/ routeur:~# gzip -d /usr/lib/cgi-bin/squidGuard.cgi.gz routeur:~# chmod +x /usr/lib/cgi-bin/squidGuard.cgi
Redémarrer le proxy-cache
routeur:~# invoke-rc.d squid restart
Restarting proxy server: (waiting....done) squid.
routeur:~#
Important! Pour arriver à un résultat concluant, un serveur HTTP doit tourner sur le routeur.(par exemple apache)
Consulter une page depuis un client web, par exemple http://www.playboy.com si le navigateur est configuré pour la langue Française vous devriez obtenir le message suivant :
Ajout d'URL avec chastity-list
l'intérêt des chastity-list pour un administrateur réseau, c'est la souplesse avec laquelle il est possible d'ajouter ou de supprimer des url.
Par exemple, nous souhaitons blacklister le site de chez microsoft pour qu'il soit dans les domaines de type « adulte ». Pour réaliser cela, connectez-vous sur le serveur où est installé squid et éditer le fichier /etc/chastisty/diffs/adult/domains.diff
Dans ce fichier qui est vide par défaut, on peu lire :
= Customization file for chastity database = Please items to be added or deleted below. = preceeding each line with a "+" for addition or "-" for deletion.
Ce qui veux dire que pour ajouter un domaine interdit, nous devons précéder le domaine du signe « + ».
Ce qui donne dans notre cas :
= Customization file for chastity database
= Please items to be added or deleted below.
= preceeding each line with a "+" for addition or "-" for deletion.
+ microsoft.com
L'ajout ou la suppression de domaines et ou url dans chastity nécessite une reconstruction de la base de données.
Faite comme ceci :
routeur:~# dpkg-reconfigure chastity-list
Une fenêtre bash graphique s'ouvre pour vous prévenir que le serveur est en production et que cette manipulation utilise beaucoup de ressources. L'outil de configuration de Debian demande s'il faut reconstruire la liste noire de Chastity après l'installation, répondre par oui.
routeur:~# dpkg-reconfigure chastity-list
Double checking directory and file permissions...done!
Re-building Chastity SquidGuard db files...done!
Reloading Squid...done!
routeur:~#
Pour autoriser un domaine qui est « blacklisté », éditer le fichier domains.diff correspondant à son type, par exemple pour le domaine de type adulte de chez playboy.com éditer le même fichier où nous avons déjà ajouté microsoft.com et faire suivre de - playboy.com
= Customization file for chastity database = Please items to be added or deleted below. = preceeding each line with a "+" for addition or "-" for deletion. + microsoft.com - playboy.com
Reconfigurer à nouveau la base de données de chastity. A présent le domain playboy.com n'est plus considéré comme étant de type adulte, et de ce fait il n'est plus bloqué par squid.
Par défaut chastity-list possède les types de blacklist suivant :
routeur:~# ls -l /var/lib/chastity/
total 56
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 ads
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 adult
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 aggressive
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 audio-video
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 drugs
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 forums
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 gambling
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 hacking
drwxr-xr-x 2 proxy proxy 4096 2006-05-11 22:40 mail
drwxr-xr-x 2 proxy proxy 4096 2006-05-11 22:40 proxy
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 redirector
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 violence
drwxr-xr-x 2 proxy proxy 4096 2006-05-30 20:54 warez
routeur:~#
Nous allons ajouter un type personnel de domain/url, ce qui nous permettra par la suite de tout interdire à un groupe de personne, et d'autoriser quelques sites ou domaines.
On considère que nous sommes toujours sur la machine routeur, passer sous l'identité proxy pour faire les manipulations qui suivent.
routeur:~# su proxy routeur:/root$ cd routeur:~$ echo $USER proxy routeur:~$
Ensuite nous allons créer les répertoires et les fichiers nécessaires.
routeur :~$ mkdir /etc/chastity/diff/personnel routeur :~$ cp /etc/chastity/diff/ads/* /etc/chastity/diff/personnel/ routeur :~$ mkdir /var/lib/chastity/personnel routeur :~$ touch /var/lib/chastity/personnel/urls routeur :~$ touch /var/lib/chastity/personnel/domains routeur :~$ ln -s /etc/chastity/diffs/personnel/* /var/lib/chastity/personnel/ routeur :~$ ls -l /var/lib/chastity/personnel/ total 0 -rw-r--r-- 1 proxy proxy 0 2006-05-30 21:47 domains lrwxrwxrwx 1 proxy proxy 42 2006-05-30 21:47 domains.diff -> /etc/chastity/diffs/personnel/domains.diff -rw-r--r-- 1 proxy proxy 0 2006-05-30 21:47 urls lrwxrwxrwx 1 proxy proxy 39 2006-05-30 21:47 urls.diff -> /etc/chastity/diffs/personnel/urls.diff router :~$
Nous allons mettre dans le fichier /var/lib/chastity/personnel/domains les domaines google.fr, microsoft.com, debian.org, linuxfr.org et linuxgraphic.
Faite cette opération comme ceci :
routeur:~$ echo "google.fr" > /var/lib/chastity/personnel/domains routeur:~$ echo "microsoft.com" >> /var/lib/chastity/personnel/domains routeur:~$ echo "debian.org" >> /var/lib/chastity/personnel/domains routeur:~$ echo "linuxfr.org" >> /var/lib/chastity/personnel/domains routeur:~$ echo "linuxgraphic.org" >> /var/lib/chastity/personnel/domains routeur:~$ cat /var/lib/chastity/personnel/domains google.fr microsoft.com debian.org linuxfr.org linuxgraphic.org routeur:~$ exit routeur:~# invoke-rc.d squid restart Restarting proxy server: (waiting..................done) squid. routeur:~#
A présent les domaines google.fr, microsoft.com, debian.org, linuxfr.org et linuxgraphic sont blacklistés donc ne sont plus accessibles.
remarque : Il n'est pas nécessaire de refaire la base de chastity-list, relancer juste squid.
Personnaliser SquidGuard
Nous considérons que l'authentification des utilisateurs est faite, nous allons créer les trois profils recherchés ou trois groupes si vous préférez, dans notre exemple nous allons prendre :
Elèves->eleves
Auditeurs->auditeurs
Enseignants->enseignants
Passe par tout->passe_par-tout
Pour mémoire, le premier profil ou cas 1 ne doit pas aller sur internet mais seulement sur l'intranet. Ce profil n'a pas besoin d'être créé car les navigateurs (clients http) ne passent pas par le proxy-cache pour aller sur l'intranet de l'entreprise (dans notre cas le CNAM). Le cas 2, il ne doit accéder qu'a quelques domaines/Urls prédéterminés, ce cas sera appliqué aux auditeurs. Le cas 3, qui a accès à tout internet mais pas aux sites référencés dans les blacks-list (chastity-list). Pour couronner le tout, nous avons ajouté un profil supplémentaire qui possède tous les droits.
Pour cela, éditer avec votre éditeur préféré le fichier de configuration de SquidGUARD qui est dans le répertoire de Squid (/etc/squid/squiguard.conf) , et créer des sources (src) correspondant au profil recherché. Attention, là nous travaillons sur le fichier squidguard.conf qui est une copie du fichier générique de chastity-list.
Mettre ces src juste après la fermeture de l'accolade correspondant à time workhours.
time workhours { weekly s 09:30-12:00 13:00-19:00 weekly m 09:00-12:00 13:00-19:00 weekly t 09:00-11:00 12:00-19:00 weekly w 09:00-12:00 12:00-18:00 weekly h 09:00-13:00 13:00-18:00 weekly f 09:00-12:00 13:30-18:00 weekly a 08:20-13:00 13:30-19:00 } src passe_par_tout { user tatane001 } src enseignants { user perebaba001 } src auditeurs { user pierre001 stephane001 lionel001 nicolas001 isidore001 francois001 }
Ces noms d'utilisateurs ne sont que des exemples, veuillez mettre ceux qui correspondent à votre cas de figure.
Remarque : il est possible de mettre les noms des utilisateurs dans un fichier texte. Nous n'avons pas trouvé la possibilité d'authentifier directement des groupes ldap ce qui aurait évité de renseigner à nouveau les utilisateur dans squidguard.
Ensuite, dans ce même fichier nous allons déclarer les domains/urls personnels à autoriser que nous avons créés précédemment.
Pour cela rechercher la ligne # DESTINATION CLASSES: et juste en dessous mettre :
# DESTINATION CLASSES: dest personnel { domainlist personnel/domains urllist personnel/urls }
Laisser les autres destination tel quelles, nous allons les utiliser par la suite. Il ne reste plus qu'a réaliser les listes de contrôles d'accès. Dans le fichier de configuration de SquidGUARD, rechercher la ligne # ACLs et effacer tout le contenu de ce qui est entre les deux accolades d'acl et le remplacer par les acls listées ci-dessous.
# ACLs acl { passe_par_tout { pass all } enseignants { pass !adult !audio-video !forums !hacking !redirector !warez !ads !aggressive !drugs !gambling !violence all redirect http://127.0.0.1/cnam/avertissement.php?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&destinationgroup=%t&url=%u } auditeurs { pass personnel !adult !audio-video !forums !hacking !redirector !warez !ads !aggressive !drugs !gambling !violence none redirect http://127.0.0.1/cnam/avertissement.php?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&destinationgroup=%t&url=%u } default { pass !adult !audio-video !forums !hacking !redirector !warez !ads !aggressive !drugs !gambling !violence all redirect http://127.0.0.1/cnam/avertissement.php?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&destinationgroup=%t&url=%u } }
Quelques explications sont nécessaires, chaque acl porte un nom. Ici quatre acl ont été créées ( passe_par_tout, enseignants, auditeurs et default). Les acls contiennent les sources autorisées, par exemple ici, les auditeurs peuvent aller consulter les domains/urls personnels, mais pas les adult, audio-video etc. et none à la fin pour dire qu'ils ne peuvent consulter autre chose. Vous l'aurez compris le point d'exclamation interdit des sources tandis que rien l'autorise. Vous vous demandez peut-être pourquoi l'acl auditeurs interdit les sources adult audio-video etc. bien que pass personnel none aurait pu suffire. Le problème vient de la redirection, SquidGUARD appel une page web dans le cas présent avertissement.php avec des passages de paramètres pour la page dynamiques. Si l'auditeur appel directement une page blacklistée, le champ destinationgroup contiendrait « none » est il nous serait pas possible de savoir le domain/url que l'auditeur a essayé de visiter. Le script php relatif à l'avertissement à l'utilisateur ne sera pas décrit dans cette présente procédure mais juste listé dans annexes car cela dépasserait le cadre du sujet.
Exemple de capture d'écran pour perebaba001
2.3/ Consultation des fichiers log
Squid log tous les accès web par défault dans le répertoire /var/log/squid/ dans le fichier acces.log.
Dans ce même répertoire, ont peut lister les fichiers de log :
access.log
cache.log
squidGuard.log
store.log
Il existe un méthode peu élégante de lister en temps réel les accès au web qui est la suivante :
router:~# tail -f /var/log/squid/access.log
1149103065.131 301 192.168.1.11 TCP_MISS/200 14679 GET http://img.jamendo.com/albums/1622/covers/1.50.jpg tatane001 DIRECT/158.64.60.199 image/jpeg
1149103095.113 274 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103125.375 250 192.168.1.11 TCP_MISS/200 673 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103155.584 988 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103186.183 1026 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103216.425 237 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103246.636 549 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103259.027 302576 192.168.1.11 TCP_MISS/200 4391 CONNECT flashimg-ssl.club-internet.fr:443 tatane001 DIRECT/194.158.120.14 -
1149103276.945 1247 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103307.163 426 192.168.1.11 TCP_MISS/200 473 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103337.393 296 192.168.1.11 TCP_MISS/200 689 GET http://www.jamendo.com/? tatane001 DIRECT/158.64.60.199 text/html
1149103337.563 169 192.168.1.11 TCP_MISS/200 1521 GET http://img.jamendo.com/albums/859/covers/1.50.jpg tatane001 DIRECT/158.64.60.199 image/jpeg
Il existe des outils d'analyses graphiques de l'activité de squid. Un de ces outils s'appel « sarg » qui permet de visualiser les logs antérieurs à la veille. Ce logiciel a le mérite d'être localisé en Français alors pourquoi s'en priver!
Un coup de baguette magique sous GNU/debian permet d'installer ce logiciel :
routeur:~# apt-get install sarg
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Les NOUVEAUX paquets suivants seront installés :
sarg
0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 137ko dans les archives.
Après dépaquetage, 442ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://ftp.at.debian.org stable/main sarg 2.0.5.dfsg-1 [137kB]
137ko réceptionnés en 0s (157ko/s)
Sélection du paquet sarg précédemment désélectionné.
(Lecture de la base de données... 44749 fichiers et répertoires déjà installés.)
Dépaquetage de sarg (à partir de .../sarg_2.0.5.dfsg-1_i386.deb) ...
Paramétrage de sarg (2.0.5.dfsg-1) ...
routeur:~#
Editer le fichier /etc/squid/sarg.conf pour le personnaliser.
Rechercher la ligne language English et remplacer English par French
Pour activer les graphes rechercher la ligne #graphs yes et retirer la # pour activer les graphes
Rechercher ligne title "Squid User Access Reports" et à la place de Squid user Access Reports mettre le titre de votre choix.
Nous vous laissons le plaisir d'explorer et modifier ce fichier de configuration à vos souhaits.
Quelques captures d'écrans après s'être connecté sur http://router/squid-reports/ :
(les captures parlent d'elles mêmes)
Script PHP avertissement.php
<?php // Reporter les errors. error_reporting(E_ERROR|E_PARSE); // On appel la bibliotheque IT de pear require_once "HTML/Template/IT.php"; // On defini la base de l'emplacement de base des fichiers template html. $tmpl = new HTML_Template_IT("./pages/template"); // Faire appel au fichier html haut de page. $tmpl->loadTemplatefile("hautDePage.tmpl.html", true, false); // Ce placer dans le block head du haut de la page html. $tmpl->setCurrentBlock("head"); // Definir les variables du haut de page. $tmpl->setVariable("TITRE", "CNAM_2006"); $tmpl->setVariable("FEUILLECSS", ""); // Parser toute le haut de page. $tmpl->show(); // Recuperation des valeurs get ou post. if ($_GET['clientaddr'] != "") $clientaddr = $_GET['clientaddr']; else $clientaddr = $_POST['clientaddr']; if ($_GET['clientname'] != "") $clientname = $_GET['clientname']; else $clientname = $_POST['clientname']; if ($_GET['clientident'] != "") $clientident = $_GET['clientident']; else $clientident = $_POST['clientident']; if ($_GET['clientgroup'] != "") $clientgroup = $_GET['clientgroup']; $clientgroup = $_POST['clientgroup']; if ($_GET['destinationgroup'] != "") $destinationgroup = $_GET['destinationgroup']; else $destinationgroup = $_POST['destinationgroup']; if ($_GET['url'] != "") $url = $_GET['url']; else $url = $_POST['url']; $raison=$clientgroup; // Faire appel au fichier html corps de message. $tmpl->loadTemplatefile("avertissement.tmpl.html", true, false); // Definir les variables du corps de message. $tmpl->setVariable("USER", $clientident); $tmpl->setVariable("URI", $url); $tmpl->setVariable("GROUP", $clientgroup); $tmpl->setVariable("CLIENTADDR", $clientaddr); if($destinationgroup=="none") $destinationgroup="non renseignés"; else { $message="Vous allez être sanctionné!"; $tmpl->setVariable("MESSAGE", $message); } $tmpl->setVariable("TYPESITE", $destinationgroup); // Afficher le corps de page html. $tmpl->show(); // Faire appel au fichier html bas de page. $tmpl->loadTemplatefile("basDePage.tmpl.html", true, false); // Parser le bas de page. $tmpl->show(); ?>
Fichier template html corps de page (avertissement.tmpl.html ) associé au script PHP avertissement.php
<!-- Page realise par Stephane JOLY/tatane<sjolye@club-internet.fr> //--> <center> <h2>PAGE DE VOTRE ENTREPRISE</h2> (pour notre exemple le CNAM NANCY) </center> <br/> <p> <b>{USER}</b> sur la machine <b>{CLIENTADDR}</b> </p> Vous ne pouvez pas accéder à la ressource : <p> <ul> <li><b>{URI}</b></li> </ul> </p> Pour les raisons suivantes : <p> <ul> <li>Les <b>{GROUP}</b>, ne peuvent pas visiter les sites de type <b>{TYPESITE} </b>.</li> </ul> <blink>{MESSAGE}</blink> <br/> </p> Pour plus de renseignements contacter votre responsable, où l'administrateur du cache. <HR> <ADDRESS> <A href="mailto:sjolye@club-internet.fr">tatane</A> </ADDRESS><!-- Created: Thu Mar 24 17:51:58 CET 2005 --> <!-- hhmts start --> Last modified: Thu Mais 25 22:29:02 CET 2006 <!-- hhmts end -->
Fichier template haut de page (hautDePage.html.tmpl) associé au ccript PHP avertissement.php
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <!-- debut de page de tatane //--> <!-- BEGIN head --> <HEAD> <meta name="generator" content= "HTML Tidy for Linux/x86 (vers 12 April 2005), see www.w3.org"> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="author" content="tatane"> <link rel="stylesheet" type="text/css" href="{FEUILLECSS}"> <title>{TITRE}</title> </HEAD> <!-- END head --> <BODY>
Fichier template bas de page (basDePage.html.tmpl) associé au sript php
</BODY> <!-- fin de page de tatane //--> </HTML>
Fichier slapd.conf
# Allow LDAPv2 binds allow bind_v2 # This is the main slapd configuration file. See slapd.conf(5) for more # info on the configuration options. ####################################################################### # Global Directives: # Features to permit #allow bind_v2 # Schema and objectClass definitions include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema # Schema check allows for forcing entries to # match schemas for their objectClasses's schemacheck on # Where the pid file is put. The init.d script # will not stop the server if you change this. pidfile /var/run/slapd/slapd.pid # List of arguments that were passed to the server argsfile /var/run/slapd.args # Read slapd.conf(5) for possible values loglevel 0 # Where the dynamically loaded modules are stored modulepath /usr/lib/ldap moduleload back_bdb ####################################################################### # Specific Backend Directives for bdb: # Backend specific directives apply to this backend until another # 'backend' directive occurs backend bdb checkpoint 512 30 ####################################################################### # Specific Backend Directives for 'other': # Backend specific directives apply to this backend until another # 'backend' directive occurs #backend <other> ####################################################################### # Specific Directives for database #1, of type bdb: # Database specific directives apply to this databasse until another # 'database' directive occurs database bdb # The base of your directory in database #1 suffix "dc=cnam,dc=fr" # Where the database file are physically stored for database #1 directory "/var/lib/ldap" # Indexing options for database #1 index objectClass eq # Save the time that the entry gets modified, for database #1 lastmod on # Where to store the replica logs for database #1 # replogfile /var/lib/ldap/replog # The userPassword by default can be changed # by the entry owning it if they are authenticated. # Others should not be able to see it, except the # admin entry below # These access lines apply to database #1 only access to attrs=userPassword by dn="cn=admin,dc=cnam,dc=fr" write by anonymous auth by self write by * none # Ensure read access to the base for things like # supportedSASLMechanisms. Without this you may # have problems with SASL not knowing what # mechanisms are available and the like. # Note that this is covered by the 'access to *' # ACL below too but if you change that as people # are wont to do you'll still need this if you # want SASL (and possible other things) to work # happily. access to dn.base="" by * read # The admin dn has full write access, everyone else # can read everything. access to * by dn="cn=admin,dc=cnam,dc=fr" write by * read # For Netscape Roaming support, each user gets a roaming # profile for which they have write access to #access to dn=".*,ou=Roaming,o=morsnet" # by dn="cn=admin,dc=cnam,dc=fr" write # by dnattr=owner write ####################################################################### # Specific Directives for database #2, of type 'other' (can be bdb too): # Database specific directives apply to this databasse until another # 'database' directive occurs #database <other> # The base of your directory for database #2 #suffix "dc=debian,dc=org"
Fichier ldif cnam pour openLdap
dn: dc=cnam,dc=fr dc: cnam objectClass: top objectClass: dcObject objectClass: organization o: cnam dn: cn=admin, dc=cnam,dc=fr userPassword:: e2NyeXB0fWRPbjdKQnVQUDZacUk= description: LDAP administrator objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin dn: ou=Peoples, dc=cnam,dc=fr ou: Peoples objectClass: organizationalUnit dn: ou=Groups, dc=cnam,dc=fr ou: Groups objectClass: organizationalUnit dn: uid=tatane001,ou=Peoples, dc=cnam,dc=fr mail: sjolye@club-internet.fr roomNumber: 216 userPassword:: e1NIQX1EcGRvOHlpRDVQcFI2cnREbHhVTTZTT3lBaGs9 uid: tatane001 objectClass: inetOrgPerson sn: tatane001 title: etudiant cn: Stephane JOLY dn: uid=perebaba001,ou=Peoples, dc=cnam,dc=fr mail: mb.courrier@wanadoo.fr userPassword:: e1NIQX1XRzJMS0pFQzZRZ3hON084cWY1NXU4NWlrTzg9 uid: perebaba001 objectClass: inetOrgPerson sn: perebaba001 cn: PereBaba BACHIR dn: uid=toto001,ou=Peoples, dc=cnam,dc=fr mail: toto@cnam.fr roomNumber: 113 userPassword:: e1NIQX1DNXdtSmR3aDd3WDJyVTNmUjhYeUE0TjZveXc9 uid: toto001 objectClass: inetOrgPerson sn: toto001 title: etudiant cn: Toto TOTO dn: uid=tata001,ou=Peoples, dc=cnam,dc=fr mail: tata@cnam.fr roomNumber: 111 userPassword:: e1NIQX1rSGxhRC9xb3VJd09KUVZHMkVPYnljTWVXbDQ9 uid: tata001 objectClass: inetOrgPerson sn: tata001 title: etudiant cn: Tata TATA dn: uid=titi001,ou=Peoples, dc=cnam,dc=fr mail: titi@cnam.fr userPassword:: e1NIQX05K2VjcU9zTE1lNU5YV3dZRkJabWYvN2xLTzA9 uid: titi001 objectClass: inetOrgPerson sn: titi001 title: etudiant cn: Titi TITI dn: uid=pierre001,ou=Peoples, dc=cnam,dc=fr mail: pedroski57@hotmail.com userPassword:: e1NIQX0vd0dhVjBpbEsxWkJZa3I0aWxTaThPUnFuN1U9 uid: pierre001 objectClass: inetOrgPerson sn: pierre001 title: auditeur cn: Pierre Pedroski dn: uid=stephane001,ou=Peoples, dc=cnam,dc=fr mail: stephane.baudier@wanadoo.fr userPassword:: e1NIQX1OcjFQYzc0eTdYSml3V1RuN25JV1BuVkRtSjQ9 uid: stephane001 objectClass: inetOrgPerson sn: stephane001 title: auditeur cn: Stephane BAUDIER dn: uid=lionel001,ou=Peoples, dc=cnam,dc=fr mail: mailto: lionel.paulard@club-internet.fr userPassword:: e1NIQX1XKyt3ZEk0WkNJWlFWeWVoQWtkY3drKzZvUlk9 uid: lionel001 objectClass: inetOrgPerson sn: lionel001 title: auditeur cn: Lionel PAULARD dn: uid=nicolas001,ou=Peoples, dc=cnam,dc=fr mail: nikko_dx@hotmail.com userPassword:: e1NIQX1RWTJVQmtPeGwxMWlJMDdnRWthdFMxaVFRWVE9 uid: nicolas001 objectClass: inetOrgPerson sn: nicolas001 title: auditeur cn: Nicolas DX dn: uid=isidore001,ou=Peoples, dc=cnam,dc=fr mail: i.moreno@melperso.com userPassword:: e1NIQX15ZHlJTmxNRWxNQkxoSmhJOGlwb3pWNmFFZ0k9 uid: isidore001 objectClass: inetOrgPerson sn: isidore001 title: auditeur cn: Isidore MORENO dn: uid=francois001,ou=Peoples, dc=cnam,dc=fr mail: spigy@caramail.com userPassword:: e1NIQX1VWWZhQzVOTXdsNnlJQm8reVNCc0pMRThzanM9 uid: francois001 objectClass: inetOrgPerson sn: francois001 title: auditeur cn: Francois SPIEGEL dn: uid=ludovic001,ou=Peoples, dc=cnam,dc=fr mail: ludovicperache@free.fr userPassword:: e1NIQX1JQ0ZsQ01EYVJHMXNEU3I0Z1JKbjZlakNKZUE9 uid: ludovic001 objectClass: inetOrgPerson sn: ludovic001 title: auditeur cn: Ludovic PERACHE dn: uid=olivier001,ou=Peoples, dc=cnam,dc=fr mail: olivier.meon@batigere.fr userPassword:: e1NIQX1kOHpQRFhweTdnQTI5dkdpT2RYRWZ1aDVrQlE9 uid: olivier001 objectClass: inetOrgPerson sn: olivier001 title: auditeur cn: Olivier NEON dn: uid=stephane002,ou=Peoples, dc=cnam,dc=fr mail: sjolye@club-internet.fr userPassword:: e1NIQX1OcjFQYzc0eTdYSml3V1RuN25JV1BuVkRtSjQ9 uid: stephane002 objectClass: inetOrgPerson sn: stephane002 title: auditeur cn: Stephane JOLY dn: uid=adrien001,ou=Peoples, dc=cnam,dc=fr mail: adrien.stutzmann@inpl-nancy.fr userPassword:: e1NIQX1UUkNDbnhSOEU4WThSWG4xS1hxSDc3b1JRNk09 uid: adrien001 objectClass: inetOrgPerson sn: adrien001 title: auditeur cn: Adrien STUTZMANN dn: uid=alexandre001,ou=Peoples, dc=cnam,dc=fr mail: adrien.stutzmann@inpl-nancy.fr userPassword:: e1NIQX1zdzlCYWVCVTdudU1KRFNBdlB6dllrRnZPd2c9 uid: alexandre001 objectClass: inetOrgPerson sn: alexandre001 title: auditeur cn: Alexandre FAVIER dn: cn=enseignants,ou=Groups, dc=cnam,dc=fr objectClass: groupOfUniqueNames description: enseignants uniqueMember: uid=perebaba001,ou=Peoples,dc=cnam,dc=fr cn: enseignants dn: cn=auditeurs,ou=Groups, dc=cnam,dc=fr objectClass: groupOfUniqueNames description: auditeurs uniqueMember: uid=tatane001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=pierre001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=stephane001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=lionel001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=nicolas001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=isidore001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=francois001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=ludovic001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=olivier001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=stephane002,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=adrien001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=alexandre001,ou=Peoples,dc=cnam,dc=fr cn: auditeurs dn: cn=eleves,ou=Groups, dc=cnam,dc=fr objectClass: groupOfUniqueNames description: eleves uniqueMember: uid=tata001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=toto001,ou=Peoples,dc=cnam,dc=fr uniqueMember: uid=titi001,ou=Peoples,dc=cnam,dc=fr cn: eleves
Fichier squid.conf purgé de sa documentation
hierarchy_stoplist cgi-bin ? acl QUERY urlpath_regex cgi-bin \? no_cache deny QUERY hosts_file /etc/hosts # En plus (il n'y a q'une seule ligne) auth_param basic program /usr/lib/squid/ldap_auth -b "dc=cnam,dc=fr" -D "cn=admin,dc=cnam,dc=fr" -w "azerty" -h 127.0.0.1 -p 389 -u uid -f "uid=%s" auth_param basic children 5 auth_param basic realm Identification utilisateur! auth_param basic credentialsttl 2 hours auth_param basic casesensitive on # En plus authenticate_ttl 1 hour # En plus authenticate_ip_ttl 30 minute # En plus (il n'y a q'une seule ligne) external_acl_type ldap_group ttl=3600 %LOGIN /usr/lib/squid/squid_ldap_group -b "ou=Groups,dc=cnam,dc=fr" -B "ou=Peoples,dc=cnam,dc=fr" -f "(&(cn=%g)(objectClass=groupOfUniqueNames)(uniqueMember=%u))" -F "(&(sn=%s)(objectClass=inetOrgPerson))" -h 127.0.0.1 -p 389 refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 #Recommended minimum configuration: acl all src 0.0.0.0/0.0.0.0 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 # En plus (test) #acl mon_lan src 192.168.1.0/24 # En plus acl group_ldap_auditeurs external ldap_group auditeurs acl group_ldap_enseignants external ldap_group enseignants acl SSL_ports port 443 563 # https, snews acl SSL_ports port 873 # rsync acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl Safe_ports port 631 # cups acl Safe_ports port 873 # rsync acl Safe_ports port 901 # SWAT acl purge method PURGE acl CONNECT method CONNECT # En plus (test) #acl Users proxy_auth REQUIRED #acl protocole_ftp proto FTP #acl url_mp3 url_regex -i \.mp3$ #acl sites_sex url_regex -i "/etc/squid/sites_sex.txt" http_access allow manager localhost http_access deny manager http_access allow purge localhost http_access deny purge http_access deny !Safe_ports http_access deny CONNECT !SSL_ports # En plus http_access allow group_ldap_enseignants http_access allow group_ldap_auditeurs #http_access deny sites_sex #http_access deny url_mp3 #http_access deny protocole_ftp http_access allow localhost http_access deny all http_reply_access allow all icp_access allow all # En plus cache_mgr administratreur@mon_entreprise # En plus visible_hostname proxy_mon_entreprise coredump_dir /var/spool/squid # En plus redirect_program /usr/bin/squidGuard redirect_children 4
Fichier squidguard.conf
#---------------------------------------------------------------- # SquidGuard CONFIGURATION FILE #---------------------------------------------------------------- # CONFIGURATION DIRECTORIES dbhome /var/lib/chastity 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 s 09:30-12:00 13:00-19:00 weekly m 09:00-12:00 13:00-19:00 weekly t 09:00-11:00 12:00-19:00 weekly w 09:00-12:00 12:00-18:00 weekly h 09:00-13:00 13:00-18:00 weekly f 09:00-12:00 13:30-18:00 weekly a 08:20-13:00 13:30-19:00 } src passe_par_tout { user tatane001 } src enseignants { user perebaba001 } src auditeurs { user pierre001 stephane001 lionel001 nicolas001 isidore001 francois001 ludovic001 olivier001 stephane002 adrien001 alexandre001 } # DESTINATION CLASSES: dest personnel { domainlist personnel/domains urllist personnel/urls } dest adult { domainlist adult/domains urllist adult/urls expressionlist adult/expressions } dest audio-video { domainlist audio-video/domains urllist audio-video/urls } dest forums { domainlist forums/domains urllist forums/urls expressionlist forums/expressions } dest hacking { domainlist hacking/domains urllist hacking/urls } dest redirector { domainlist redirector/domains urllist redirector/urls expressionlist redirector/expressions } dest warez { domainlist warez/domains urllist warez/urls } dest ads { domainlist ads/domains urllist ads/urls } dest aggressive { domainlist aggressive/domains urllist aggressive/urls } dest drugs { domainlist drugs/domains urllist drugs/urls } dest gambling { domainlist gambling/domains urllist gambling/urls } dest violence { domainlist violence/domains urllist violence/urls expressionlist violence/expressions } # ACLs acl { passe_par_tout { pass all } enseignants { pass !adult !audio-video !forums !hacking !redirector !warez !ads !aggressive !drugs !gambling !violence all redirect http://127.0.0.1/cnam/avertissement.php?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&destinationgroup=%t&url=%u } auditeurs { pass personnel !adult !audio-video !forums !hacking !redirector !warez !ads !aggressive !drugs !gambling !violence none redirect http://127.0.0.1/cnam/avertissement.php?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&destinationgroup=%t&url=%u } default { pass !adult !audio-video !forums !hacking !redirector !warez !ads !aggressive !drugs !gambling !violence all redirect http://127.0.0.1/cnam/avertissement.php?clientaddr=%a&clientname=%n&clientident=%i&clientgroup=%s&destinationgroup=%t&url=%u } }
3/ Procédure pour Windows
3.1/ Plate-forme
Le but de cette procédure est la mise en place d’un proxy sous windows pour un parc NT/2000/XP sous un domaine NT avec authentification automatique reposant sur Active Directory. Les différents tests ont été fait sur Windows 2003 Server.
3.2/ Installation et configuration
- Télécharger squid sur http://squid.acmeconsulting.it/download/dl-squid.html, prendre la version 2.5.STABLE13-NT STANDARD
- Dézipper l’archive sur C:\ (par défaut, squid est prévu pour fonctionner à la racine du C:\ sinon vous devrez retoucher à squid.conf)
- Sous c:\ vous aller retrouver les dossier suivants :
squid\
bin\
docs\
etc\
libexec\
sbin\
share\
system32\
var\
- Dans le dossier etc\, créer les fichiers cachemgr.conf mime.conf et squid.conf à partir des fichiers default.
- Avant toute chose, il faut aller dans le fichier de configuration de squid, rechercher la balise « visible_hostname » et indiquer le nom du serveur Proxy, ce sera le nom que renvoie squid lorsqu’il est interrogé de l’extérieur.
- Aller dans le « menu démarrer », puis « exécuter », taper command pour faire apparaître la console MS-DOS, grâce à la commande cd, dirigez-vous dans le dossier sbin\ de squid et taper squid –z pour créer le swap dans le dossier var/cache/ Ceci est indispensable au bon fonctionnement de squid.
- La commande squid permet de lancer le proxy et la commande squid –i permet d’ajouter squid dans les services WINDOWS, ce qui peut paraître plus pratique mais désactive l’écriture dans le fichier log de squid quand celui ci bogue.
- Après avoir lancé squid, pour voir si Squid fonctionne correctement, allez dans votre navigateur Web préféré, dans les options internet, indiquez lui que vous utiliser un serveur proxy, rentrer l’adresse ip de votre machine puis le port 3128 (le port par défaut du proxy Squid), n’oubliez pas d’indiquer que vous utilisez le même proxy pour tous les protocoles (HTTP HTTPS FTP Gopher). Appliquez les changements et redémarrez le navigateur. Si un message d’erreur inhabituel apparaît, c’est que le proxy est bien installé.
- Nous allons maintenant nous attaquer au fichier de configuration de squid, dans etc/squid.conf, recherchez la ligne suivante « cache_mem 8 MB », retirer la balise de commentaire et mettez le à 16MB minimum, cela représente la mémoire alloué pour Squid. Recherchez la balise « cache_mgr » et ajoutez l’adresse mail de l’administrateur du proxy.
- Après la configuration de base,
recherchez la ligne « acl
to_localhost… », juste en
dessous, vous devez rajouter les ip des machines autorisées à
passer par le proxy :
ex : acl serveur src 193.50.59.221
acl client1 src 193.50.59.6
acl client2 src 193.50.59.7
Cela est fastidieux si vous disposez d’un réseau avec beaucoup de postes, dans ce cas, vous pouvez déclarer un réseau ou sous-réseau :
ex : acl mon_lan src 193.50.59.0/255.255.255.0 ou acl mon_lan src 193.50.59.1-193.50.59.254
- Après avoir déclaré les machines de votre réseau, recherchez la ligne suivante « http_access allow manager localhost » et donnez leur accès à votre proxy :
ex : http_access allow serveur
http_access allow client1
ou
ex : http_access allow mon_lan
selon le cas.
- A défaut d’installer Squidguard qui n’existe pas en mode natif sur windows, nous allons interdire l’accès à des sites ou mots clés que vous pouvez déclarer dans un fichier séparé :
ex : acl liste_interdite url_regex "c:/squid/etc/banned.txt"
Juste en dessous de la ligne « http_access allow manager localhost », indiquez le :
http_access deny liste_interdite
Au contraire, vous pouvez juste déclarer les sites autorisés mais cela est à vous de voir.
Aperçu du fichier banned.txt
- A titre informatif, vous pouvez paramétrer tous les messages d’erreur à l’aide d’un logiciel de création de site web ou d’un notepad, ils se trouvent dans le dossier share/errors/english
- Jusque là, Squid sauvegarde dans son fichier access.log les adresses ip des machines qui ont accédé à l’extérieur. Si on veut pousser plus loin, dans le cas où, par exemple, un poste client est utilisé par plusieurs personnes, on préférera alors sauvegarder aussi les logins. Pour ce faire, recherchez la ligne « auth_param basic program », dé-commenter la et ajouter :
auth_param basic program c:/squid/libexec/squid_ldap_auth.exe -R -D "CN=Administrateur,CN=Users,DC=presidence,DC=inpl,DC=fr" -w password DC=presidence,DC=inpl,DC=fr -f sAMAccountName=%s -h 193.50.59.1
Les options :
-R est nécessaire pour communiquer avec une base Active Directory
-D est requit et attend la base DN d’un arbre compatible LDAP
-w mot de passe d’un utilisateur qui a le droit de visualisation ou d’un administrateur
-f méthode pour se connecter
-h adresse ip du serveur Active Directory
Changez aussi la ligne « auth_param basic realm » en lui assignant un nom
ex : auth_param basic realm Proxy en test
Ce nom s’affichera quand un client voudra se connecter à internet
Aperçu de la fenêtre de connexion
- Pour assurer éviter à l’utilisateur de retaper son nom et son mot de passe lorsqu’il ouvre son navigateur, il existe NTLM (NT Lan Manager) qui est un protocole d’authentification et disponible en natif avec Squid. Il vous suffit de rajouter ces lignes avant l’appel au programme d’identification AD :
auth_param ntlm program c:/squid/libexec/win32_ntlm_auth.exe
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes
PS : Il faut néanmoins que le client s’authentifie préalablement sur un domaine NT/2000, sinon il devra tout de même rentrer son mot de passe AD.
Après être passé sur tous les postes clients pour configurer les navigateurs, votre proxy est prêt à fonctionner. Il existe une méthode pour installer un proxy transparent (c’est-à-dire capable de rediriger les connections TCP arrivant sur un port donné d'une certaine machine vers un port différent d'une autre machine). Deux problèmes principaux apparaissent, d’une part, seul HTTP est supporté, d’autre part, ceci est incompatible avec n’importe quel type d’authentification, donc nous n’irons pas plus loin dans les explications.
3.3/ Consultation des fichiers log
Analyser manuellement les fichiers logs que
génère Squid relève de l’autisme, je vous
propose donc de télécharger 2 petits utilitaires :
- KrakenReports http://www.krakenreports.com qui se révèle très simple à installer et à utiliser mais qui ne délivre pas grand chose en terme de statistiques.
- Webalizer http://www.medasys-lille.com/webalizer/ qu’il faut paramétrer mais qui fournit une multitude de statistiques.
Il faut créer un fichier webalizer.conf à la racine du dossier d’installation avec ces informations :
LogFile C:/squid/var/logs/access.log
LogType squid
OutputDir C:/squid/var/logs/web/stats
PageType htm*
PageType cgi
En
lançant Webalizer, voici un aperçu de ce que l’on
peut avoir
Stéphane
JOLY et Adrien STUTZMANN CNAM cycle C 2005/2006