Proxy Squid + Squidguard et intégration Active Directory

 Objectif

L’objectif de ce tutoriel, est d’installer un proxy Squid avec un filtrage de contenu géré par Squidguard. Le serveur sera intégré à un domaine Active Directory 2008 pour permettre une authentification des utilisateurs par NTLM/Kerberos.
Webalizer sera utilisé pour générer des rapports d’utilisation du proxy.

Le serveur utilisé dans cet exemple est un HP Proliant DL180G6:

  • 1 CPU Intel Xeon Dual Core
  • 10GB de mémoire RAM
  • 2 Disques dur de 250G en RAID1
  • 2 cartes réseau Gigabit

Squid sera installé sur une distribution Ubuntu-Server, 12.04 LTS

Le nom du serveur proxy sera: proxyserver

Le disque RAID1 sera géré par le hardware et partitionné comme tel:

  • /dev/sda1     6GB       ext4      /
  • /dev/sda2     20GB     swap
  • /dev/sda3     24GB     ext2      /squid/logs
  • /dev/sda4    200GB    ext2     /squid/cache

Afin d’avoir un accès plus rapide au cache, on évite de prendre un FS (File System) journalisé. ext2 est le parfait prétendant.

Préparation de la plateforme Ubuntu

Ethernet Bonding: Agrégation de lien

Ajout du module Bonding dans le kernel

Les deux cartes réseaux sont reliées à un Switch Procurve, qui permet une agrégation de lien (LACP). Grâce à ce protocole, les deux cartes réseaux seront en redondance et répartition de charge.

Il faut commencer par installer le paquet ifenslave

$ sudo apt-get install ifenslave

Une fois installée, il faut ajouter le module bonding dans le fichier /etc/modules.

$ sudo vim /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.

loop
lp
rtc
bonding

Cela permettra de charger le module bonding à chaque démarrage du système.

Pour pouvoir l’utiliser de suite, il faut le charger par la commande suivante:

$ sudo modprobe bonding

Configuration des interfaces réseau

Pour configurer les interfaces réseau, stopper le service réseau

$ sudo /etc/init.d/networking stop

Il faut commencer par définir quelles interfaces feront partie du « bonding ». Dans ce cas, il s’agit de eth0 et eth1
L’interface « bonding » sera nommée bond0 (non pas 007!) et sera configuré avec le mode 802.3ad, mode LACP intégrant l’augmentation de bande passante ainsi que la tolérance de panne.
Pour plus d’informations sur les différents modes proposés par le bonding, je vous renvoie à la très bonne documentation du site ubuntu-fr.org http://doc.ubuntu-fr.org/bonding#les_modes

Il faut donc éditer le fichier /etc/network/interfaces

$ sudo vim /etc/network/interfaces

Voici à quoi doit ressembler le fichier

# 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
iface eth0 inet manual
bond-master bond0

# The secondary network interface
auto eth1
iface eth1 inet manual
bond-master bond0

# The bonding network interface
auto bond0
iface bond0 inet static
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate 1
bond-slaves none

Une fois l’interface configurée, il suffit de redémarrer le réseau

$ sudo /etc/init.d/networking start
Les informations relatives à l’interface bonding se trouvent sous /proc/net/bonding/ pour vérifier donc l’interface bond0:
$ sudo cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
 
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
 
802.3ad info
LACP rate: fast
Min links: 0
Aggregator selection policy (ad_select): stable
Active Aggregator Info:
        Aggregator ID: 1
        Number of ports: 2
        Actor Key: 17
        Partner Key: 50
        Partner Mac Address: 00:16:b9:fd:48:80
 
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 18:a9:05:6e:ac:a9
Aggregator ID: 1
Slave queue ID: 0
 
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 18:a9:05:6e:ac:a8
Aggregator ID: 1
Slave queue ID: 0

Installation de Squid

L’installation est extrêmement simple, elle consiste uniquement à l’installation du paquet squid

$ sudo apt-get install squid

L’utilisateur et le groupe utilisé par squid est par défaut sur Ubuntu proxy

Il faut donner les droits d’accès au répertoire de cache et de logs

$ sudo chown proxy:proxy /squid/cache ; sudo chown proxy:proxy /squid/logs

Préparation de la configuration

Une fois l’installation de Squid terminée on va définir les paramètres « de base »: Port d’écoute, nom de l’hôte visible, répertoire du cache, répertoire de logs…

