SQUID avec authentification LDAP sous Debian
Description
Cet article concerne la mise en place d’un Proxy avec authentification Ldap et une gestion de règles selon l’OU de l’utilisateur.
Un tel système permet la journalisation des requêtes par utilisateur et le filtrage des sites internet. Je ne reviendrai pas sur la façon dont certaines entreprises abusent de ces systèmes. Cependant sans vouloir faire l’avocat du diable, gardons à l’esprit qu’un responsable informatique est légalement responsable du système dont il a la charge et qu’il doit couvrir ses obligations.
Nous allons donc monter un serveur Proxy Squid relié à un serveur d’annuaire Ldap, pour l’analyse des log nous utiliserons sarg.
Matériel
Les ingrédients pour réussir la recette sont donnés à titre d’exemple.
- 1 machine
- 1 système d’exploitation Linux (ex: Debian Lenny)
- 2 cartes Ethernet
- 1 serveur Ldap (ex: Novel)
Dans notre exemple l’interface eth0 est reliée à un réseau qui à accès à internet. L’interface eth1 est branché au réseau local dont l’accès à internet a été restreint.
Installation sous Debian
apt-get install squid ldap-utils apache2 sarg
Configuration interfaces réseaux
Il est nécessaire de configurer des adresses réseaux fixes et non attribuées par le serveur DHCP.
nano /etc/network/interfaces
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 allow-hotplug eth0 iface eth0 inet static address 10.20.1.2 netmask 255.255.255.0 gateway 10.20.1.1 broadcast 255.255.255.255 # The secoundary network interface auto eth1 allow-hotplug eth1 iface eth1 inet static address 192.168.1.1 netmask 255.255.255.0 broadcast 255.255.255.255
Pour prendre en compte les changements réseaux on redémarre le service networking
/etc/init.d/networking restart
Configuration Squid
Nous allons forcer l’authentification des utilisateurs via un annuaire LDAP, et gérer des règles en fonction des OU des utilisateurs.
nano /etc/squid/squid.conf
Les explications sont dans les commentaires
# -------------------------------------- # Fichier de configuration du proxy SQUID # # * Authentification via LDAP # * Regles en fonction des OU # # @file : /etc/squid/squid.conf # @author : Liberez le tux # @version : 3 # @email : xxxxxxxx # -------------------------------------- # -------------------------------------- # Prerequis : # -------------------------------------- # * debian lenny # * etre root # * apt-get install squid ldap-utils apache2 sarg # -------------------------------------- # -------------------------------------- # TODO # -------------------------------------- # * Definir toutes les OU # * Definir toutes les regles # -------------------------------------- # OPTIONS FOR AUTHENTICATION # -------------------------------------- ##### TAG: auth_param # Parametrage de l'authentification LDAP avec un compte existant # -b "o=ROOT" : la racine de l'annuaire # -D cn=LDAP,ou=ROBOTS,ou=USERS,o=ROOT -w monmotdepasse : utilisateur utilise pour se connecter a l'annuaire # -h 10.20.1.1 : l'adresse du serveur LDAP # -f "uid=%s" : le filtre pour l'authentification # auth_param basic program /usr/lib/squid/ldap_auth -v 3 -b "o=ROOT" -D cn=LDAP,ou=ROBOTS,ou=USERS,o=ROOT -w monmotdepasse -f "uid=%s" -h 10.20.1.1 # Nombre d'instances de SQUID pour l'authentification auth_param basic children 5 # Nom du serveur (affiche le message dans la boite de dialogue du navigateur) auth_param basic realm Mon beau proxy # Session desactivee apres 2 heures d'inactivite auth_param basic credentialsttl 2 hours # ACCESS CONTROLS # -------------------------------------- ##### TAG: external_acl_type # Permet de vérifier l'appartenance d'un utilisateur a une OU. # Le filtre "(&(objectclass=person)(cn=%u)(ou:dn:=%a))" # verifie que l'utilisateur courant %u est dans l'OU donnée via %a. # L'expression %a est un paramètre qui sera renseigné dans une ACL. external_acl_type ldapou %LOGIN /usr/lib/squid/squid_ldap_group -b "o=ROOT" -f "(&(objectclass=person)(cn=%u)(ou:dn:=%a))" -D cn=LDAP,ou=ROBOTS,ou=USERS,o=ROOT -w monmotdepasse -h 10.20.1.1 ##### TAG: acl # Obligation de s'authentifier acl auth proxy_auth REQUIRED # Definition de "all" (tout le monde) acl all src all # Definition des groupes par OU # ici le groupe "gr_restrict" correspond a l'OU "RESTRICTS" # ici le groupe "gr_admin" correspond a l'OU "ADMINS" acl gr_restrict external ldapou RESTRICTS acl gr_admin external ldapou ADMINS # Restrictions # les url autorises sont dans le fichier "url_allow" # chaque url doit commencer par un "." : # .liberez-le-tux.servhome.org # .planet-libre.org acl url_allow dstdomain "/etc/squid/domains/url_allow.txt" # Restrictions : une autre ecriture # acl url_allow dstdomain .liberez-le-tux.servhome.org .planet-libre.org ##### TAG: http_access # groupe "gr_restrict" restreint a une liste d'url http_access allow gr_restrict url_allow # groupe "gr_admin" autorise a tout voir http_access allow gr_admin # groupe les autres http_access deny all # NETWORK OPTIONS # -------------------------------------- # Port d'ecoute de SQUID http_port 10.20.1.1:8080 # DISK CACHE OPTIONS # -------------------------------------- # cache de 500 Mo cache_dir ufs /var/spool/squid 500 16 256 # ERROR PAGE OPTIONS # -------------------------------------- # Gestion des erreurs (francais) error_directory /usr/share/squid/errors/French # LOGFILE OPTIONS # -------------------------------------- # Emplacement fichier de log access_log /var/log/squid/access.log cache_log /var/log/squid/cache.log cache_store_log /var/log/squid/store.log
Maintenant Squid est configuré, pour prendre en compte les modifications du fichier de configuration il est nécessaire de recharger la configuration.
/etc/init.d/squid reload
Configuration Logrotate
Par défauts les logs de squid sont supprimés tous les 2 jours, pour des besoins en entreprise il est souvent nécessaire de conserver ces données plus longtemps. Attention car les logs générés peuvent prendre beaucoup de place sur les serveurs.
nano /etc/logrotate.d/squid
Configuration pour une rotation des logs tous les 6 mois.
# # Logrotate fragment for squid. # /var/log/squid/*.log { monthly compress delaycompress rotate 6 missingok nocreate sharedscripts postrotate test ! -e /var/run/squid.pid || /usr/sbin/squid -k rotate endscript }
Configuration Sarg
Sarg permet de créer simplement des rapport lisibles
nano /etc/squid/sarg.conf
Nous pouvons configurer la langue des rapports ainsi que le format de date.
... language French ... access_log /var/log/squid/access.log ... graphs yes ... date_format e
L’accès aux rapports se fait via http://monserveur/squid-reports
Cron
Il est nécessaire de planifier la création des rapports de sarg, par jour, par semaine, par mois.
Lancer la commande suivante dans un terminal :
crontab -e
Entrer les lignes suivantes et quitter
00 08-18/1 * * * sarg-reports today 00 00 * * * sarg-reports daily 00 01 * * 1 sarg-reports weekly 30 02 1 * * sarg-reports monthly
Apache
Par défaut tout le monde peut venir voir les rapports générés par Sarg à l’adresse http://monserveur/squid-reports. Nous allons donc mettre en place une authentification obligatoire pour l’accès aux rapports via un fichier .htaccess.
N.D.A : Je vous invite fortement par la suite à créer un virtualhost dédié aux rapports de Squid et à le configurer directement pour limiter l’accès aux rapports.
Nous prenons comme hypothèse que le serveur Apache n’a pas été modifiée et que sa configuration est celle par défaut.
nano /etc/apache2/sites-available/default
Il faut modifier la ligne AllowOverride none en AllowOverride All dans la balise <Directory /var/www/> pour pouvoir utiliser un fichier .htaccess.
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/ <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>
Création du htaccess
nano /var/www/squid-reports/.htaccess
AuthName "Authentification requise pour la consultation des rapports Squid" AuthUserFile /var/www/squid-reports/password/.htpasswd AuthGroupFile /dev/null AuthType Basic require valid-user
Création du dossier contenant le fichier des mots de passe
mkdir /var/www/squid-reports/password
Ajout de l’utilisateur admin, le mot de passe est demandé à la suite de cette commande. L’option -c permet de créer le fichier associé.
htpasswd -c /var/www/squid-reports/password/.htpasswd admin
Protection du fichier de mot de passe
nano /var/www/squid-reports/password/.htaccess
AuthGroupFile /dev/null AuthName "Acces restreint" AuthType Basic deny from all
On relance Apache :
/etc/init.d/apache2 reload
Conclusion
Nous avons maintenant un proxy fonctionnel, dont les règles de gestion dépendent de l’OU d’appartenance des utilisateurs. Nous avons un outil qui génère des rapports compréhensibles par tous, mais dont l’accès est limité. Il ne reste qu’à configurer les navigateurs des utilisateurs pour utiliser notre proxy. Pour la configuration des navigateurs, le plus simple reste l’utilisation d’un script de configuration automatique hébergé sur un serveur différent du proxy.