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.

Vus : 6582
Publié par Liberez le tux : 14