La configuration de squid se trouve par défaut sur Ubuntu dans /etc/squid3/squid.conf

Pour une configuration propre, copier la configuration de base dans une sauvegarde et vider la configuration par défaut:

$ sudo cd /etc/squid3
$ sudo cp squid.conf squid.conf.ori
$ sudo echo > squid.conf

Pour une configuration plus flexible, on va créer des sous-fichiers de configuration pour Squid.

$ sudo mkdir /etc/squid3/conf.d/

Dans ce répertoire seront stockés les ACL, ainsi que les autorisations d’accès au proxy. Cela permettra d’éditer en « toute sécurité » les configurations d’ACL sans toucher à la configuration principale de Squid.

Configuration des paramètres de base

Port d’écoute du Proxy: Le port d’écoute de Squid est par défaut 3128. Mais le plus souvent, le port 8080 est utilisé pour les Proxys.
Nom d’hôte visible par les clients: Il est possible de définir un autre nom d’hôte pour le proxy, qui sera visible par les clients se connectant au Proxy. (dans l’exemple, le Proxy s’appellera vortex)
Masquage des adresses IP sources: Pour plus de sécurité, les adresses des clients à l’origine des requêtes sera masqué par le squid.
Définition de l’utilisateur/groupe: Pour plus de sûreté, l’utilisateur et le groupe utilisé par Squid sera explicitement défini dans la configuration
Messages d’erreur en français: Lorsqu’une erreur intervient, le client est redirigé vers une page d’erreur de Squid. Il est possible de changer la langue par défaut des messages d’erreur
Adresse E-Mail du Cache Manager: Il est impératif de définir une adresse e-mail pour le gestionnaire du cache.

Ceci sera la première partie du fichier de configuration de Squid:

$ sudo vim /etc/squid3/squid.conf
#
# SQUID CONFIGURATION
#
# Listen on Port 8080
http_port 8080
# Visible Hostname in Error Messages
visible_hostname vortex
# Hide Source IP Address
forwarded_for off
# Error Messages in German
error_directory /usr/share/squid3/errors/French/
# User / Group for Squid
cache_effective_user proxy
cache_effective_group proxy
# Cache Manager E-Mail address
cache_mgr [email protected]

 

Configuration du cache de Squid

Emplacement et taille du cache disque: Définir l’emplacement du cache sur le disque, sa taille, le moteur d’indexation/gestion ainsi que le nombre de sous-répertoires qui définiront la structure.
Taille des objets (min/max): Il faut également définir la taille minimale et maximale qui seront stockés sur le cache disque
Limite basse et haute du cache disque: A partir de quel pourcentage d’occupation le cache sera-t-il vidé
Capacité du cache en RAM: Définir le maximum du cache stocké en RAM
Taille des objets en RAM: Définir la taille maximale des objets gardés en cache RAM

Attention! Les paramètres de taille de cache, de capacité du cache en RAM sont dépendantes des ressources disponibles sur votre serveur!
A bien ajuster en fonction de vos ressources!

A la suite de la première partie, vient donc les options suivantes:

#
# Caching Options
#
# Cache Directory (150GB / With min. 16 underdirectories and max. 256 underdirectories)
cache_dir diskd /squid/cache 153600 16 256
coredump_dir /squid/cache
# Minimum Object Size: 0!
minimum_object_size 0 KB
# The bigger the objects will be, slower will be the answers: 10MB
maximum_object_size 10 MB
# Lowest limit for Cache (in %)
cache_swap_low 90
# Highest Limit for Cache (in %)
cache_swap_high 98
# Max Cache capacity in Memory (RAM)
cache_mem 4 GB
# The highest size of Objects retains in RAM
maximum_object_size_in_memory 1 MB

 

Paramétrage des options de connexion

Afin d’avoir un système de proxy performant, ce qui aura une incidence conséquente sur l’expérience utilisateur, il faut optimiser un peu la gestion des connexions clients sur le proxy.

Rejet des connexions fermées incomplètes
Rejet des connexions persistentes serveur
Autorisation des connexions persistentes clientes
Timeout des connexions clientes
Annulation des téléchargements

