Tuto (Linux) : Installation d’un serveur Proxy SQUID + Authentification Active Directory

CE TUTO N’EST PLUS A JOUR MERCI D’UTILISER CE BILLET INSTALLATION SQUID3 + DANSGUARDIAN + CLAMAV + ADZAPPER

squid-cache_logo.jpg

Aller je me lance, dernièrement j’ai du mettre en place un serveur proxy, jusque la rien de bien complexe, l’installation d’un serveur SQUID est assez simple. Mais pour faire encore mieux j’ai décider d’authentifier mes utilisateurs afin de réellement savoir ce qu’il se passe dans mon réseau. Je ne cherchais pas forcement à faire du filtrage donc je ne traiterais pas en profondeur de l’installation de SQUIDGUARD mais plus à optimiser ma bande passante (fonction cache de SQUID) et ma vision sur l’utilisation d’internet dans mon LAN.

Le serveur est installé sur un serveur ESX, ce sera donc une machine virtuelle
• HDD 10Go
• 256 Mo de Ram
• 1 CPU

Et oui il ne faut pas grand chose pour un serveur de ce type, donc même si vous avez une vieille machine elle fera normalement très bien l’affaire. J’ai choisi la distribution Ubuntu 9.10 Edition Server car elle est stable et très bien maintenu, de plus la communauté présente derrière cette distribution permet de facilement trouver de l’aide. Bonau départ il n’y avait rien, il trouvait ça triste, donc il installa un joli serveur Ubuntu et se mis à faire ceci :

Mise à jour à la dernière version d’ubuntu-server disponible

sudo apt-get update
sudo apt-get upgrade

L’installation de Squid se fait par les paquets disponibles directement dans aptitude :

sudo apt-get install squid3
……………………………………………………………………
2009/12/08 15:29:00| Making directories in /var/spool/squid3/0C
2009/12/08 15:29:00| Making directories in /var/spool/squid3/0D
2009/12/08 15:29:00| Making directories in /var/spool/squid3/0E
2009/12/08 15:29:00| Making directories in /var/spool/squid3/0F
* Restarting Squid HTTP Proxy 3.0 squid3

Une fois l’installation terminée l’agent Squid démarre automatiquement, vous pouvez alors vérifier que tout est fonctionnel en spécifiant les options de proxy dans un des navigateurs web du Lan. Vous devriez obtenir la page suivante :

squid1.png

Pour infos les paramètres le port de Squid par défaut est le 3128.
Bien sûr pour le moment le proxy ne vous permet pas de communiqué avec l’extérieur, tout d’abord voici les manipulations à faire pour alléger au maximum le fichier de configuration de squid (/etc/squid3/squid.conf)

cd /etc/squid3
# sudo mv squid.conf squid.conf.origin
# sudo -s
# cat squid.conf.origin | egrep -v -e ‘^:blank:*#|^$’ > squid.conf

Ceci vous permettra d’obtenir un fichier de conf sans les commentaires qui sont omniprésents.

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
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
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
icp_access deny all
htcp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /var/log/squid3/access.log squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
icp_port 3130
coredump_dir /var/spool/squid3

• les « acl » (Access Control List) permettent de définir, par exemple, une plage d’adresses IP, celles qui constituent notre réseau local ;
• les « http_access » (restrictions) qui définissent l’autorisation ou l’interdit, pour une acl donnée.

Afin de faire fonctionner squid il faudra définir les acl : les sources de votre réseau et définir l’accès http_access pour chacune d’entre elle :

####DEFINITION DES ACCESS CONTROL LIST###################

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
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
acl DHCP src 10.1.0.0/16

##############LISTE DES AUTORISATIONS#################

http_access allow manager localhost
http_access allow manager
http_access allow !Safe_ports
http_access allow CONNECT !SSL_ports
http_access allow localhost
http_access allow DHCP
http_access deny all
icp_access deny all
htcp_access deny all

############# PORT D’ECOUTE DU PROXY ################

http_port 8080