#
# Connections Options
#
# Eject clients with unclean closed connections
half_closed_clients off
# Reject Persistent Server Connections
server_persistent_connections off
# Accept Persistent Client Connections
client_persistent_connections on
client_lifetime 1 day
# Connecting Timeouts for Connections
connect_timeout 50 seconds
request_timeout 50 seconds
persistent_request_timeout 50 seconds
read_timeout 2 minutes
# Aborting Downloads
quick_abort_min 20 KB
quick_abort_max 20 KB
# In Percentage
quick_abort_pct 90

Paramétrage des options du DNS

Le Proxy a également un rôle de résolution DNS, puisqu’il va gérer les requêtes DNS à la place des clients. Il faut donc définir combien de temps les requêtes « positives » et « en erreur » seront conservées dans le cache.

#
# DNS Options
#
# Upper limit on how long Squid will cache positive DNS responses.
positive_dns_ttl 6 hours
# Default Time-to-Live (TTL) for failed requests.
negative_dns_ttl 2 minutes

Configuration des Refresh Patterns

Pou les refresh patterns, j’ai gardé les options de bases proposées par Squid lors de l’installation, à savoir:

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320

Configuration des méthodes d’authentification

3 méthodes d’authentifications seront proposées aux clients:

  • Kerberos: Authentification de type Single Sign-On, le jeton d’authentification kerberos sera automatiquement transmis.
  • NTLM: Authentificiation via LDAP dans les cas où Kerberos ne fonctionne pas.
  • Basic: Authentification « basique » avec un pop-up d’authentification.

Authentification Kerberos

Pour permettre l’authentification avec Kerberos, le serveur doit pouvoir s’authentifier avec le domaine Active Directory (schéma 2008)

Les contrôleurs de Domaine Active Directory dans l’exemple sont les suivants:

  • dc1.kns7.local     192.168.0.100   (PDC)
  • dc2.kns7.local     192.168.0.101

Le domaine Active Directory se nomme kns7.local (ou KNS7)

Vérifier la configuration DNS

Sur les serveurs DNS de Windows ajouter un enregistrement (A) pour le serveur proxy ainsi que le pointer PTR (reverse DNS) correspondant.

Sur le serveur proxy, configurer la résolution DNS (si cela n’est pas déjà fait) en éditant le fichier /etc/resolv.conf

$ sudo vim /etc/resolv.conf
domain kns7.local
search kns7.local
nameserver 192.168.0.100
nameserver 192.168.0.101

 (Bien sûr, les données sont données à titre d’exemple, à adapter en fonction de votre configuration réseau).

Tester que la configuration DNS fonctionne correctement:

$ ping dc1.kns7.local -c 5 && ping kns7.org -c 5

Si les deux hôtes répondent, la résolution directe fonctionne.

Tester ensuite la résolution inverse:

$ dig -x 192.168.0.100

Si la résolution inverse donne l’adresse dc1.kns7.local c’est que tout est ok pour passer à l’intégration du serveur Linux dans le domaine AD.

Configuration NTP (Synchronisation du Temps)

Kerberos a besoin d’une synchronisation du temps entre les serveurs contrôleurs de domaine et les clients. Il faut donc synchroniser le serveur proxy avec les deux DCs du domaine

La configuration du client NTP (ntpdate) se trouve sur Ubuntu dans le fichier /etc/default/ntpdate

# Set to "yes" to take the server list from /etc/ntp.conf, from package ntp,
# so you only have to keep it in one place.
NTPDATE_USE_NTP_CONF=no

# List of NTP servers to use  (Separate multiple servers with spaces.)
# Not used if NTPDATE_USE_NTP_CONF is yes.
NTPSERVERS="dc1.kns7.local dc2.kns7.local"

# Additional options to pass to ntpdate
NTPOPTIONS=""

Puis lancer une synchronisation du temps

$ sudo ntpdate dc1.kns7.local

Installation et configuration de Kerberos

Installer les paquets nécessaires à kerberos

$ sudo apt-get install krb5-user libkrb53

Laisser les options vides lors de l’installation, tout cela sera défini dans le fichier de configuration.

Comme avec squid, la configuration sera sauvegardée puis effacée pour être redéfinie proprement.

$ sudo cp /etc/krb5.conf /etc/krb5.conf.ori
$ sudo echo > /etc/krb5.conf
$ sudo vim /etc/krb5.conf