####### NE PAS METTRE EN CACHE LES URLs COMPORTANT###

hierarchy_stoplist cgi-bin ?

############ EMPLACEMENT DU FICHIER DE LOG #########

access_log /var/log/squid3/access.log
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|\?) 0 0% 0
refresh_pattern . 0 20% 4320
icp_port 3130
log_mime_hdrs on

########### REPERTOIRE DE CACHE ####################

coredump_dir /var/spool/squid3
cache_effective_user proxy
cache_effective_group proxy
cache_mgr [email protected]
store_avg_object_size 5 GB
cachemgr_passwd cachemgr all

########## UTILISATION DE SQUIDGUARD REDIRECTION ###

#url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf
#url_rewrite_children 5

Une fois le fichier de configuration éditer comme ci-dessus pensez a redémarré le démon Squid :

# /etc/init.d/squid3 reload
Reloading Squid HTTP Proxy 3.0 configuration files.
done.

Vous devriez désormais avoir accès à internet depuis un navigateur de votre LAN en passant par le proxy, attention le port n’est plus celui par défaut mais le 8080.
Nous allons maintenant relier notre serveur proxy à l’annuaire Active directory, pour cela installer les paquets suivants :

# sudo apt-get update
# sudo apt-get install krb5-user krb5-config samba-common samba winbind likewise-open

Ensuite pour rejoindre un domaine il faudra taper la commande suivante pour chaque domaine :

# sudo domainjoin-cli join mondomaine.com adminitrateur

Attention le dernier domaine rentré sera le domaine par défaut de votre serveur, faite donc le domaine groupe-mttm.lo en dernier. Bien sur il faut utiliser le compte administrateur de domaine pour pouvoir rentré dans L’AD.

Enfin pour vérifier que votre serveur parvient à authentifier un user il faudra faire la commande suivante :

# sudo kinit –V [email protected]

Attention les majuscules ont une importance, la commande devrait vous répondre :

[email protected]:~$ sudo kinit -V [email protected] Password for [email protected]: Authenticated to Kerberos v5

Enfin pour vérifier les si vous avez obtenu un ticket Kerberos taper la commande suivante :

#sudo klist

Vous devriez obtenir la réponse suivante :

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting Expires Service principal
12/09/09 12:38:03 12/09/09 22:37:47 krbtgt/[email protected]
renew until 12/10/09 12:38:03

Il faudra ensuite configurer samba comme suis :

global
security = ADS
realm = MONDOMAINE.COM
#contrôleur de domaine password server = cad.mondomaine.com
workgroup = mondomaine.com
winbind separator = +
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /home/%D/%U
template shell = /bin/bash
client use spnego = yes
winbind use default domain = yes
# empeche le client de devenir maitre explorateur
domain master = no
local master = no
preferred master = no
os level = 0

• workgroup correspond au nom « plat » du domaine Microsoft ;
• le realm correspond au royaume Kerberos ;
• la security = ADS (Active Directory Server) nécessite que la machine soit intégrée au domaine Microsoft et que le client kerberos soit installé et configuré, ce qui permettra d’utiliser ce protocole pour l’authentification des clients ;
• les password server sont bien entendu les contrôleurs de domaine Microsoft.

Modifier ensuite le fichier /etc/nsswitch comme suis :

passwd: compat winbind
group: compat winbind
shadow: compat

hosts: files dns
networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: nis

Modifier les privilèges sur le dossier winbind :

# sudo chown –R root :root /var/run/samba/winbindd_privileged

Redémarrer ensuite le tout avec les commandes suivantes :

# sudo /etc/init.d/winbind restart
# sudo /etc/init.d/samba restart

Enfin il faudra rejoindre le domaine AD avec la commande suivante :

# sudo net ads join -U administrateur -S cad.mon.domaine.com
Enter administrateur’s password:

Une fois le PC intégré au domaine vous devriez retrouver le compte ordinateur dans votre annuaire AD

Normalement il’y a tout ce qu’il lui faut pour identifier les utilisateurs désormais pour tester cela :

sudo ntlm_auth username=MONDOMAINE+user password=etpikoiencore NT_STATUS_OK: Success (0x0)

Vous pouvez aussi voir tout les utilisateurs/groupes authentifiable grâce aux commandes :

sudo wbinfo –u sudo wbinfo –g

Il faudra ensuite rajouter la ligne suivante au fichier /etc/squid3/squid.conf pour prendre en charge l’authentification AD :

auth_param ntlm program /usr/bin/ntlm_auth –helper-protocol=squid-2.5-ntlmssp

Comme ntlm_auth va être invoqué par l’utilisateur sous l’identité duquel squid est lancé (proxy pour Debian), il faudra que le répertoire /var/run/samba/winbindd_privileged soit accessible en lecture par l’utilisateur proxy. Voyons cela :

# ls -l /var/run/samba
total 604

drwxr-x— 2 root winbindd_priv 17 mar 18 11:56 winbindd_privileged

Un moyen propre de résoudre le problème est d’ajouter l’utilisateur proxy au groupe winbindd_priv :

Sudo usermod -a -G winbindd_priv proxy

Et rajouter/modifier ces lignes dans le squid.conf

ENORME MISE EN GARDE les lignes auth_param doivent être AVANT les lignes acls dans le fichier de conf !

auth_param ntlm children 5 auth_param ntlm keep_alive on acl password proxy_auth REQUIRED http_access allow DHCP password http_access allow LANSRV password

Normalement tout devrait fonctionner ainsi (penser à relancer Squid)

• Le client est un client du domaine

Si votre client est intégré au domaine et que l’utilisateur a donc ouvert une session authentifiée par un contrôleur de domaine, le navigateur (aussi bien IE que FireFox) devrait, s’ils sont configurés pour utiliser le proxy, envoyer automatiquement à Squid les informations nécessaires à l’authentification.

Autrement dit, l’utilisateur ne voit rien de particulier. L’administrateur, lui, verra dans les logs d’accès à Squid (/var/log/squid3/access.log) le nom de l’utilisateur qui a formulé les requêtes.

• Le client n’est pas un client du domaine

Imaginons qu’un utilisateur ait le droit de connecter son portable sur votre réseau, mais que ce portable n’est pas intégré au domaine Windows. Dans ce cas, un accès à Squid amènera une fenêtre de demande d’authentification. L’utilisateur devra alors disposer d’un compte sur le domaine Microsoft et indiquer son nom d’utilisateur « complet » :

DOMAINE\machin

L’installation de SquidGuard se fait par les paquets disponibles dans la distribution :

# sudo apt-get install squidguard

Donnons l’accès à l’utilisateur proxy sur le répertoire des logs

# sudo chown -R proxy:proxy /var/log/squid

Nous allons maintenant installer apache depuis les paquets :

# sudo apt-get install apache2

Maintenant nous allons placer les scripts cgi dans notre apache :

# gunzip /usr/share/doc/squidguard/examples/squidGuard.cgi.gz
# mv /usr/share/doc/squidguard/examples/squidGuard.cgi /usr/lib/cgi-bin/
# chmod +x /usr/lib/cgi-bin/squidGuard.cgi

Puis faire un premier fichier de configuration pour squidguard :

dbhome /var/lib/squidguard/db
logdir /var/log/squid

#
# TIME RULES:
# abbrev for weekdays:
# s = sun, m = mon, t =tue, w = wed, h = thu, f = fri, a = sat

#
# REWRITE RULES:
#

#rew dmz {
# [email protected]://admin/@://admin.foo.bar.no/@i
# [email protected]://foo.bar.no/@://www.foo.bar.no/@i
#}

#
# SOURCE ADDRESSES:
#

src admin {
ip 10.1.20.2
}

#
# DESTINATION CLASSES:
#

dest good {
}

dest local {
}

#dest adult {
# domainlist adult/domains
# urllist adult/urls
# expressionlist adult/expressions
# redirect //admin.foo.bar.no/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
#}