Configurer le fichier krb5.conf comme suit (en remplaçant les noms de serveurs de domaines, ainsi que le nom de domaine.

[libdefaults]
default_realm = KNS7.LOCAL
dns_lookup_kdc = no
dns_lookup_realm = no
ticket_lifetime = 24h
default_keytab_name = /etc/squid3/PROXY.keytab
; for Windows 2003
; default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
; default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
; permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
; for Windows 2008 with AES
default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
[realms]
KNS7.LOCAL = {
kdc = dc1.kns7.local
kdc = dc2.kns7.local
admin_server = dc1.kns7.local
default_domain = kns7.local
}
[domain_realm]
.kns7.local = KNS7.LOCAL
kns7.local = KNS7.LOCAL

Dans le fichier de configuration, deux types de domaines sont différenciés. Si le domaine est basé sur le schéma 2008, les lignes suivantes seront utilisées:

; for Windows 2008 with AES
default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

Si le schéma AD est de type 2003:

; for Windows 2003
default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5

En effet, depuis Active Directory 2008, l’encryption AES est utilisée.

Installation de msktutil (Microsoft Keytab Utility)

Kerberos utilise un Active Directory keytab manager. Pour l’installation les paquets suivants sont nécessaires:

$ sudo apt-get install libsasl2-modules-gssapi-mit libsasl2-modules

Ensuite, télécharger le paquet msktutil et l’installer:

$ wget --no-check-certificate -O /var/cache/apt/archives/msktutil_0.4-2_amd64.deb "http://fuhm.net/software/msktutil/releases/msktutil_0.4-2_amd64.deb"
$ sudo dpkg -i /var/cache/apt/archives/msktutil_0.4-2_amd64.deb

Intégration au domaine du serveur proxy

Pour intégrer le serveur au domaine, il faut initialiser une session Kerberos

$ sudo kinit administrator
Password for [email protected]:

Si la commande ne retourne rien (donc aucune erreurs), c’est que la session est bien initialisée. On peut le vérifier en listant les tickets kerberos par la commande klist

$ sudo klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]
Valid starting Expires Service principal
27.11.2012 16:48:11 28.11.2012 02:48:16 krbtgt/[email protected]
renew until 28.11.2012 16:48:11

Avec l’utilitaire msktutil, on peut désormais intégrer le serveur proxy dans le domaine Active Directory

Pour un domaine Active Directory 2003:

$ sudo msktutil -c -b "CN=COMPUTERS" -s HTTP/proxyserver.kns7.local -k /etc/squid3/PROXY.keytab --computer-name PROXYSERVER-L --upn HTTP/proxyserver.kns7.local --server dc1.kns7.local --verbose

Pour un domaine Active Directory 2008

$ sudo msktutil -c -b "CN=COMPUTERS" -s HTTP/proxyserver.kns7.local -k /etc/squid3/PROXY.keytab --computer-name PROXYSERVER-L --upn HTTP/proxyserver.kns7.local --server dc1.kns7.local --verbose --enctypes 28

Le serveur proxyserver sera intégrée dans l’OU « Computers » (celle où sont stockés par défaut tous les ordinateurs). Le nom du Serveur dans Active Directory sera PROXYSERVER-L (le -L est arbitraire)afin d’éviter une confusion entre l’intégration avec Kerberos et celle avec Samba/Winbind

La table des clés Kerberos se situera donc dans /etc/squid3/PROXY.keytab il faut donc que ce fichier soit accessible par Squid

$ sudo chgrp proxy /etc/squid3/PROXY.keytab
$ sudo chmod g+r /etc/squid3/PROXY.keytab

Détruire ensuite la session administrator

$ sudo kdestroy

Afin de tester le bon fonctionnement de msktutil, sous Windows, dans la console de gestion Active Directory, faire un clic droit sur l’ordinateur et choisir « Réinitialiser le compte ». Ensuite relancer msktutil pour la synchronisation des données

$ sudo msktutil --auto-update --verbose --computer-name proxyserver-l

Attention! Le nom de l’ordinateur doit être écrit en minuscules!

Ajouter ensuite dans le crontab la ligne suivante pour que l’ordinateur s’actualise régulièrement:

00 4 * * *  root msktutil --auto-update --verbose --computer-name proxyserver-l | logger -t msktutil

Authentification NTLM

Installation de Samba et Winbind

Pour permettre l’authentification avec NTLM, il faut installer Samba et Winbind

$ sudo apt-get install samba winbind samba-common-bin

Configurer Samba

Comme pour les précédentes configuration, sauvegarder et supprimer celle de Samba

$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.ori
$ sudo echo > /etc/samba/smb.conf
$ sudo vim /etc/samba/smb.conf

Configurer le fichier smb.conf comme suit (en remplaçant le nom de domaine):

local master = no
workgroup = KNS7
security = ads
realm = KNS7.LOCAL
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes

Stopper les services Samba et Winbind

$ sudo /etc/init.d/smbd stop && /etc/init.d/winbind stop

Intégration du serveur au domaine via Samba

Pour intégrer le serveur, lancer la commande suivante:

$ sudo net ads join -U Administrator
Enter Administrator's password:
Using short domain name -- KNS7
Joined 'PROXYSERVER' to realm 'kns7.local'

Redémarrer Samba et Winbind

$ sudo /etc/init.d/smbd start && /etc/init.d/winbind start

Pour tester si l’intégration est conforme, lancer la commande suivante:

$ sudo wbinfo -t
checking the trust secret for domain KNS7 via RPC calls succeeded

Si la réponse est « succeeded », l’intégration du serveur est réussie.

Un second essai d’authentification via Active Directory

$ sudo wbinfo -a KNS7\\Administrator
Enter KNS7\Administrator's password:
plaintext password authentication succeeded
Enter KNS7\Administrator's password:
challenge/response password authentication succeeded

L’utilisateur proxy (utilisé par Squid) doit encore être ajouté au groupe winbindd_priv afin de pouvoir accéder à /var/run/samba/winbindd_privileged

$ sudo gpasswd -a proxy winbindd_priv

Puis ajouter une dernière action dans le crontab pour changer chaque jour le mot de passe du compte Ordinateur.

05 4    * * *   root    net rpc changetrustpw -d 1 | logger -t changetrustpw

Authentification Basic

Pour permettre une authentification basic, donc une interrogation via le protocolle LDAP de l’annuaire Active Directory, il faut installer les « outils LDAP »

$ sudo apt-get install ldap-utils

Ensuite, sous Active Directory, créer un utilisateur Windows permettant d’interroger AD.

Dans cet exemple, l’utilisateur s’appelle LDAP_User: CN=LDAP_User,CN=Users,DC=kns7,DC=local
Le mot de passe sera sauvegardé dans un fichier accessible par Squid /etc/squid3/ldappass.txt

Pour sécuriser ce fichier contenant le mot de passe:

$ sudo chgrp proxy /etc/squid3/ldappass.txt ; sudo chmod 640 /etc/squid3/ldappass.txt

Installation du Helper pour l’authentification avec Kerberos et NTLM

Afin de corriger certains bugs au niveau NTLM/Kerberos, il est nécessaire d’installer un binaire negotiate_wrapper

Installer les outils de compilation pour le serveur linux:

$ sudo apt-get install build-essential linux-headers-$(uname -r)

Puis télécharger les sources et compiler:

$ sudo cd /usr/local/src/
$ sudo wget "http://downloads.sourceforge.net/project/squidkerbauth/negotiate_wrapper/negotiate_wrapper-1.0.1/negotiate_wrapper-1.0.1.tar.gz"
$ sudo tar -xvzf negotiate_wrapper-1.0.1.tar.gz
$ sudo cd negotiate_wrapper-1.0.1/
$ sudo ./configure
$ sudo make
$ sudo make install

Paramétrage des options d’authentification dans Squid

Lorsque le serveur communique avec Active Directory, on peut continuer la configuration de Squid pour intégrer ces modes d’authentifications et déterminer ainsi des Access List (acl) et des règles d’accès (http_access)

Voici la configuration nécessaire pour activer l’authentification (Kerberos / NTLM / Basic) à placer à la suite dans le fichier /etc/squid3/squid.conf

#
# LDAP & Kerberos (Active Directory) Authentication
#
# Negociate kerberos and ntlm authentication
auth_param negotiate program /usr/local/bin/negotiate_wrapper -d --ntlm /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=KNS7 --kerberos /usr/lib/squid3/squid_kerb_auth -d -s GSS_C_NO_NAME
auth_param negotiate children 10
auth_param negotiate keep_alive off
# Pure ntlm Authentication
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 20
auth_param ntlm keep_alive off
# Provide basic ldap authentication for clients not authenticated via kerberos/ntlm
auth_param basic program /usr/lib/squid3/squid_ldap_auth -h dc1.kns7.local -D "CN=LDAP_User,CN=Users,DC=kns7,DC=local" -b "dc=kns7,dc=local" -W /etc/squid3/ldappass.txt -f "(samaccountname=%s)"
auth_param basic children 5
auth_param basic realm "Proxy Authentication"
auth_param basic credentialsttl 2 hours
# ldap authorisation
external_acl_type memberof %LOGIN /usr/lib/squid3/squid_ldap_group -R -K -b "dc=kns7,dc=local" -D "CN=LDAP_User,CN=Users,DC=kns7,DC=local" -W /etc/squid3/ldappass.txt -f "(&(objectclass=person)(sAMAccountName=%v))" -h dc1.kns7.local

 Configuration des règles d’accès et ACL