acl {
admin {
pass any
}

default {
pass local none
redirect //127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
}
}

Normalement ici seul l’adresse ip 10.1.20.2 pourra accéder à internet les autres adresses réseau seront automatiquement redirigé vers le script CGI. Pour faire un test il faudra décommenter les lignes suivantes dans le squid.conf et redémarrer Squid.

url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf url_rewrite_children 5 # /etc/init.d/squid3 reload

Maintenant nous allons configurer les blacklist, afin de ne pas les créer à la main nous allons télécharger des blacklist maintenue par l’université de Toulouse.

Sudo -s
cd /var/lib/squidguard/db/
wget ftp://ftp.univ-tlse1.fr/blacklist/blacklists.tar.gz
tar xzf blacklists.tar.gz
cd /var/lib/squidguard/db/
chown -R proxy:proxy blacklists

Allons voir ce qu’il y a dans ces divers sous-répertoires. Le répertoire porn est sans doute le plus intéressant :

• domains contient une liste de domaines à interdire ;
• expressions est vide ;
• nurls contient des URLs ;
• urls contient également des URLs ;
• usage indique la nature de cette destination (liste noire, pornographie) ;
• very_restrictive_expression contient quelques expressions régulières bien senties (attention aux ressources consommées par ces expressions).

Dans squidGuard.conf, nous allons tenir compte de ces divers sous-répertoires :

dest pornographie {
urllist porn/urls
urllist porn/nurls
domainlist porn/domains
expressionlist porn/very_restrictive_expression
}

Ce qui nous donne un squidGuard.conf :

bhome /var/lib/squidguard/db/blacklists
logdir /var/log/squid

#
# TIME RULES:
# abbrev for weekdays:
# s = sun, m = mon, t =tue, w = wed, h = thu, f = fri, a = sat

#
# REWRITE RULES:
#

#rew dmz {
# [email protected]://admin/@://admin.foo.bar.no/@i
# [email protected]://foo.bar.no/@://www.foo.bar.no/@i
#}

#
# SOURCE ADDRESSES:
#

src DHCP {
ip 10.1.0.0/16
}

src LANSRV {
ip 10.99.99.0/24
}

#
# DESTINATION CLASSES:
#

dest pornographie {
urllist porn/urls
urllist porn/nurls
domainlist porn/domains
expressionlist porn/very_restrictive_expression
}

acl {

default {
pass !pornographie any
redirect //127.0.0.1/cgi-bin/squidGuard.cgi?clientaddr=%a+clientname=%n+clientident=%i+srcclass=%s+targetclass=%t+url=%u
}
}

Faites très attention à ce que vous écrivez dans ce fichier de configuration, les fautes de frappe sont très vite arrivées, les copier/coller peuvent entraîner des oublis, certains répertoires de listes contiennent des domaines, des urls, des expressions, d’autres non. Il faut être très minutieux dans cette écriture, les causes d’erreurs sont très nombreuses ! (Vous voilà prévenus).

Il existe cependant, comme nous allons le voir, un moyen de vérifier qu’il n’y a pas d’erreurs. En effet, ce n’est pas parce que le fichier de configuration est rédigé que le travail est terminé. SquidGuard, pour pouvoir travailler rapidement, n’utilise pas les fichiers texte, mais des bases de données au format Berkeley. Il est vivement conseillé de construire ces bases avant le démarrage de squid (et donc de squidGuard), faute de quoi, ces bases seront construites à la volée, pour chaque instance de squidGuard. Nous en avons ici 5, mais pour un gros site, 20 à 25 peut être plus adapté. Dans de telles conditions, le démarrage peut largement dépasser le quart d’heure !

La commande squidGuard -C all va permettre de construire ces bases de données sur disque, et squidGuard les utilisera alors au démarrage, ce qui fera gagner énormément de temps.

su proxy squidGuard -C all

• il est donc nécessaire de porter une grande attention à la rédaction du fichier de configuration il est également nécessaire de construire les bases de données Berkeley après avoir écrit le fichier de configuration, car seules les destinations définies dans ce fichier seront compilées (vous trouverez des fichiers domains.db et urls.db dans les destinations utilisées). Autrement dit, si vous devez ajouter une configuration par la suite, il faudra penser à la compiler ;
• squidGuard -C all part du principe que le fichier de configuration de squidGuard se trouve (pour Debian) dans /etc/squid/. Si vous voulez à tout prix placer sa configuration ailleurs, il vous faudra utiliser l’option -c : squidGuard -c /etc/squid3/squidGuard.conf -C all par exemple ;
• le fichier de logs de squidGuard est d’un grand secours pour cette opération, car il avertira de tout problème de configuration.

11 réponses sur “Tuto (Linux) : Installation d’un serveur Proxy SQUID + Authentification Active Directory”

  1. Bonjour
    j’ai un problème avec mes machines clientes intégrer dans active directory après la configuration de mon proxy squid qui marche bien, l’intégration de la machine linux dont j’ai installer et configuré proxy squid s’est bien passé si je fait wbinfo -t, wbinfo -u, wbinfo -g tout va bien et aussi le net ads join -U Administrateur passe normalement.
    l’architecture de mon réseau se présent de cette maniéré j’ai un server Windows 2008 dont j’ai fait la configuration de mon active directory et la machine Windows server 2008 possede un dns et un dhcp. j’ai des machine windows xp comme client qui sont intégrer au domain d’active directory dont leur passerelle et la machine linux proxy qui aussi intégré au domain et j’ai aussi configurer les navigateur a utiliser mon proxy. quant j’essai d’accéder a un site par mon navigateur j’ai se message server failure : the name server was unable to process this query et si je fait nslookup avec //www.google.com depuis la machine windows xp j’ai ce message dns timed out.
    quelqu’un pourrais m’aider.
    Merci

  2. Bonjour,
    J’ai un problème après la configuration du squid avec l’authentification, Je configure mon proxy sur le navigateur et là, il me met que le proxy refuse la connexion.
    Merci

  3. Si aucune ACLs n’est configuré c’est normal il faut maintenant créer des acess list et indiqué au proxy qui a le droit ou non de passer sur internet.

  4. Il en faut pas recopier completement mes fichiers de conf aussi cela dépend de l’IP source de votre LAN dans mon exemple mon LAN est configuré sur le réseau source

    acl DHCP src 10.1.0.0/16
    http_access allow DHCP

    Il faut adapté les fichier de conf a votre configuration

  5. Bonjour,
    C’est bon ça marche merci, par contre est ce que vous connaissez la ligne de code qui permet à l’utilisateur de s’authentifier une fois toutes les 2 heures par exemple et pas à chaque lancement du navigateur.

    Merci encore

  6. De souvenir normalement si l’intégration avec l’annuaire LDAP est faite correctement l’utilisateur n’a pas à fournir de mot de passe si il utilise IE (compatible NTLM) il faudrai faire une recherche sur le NTLM et SQUID.

    Je n’utilise plus cette solution depuis longtemps et je n’ai donc plus de lab pour tester, j’utilise maintenant la distribution pfsense qui me permet de faire la même chose que le couple squid/squidguard en plus de faire office de firewall.

  7. lorsque vous taper cette commande sur votre serveur vous avez bien un Status OK

    sudo ntlm_auth username=MONDOMAINE+user password=etpikoiencore NT_STATUS_OK: Success

  8. Je pense mettre mal exprimé, l’authentification marche bien avec mon AD. L’utilisateur a accès au web quand il s’est identifié.
    Mais j’aimerais que l’authentification dur 2 heures. Car pour le moment l’utilisateur doit à chaque ouverture du navigateur, s’identifier à nouveau.

    On veut mettre en place Squid3 +squidGuard dans l’entreprise. Pour l’instant je teste Squid3 avec authentification AD donc ce tuto est suffisant.
    Merci.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.