La configuration des règles d’accès (http_access) doit se faire dans un ordre bien précis (comme sur un Firewall)! Il est très important de bien vérifier l’ordre dans le fichier de configuration!

Pour plus de simplicité dans la gestion des règles et ACL (et pourquoi pas permettre l’édition de ces paramètres par un front-end), les paramètres acl et http_access seront inscrits dans des fichiers séparés, rattaché à la configuration de squid par la commande « include »

Définition des ACL

Pour forcer l’authentification, la première des acl (ci-dessous) doit être placée à la suite dans le fichier de configuration de squid

acl auth proxy_auth REQUIRED

Ensuite, on va inclure les acl « standards » pré-définies par Squid dans le fichier /etc/squid3/squid.conf/std_acl_definitions.conf et les acl personnalisées dans le fichier /etc/squid3/conf.d/my_acl_definitions.conf

Dans la configuration de squid (/etc/squid3/squid.conf) placer à la suite:

include /etc/squid3/conf.d/std_acl_definitions.conf
include /etc/squid3/conf.d/my_acl_definitions.conf

Voici à quoi ressemble le fichier std_acl_definitions.conf

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
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 CONNECT method CONNECT

Et pour ma configuration, voici à quoi ressemble my_acl_definitions.conf

acl NoCachedSites dstdomain kns7.org knet-solutions.com

Dans cet exemple, la seule acl définie, est une liste de sites (kns7.org et knet-solutions.com) qui ne seront pas « cachés ». La requête HTTP passera par le proxy, mais le résultat sera livré directement au client sans utiliser le cache du proxy.

Les acl sont très « personnelles » et doivent être naturellement configurées selon vos besoins. Mes exemples ne seront donc pas très révélateurs.

Pour une bonne compréhension des ACL http://www.squid-cache.org/Doc/config/acl/

Définition du Caching (cache)

Pour éviter que les sites faisant partie de l’acl NoCachedSites ne soient cachés, il faut ajouter l’option cache. Cela se fera également dans un fichier de configuration séparé pour continuer dans la même logique. Le fichier /etc/squid3/conf.d/my_cache.conf définira donc le type de cache

Ajouter à la suite du fichier de configuration de Squid la ligne suivante:

include /etc/squid3/conf.d/my_cache.conf

Et voici ce que contient le fichier /etc/squid3/conf.d/my_cache.conf

cache deny NoCachedSites

Pour plus d’informations sur l’option cache http://www.squid-cache.org/Doc/config/cache/

Définition des accès (http_access)

Après avoir défini les acl, il faut configurer ce que le proxy doit faire avec ces acl. Cela se fait par les http_access.

Je le répète, mais c’est très important, les http_access sont sensibles à l’ordre dans lequel ils sont définis!

Comme les ACL, les http_access seront définis dans un autre fichier de configuration. Dans cet exemple, il y aura donc deux fichiers: Le standard: /etc/squid3/conf.d/std_access.conf et le personnalisé /etc/squid3/conf.d/my_access.conf

 

Il faut donc ajouter à la suite du fichier de configuration de squid (/etc/squid3/squid.conf) les lignes suivantes:

include /etc/squid3/conf.d/std_access.conf
include /etc/squid3/conf.d/my_access.conf
http_access deny all

Ainsi, seront traitées en premier les accès ‘standard’ puis les accès spécifiques et enfin, tout ce qui ne sera pas pris en compte par ces accès sera refusé (la dernière ligne)

Voici à quoi ressemble le fichier /etc/squid3/conf.d/std_access.conf

# Only allow cachemgr access from localhost
http_access allow manager localhost

Cela permet à l’ACL « manager » d’avoir accès aux informations du Proxy via l’interface « localhost »

Et voici à quoi ressemble le fichier /etc/squid3/conf.d/my_access.conf

# Allow all Authenticated Users
http_access allow auth all

Ainsi, les utilisateurs authentifiés auront le droit de naviguer via le proxy.

Pour plus d’informations sur la configuration de l’option http_access http://www.squid-cache.org/Doc/config/http_access/

Le site suivant http://wiki.bitbinary.com/index.php/Active_Directory_Integrated_Squid_Proxy#Access_Groups (en anglais) propose une solution à base de groupes d’utilisateurs, ayant des droits d’accès différents ainsi qu’une catégorisation des sites web. Je trouve cette solution très intéressante. Mais c’est à vous de définir ce qui vous convient!

Configuration des Logs

La dernière partie du fichier de configuration de Squid concerne la gestion des logs. Dans cet exemple, les logs se situent sous /squid/logs (sur une partition distincte pour éviter de blinder le cache ou la partition root)

Cette partie de configuration doit être placée après la définition des ACL

#
# Logging Options
#
access_log /squid/logs/access.log
cache_log /squid/logs/cache.log
cache_store_log /squid/logs/store.log
cache_swap_log /squid/logs/cache_swap.log
icap_log /squid/logs/icap.log
debug_options 1
logfile_rotate 30

Le fait de mettre les logs après les ACL permet de créer des exceptions, de ne par exemple par logger un groupe d’utilisateur.

Récapitulatif du fichier de configuration Squid.conf

#
# SQUID CONFIGURATION
#
# Listen on Port 8080
http_port 8080
# Visible Hostname in Error Messages
visible_hostname vortex
# Hide Source IP Address
forwarded_for off
# Error Messages in German
error_directory /usr/share/squid3/errors/French/
# User / Group for Squid
cache_effective_user proxy
cache_effective_group proxy
# Cache Manager E-Mail address
cache_mgr [email protected]
#
# Caching Options
#
# Cache Directory (150GB / With min. 16 underdirectories and max. 256 underdirectories)
cache_dir diskd /squid/cache 153600 16 256
coredump_dir /squid/cache
# Minimum Object Size: 0!
minimum_object_size 0 KB
# The bigger the objects will be, slower will be the answers: 10MB
maximum_object_size 10 MB
# Lowest limit for Cache (in %)
cache_swap_low 90
# Highest Limit for Cache (in %)
cache_swap_high 98
# Max Cache capacity in Memory (RAM)
cache_mem 4 GB
# The highest size of Objects retains in RAM
maximum_object_size_in_memory 1 MB

#
# Connections Options
#
# Eject clients with unclean closed connections
half_closed_clients off
# Reject Persistent Server Connections
server_persistent_connections off
# Accept Persistent Client Connections
client_persistent_connections on
client_lifetime 1 day
# Connecting Timeouts for Connections
connect_timeout 50 seconds
request_timeout 50 seconds
persistent_request_timeout 50 seconds
read_timeout 2 minutes
# Aborting Downloads
quick_abort_min 20 KB
quick_abort_max 20 KB
# In Percentage
quick_abort_pct 90

#
# DNS Options
#
# Upper limit on how long Squid will cache positive DNS responses.
positive_dns_ttl 6 hours
# Default Time-to-Live (TTL) for failed requests.
negative_dns_ttl 2 minutes

#
# Refresh Patterns
#
# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320

#
# LDAP & Kerberos (Active Directory) Authentication
#
# Negociate kerberos and ntlm authentication
auth_param negotiate program /usr/local/bin/negotiate_wrapper -d --ntlm /usr/bin/ntlm_auth --diagnostics --helper-protocol=squid-2.5-ntlmssp --domain=KNS7 --kerberos /usr/lib/squid3/squid_kerb_auth -d -s GSS_C_NO_NAME
auth_param negotiate children 10
auth_param negotiate keep_alive off
# Pure ntlm Authentication
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 20
auth_param ntlm keep_alive off
# Provide basic ldap authentication for clients not authenticated via kerberos/ntlm
auth_param basic program /usr/lib/squid3/squid_ldap_auth -h dc1.kns7.local -D "CN=LDAP_User,CN=Users,DC=kns7,DC=local" -b "dc=kns7,dc=local" -W /etc/squid3/ldappass.txt -f "(samaccountname=%s)"
auth_param basic children 5
auth_param basic realm "Proxy Authentication"
auth_param basic credentialsttl 2 hours
# ldap authorisation
external_acl_type memberof %LOGIN /usr/lib/squid3/squid_ldap_group -R -K -b "dc=kns7,dc=local" -D "CN=LDAP_User,CN=Users,DC=kns7,DC=local" -W /etc/squid3/ldappass.txt -f "(&(objectclass=person)(sAMAccountName=%v))" -h dc1.kns7.local

#
# ACL Definitions
#
acl auth proxy_auth REQUIRED
include /etc/squid3/conf.d/std_acl_definitions.conf
include /etc/squid3/conf.d/my_acl_definitions.conf

#
# Caching Options
#

include /etc/squid3/conf.d/my_cache.conf

#
# http_access Rules
#
include /etc/squid3/conf.d/std_access.conf
include /etc/squid3/conf.d/my_access.conf
http_access deny all

#
# Logging Options
#
access_log /squid/logs/access.log
cache_log /squid/logs/cache.log
cache_store_log /squid/logs/store.log
cache_swap_log /squid/logs/cache_swap.log
icap_log /squid/logs/icap.log
debug_options 1
logfile_rotate 30

 

Mise en place de Webalizer

Pour avoir un outil de reporting sur l’utilisation du proxy et la navigation, l’outil Webalizer sera très utile.

Commencer par l’installation:

# apt-get install webalizer

Ensuite le configurer pour qu’il s’adapte à Squid, éditer le fichier de configuration /etc/webalizer/webalizer.confcomme suit:

#
# Webalizer Configuration for Squid
#
LogFile /squid/logs/access.log
LogType squid
OutputDir /var/www/webalizer

Incremental yes

ReportTitle Usage statistics for
HostName vortex

PageType htm*
PageType cgi
PageType php3
PageType php

HideURL *.gif
HideURL *.GIF
HideURL *.jpg
HideURL *.JPG
HideURL *.png
HideURL *.PNG
HideURL *.ra

IgnoreSite localhost
IgnoreReferrer localhost

SearchEngine yahoo.com p=
SearchEngine altavista.com q=
SearchEngine google.com q=
SearchEngine eureka.com q=
SearchEngine lycos.com query=
SearchEngine hotbot.com MT=
SearchEngine msn.com MT=
SearchEngine infoseek.com qt=
SearchEngine webcrawler searchText=
SearchEngine excite search=
SearchEngine netscape.com search=
SearchEngine mamma.com query=
SearchEngine alltheweb.com query=
SearchEngine northernlight.com qr=
SearchEngine sensis.com.au find=
SearchEngine google.nl q=
SearchEngine google.fr q=
SearchEngine google.ch q=
SearchEngine google.ca q=
SearchEngine google.be q=

Pour actualiser les statistiques, il suffit de lancer la commande webalizer

$ sudo webalizer
Webalizer V2.01-10 (Linux 3.2.0-29-generic) locale: de_DE.UTF-8
Verwende Protokolldatei /squid/logs/access.log (squid)
Using default GeoIP database
Erzeuge Dateien in /var/www/webalizer
Rechnername für Bericht ist 'vortex'
Datei mit historischen Daten nicht gefunden...
Daten des letzten Programmlaufes nicht gefunden...
Warnung: Überlanges Request-Feld abgeschnitten [217]
Warnung: Überlanges Request-Feld abgeschnitten [218]
Warnung: Überlanges Request-Feld abgeschnitten [219]
Warnung: Überlanges Request-Feld abgeschnitten [220]
Warnung: Überlanges Request-Feld abgeschnitten [222]
Speichere Daten des aktuellen Programmlaufes... [11/28/2012 12:42:33]
Erzeuge Bericht für November 2012
Erzeuge Zusammenfassung
Speichere historische Daten...
2335 Einträge in 1,50 Sekunden, 1556/sec

Afin d’automatiser les rapports, ajouter dans crontab la ligne suivante:

00 6    * * *   root    webalizer

Tous les jours à 6:00 seront générés les rapports d’utilisation du proxy.

 

 Sources

BitBinary: http://wiki.bitbinary.com/index.php/Active_Directory_Integrated_Squid_Proxy
Squid Website: http://www.squid-cache.org
Ubuntu: https://help.ubuntu.com/community/UbuntuBonding
SBARCIK.FREE.FR: http://sbarcik.free.fr/?p=28

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *