**Mise en place d'un proxy SQUID** Avertissement : ce tutoriel date un peu, mais reste valable dans ses principes. Il m'a servi de support de cours voici 2 ans maintenant. Ce document reprend une grande partie du travail de **Christian Caleca**, mainteneur du site http://irp.nain-t.net. L'article source peut être vu via le lien suivant : [[http://irp.nain-t.net/doku.php/220squid:start]]. J'ai simplement utilisé cette base pour faire un cas pratique et opérationnel rapidement. =====Présentation===== L'objectif ici est de décrire l'installation d'un proxy Squid sous Debian. La version de Debian est la 5.0, nom de code "Lenny". Cette version est officiellement sortie le 14 février 2009. Les exemples présentés ici sont compatibles avec la version 4.0 dite "Etch". Le serveur utilisé est une machine très standard type, RAM 1Go et disque dur SATA de 72Go. Un proxy ne réclame pas beaucoup de ressource et si vous avez moins de 50 utilisateurs un PC déclassé avec 256Mo suffit, le disque doit toutefois être rapide et avec au moins 40Go de dispo. ====Pourquoi choisir la distribution Debian ?==== Avant tout, ses qualités techniques : Debian est réputée pour sa stabilité, pour son très bon système d'installation de mise à jour des composants logiciels et pour sa rapidité à réparer les failles de sécurité. Debian est reconnu pour son sérieux et ses fortes prises de positions dans le monde libre. Debian garantit la liberté des logiciels qu'elle propose ! Debian est si attachée au logiciel libre que cet engagement est formalisé dans un document écrit : Le Contrat social. Pour plus d'information ne pas hésiter à consulter le site officiel [[http://www.debian.org|http://www.debian.org]] Beaucoup d'entreprises rechignent à utiliser Debian parce qu'il n'y a pas de structure commerciale et donc pas de maintenance. Ce qui est faux. Certes il n'y a pas de "société Debian", mais il existe moult prestataires informatiques, [[http://h20219.www2.hp.com/services/us/en/consolidated/os-debian.html|dont Hewlett-Packard]], en France pouvant parfaitement accompagner les entreprises et offrir du support sur Debian. =====Installation de Debian===== L'installation de l'OS est souvent une tache négligée, pour aller vite, on installe tous les logiciels avec un partitionnement par défaut. Dans la mise en place d'un proxy, il est inutile d'installer des packages ne servant à rien. Il est important de bien maîtriser l'installation et de ne configurer que le strict minimum. A la fin d'installation l'unique service devant tourner est ssh. Une installation Debian de base ne prend pas plus de 30 minutes. Il est souvent fait reproche à Debian de ne pas disposer d'un installateur graphique et simple comme on en retrouve sous Ubuntu. Toutefois pour rester dans l'esprit du véritable "admin Linux", le mode caractère sera utilisé, ainsi que l'installation en mode expert afin de paramétrer correctement toutes les options. Il s'agit de mettre en place un service dédié, une installation rapide avec les options par défaut est inadaptée. ====Premier boot==== L'installation se fera via le CD netinstall, il s'agit d'un CD minimal qui charge les composants depuis l'Internet. L'image ISO de ce CD est disponible sur le site Debian ( [[http://cdimage.debian.org/debian-cd/5.0.2a/i386/iso-cd/debian-502a-i386-netinst.iso|http://cdimage.debian.org/debian-cd/5.0.2a/i386/iso-cd/debian-502a-i386-netinst.iso]] ). Une fois l'image ISO gravée, booter le serveur sur le CD afin d'afficher l'écran suivant et choisir l'option "Advanced options" L'objectif ici n'est pas de détailler chaque étape de l'installation mais de donner des points de repère. Dans le menu "Advanced options", choisir "Expert install". * Pour la sélection du codage des caractères choisir UTF-8, cela évite bien des surprises à postériori, * Ne pas démarrer les services de cartes PC qui sont relatifs au PCMCIA, * Accepter de configurer l'horloge via NTP, cette option n'existe pas sous Etch, c'est une nouveauté Lenny en installation, * Configurer ensuite l'interface réseau, en principe un serveur est en IP fixe. Dans les exemples du livre, les IP seront du type : 192.168.1.x ====Partitionnement disque, généralités==== Il s'agit d'un point crucial qu'il importe de paramétrer avec soin. Il est impératif de partitionner le disque supportant l'OS pour des raisons qui seront exposées plus loin. Comme il s'agit de la configuration d'un serveur proxy, le disque est important notamment sur la ou les partitions recevant les traces ( les logs ). Par défaut les logs sont sous /var/log, dans le cas de Squid il est intéressant de mettre les logs sur un voir des disques séparés. ====Partitionnement disque utilisé==== ^ Partitions primaires ^^^ ^Point de montage ^Taille ^Type FS ^ | /boot | 100 Mo | Ext2 | | swap | 2 048 Mo | swap | | / | 500 Mo | Ext3 | ^ Partitions logiques ^^^ ^Point de montage ^Taille ^Type FS ^ | /usr | 5 000 Mo | Ext3 | | /usr/local | 5 000 Mo | Ext3 | | /opt | 10 000 Mo | Ext3 | | /var | 2 000 Mo | Ext3 | | /tmp | 1 000 Mo | Ext3 | | /home | le reste | Ext3 | Remarque : LVM n'est pas utilisé, cela reste bien sur possible. Les valeurs indiquées ci-dessus n'ont à ce jour posées aucun problème. La partition /var est réduite, car les logs proxy seront écrits sur la partition /home. La partition /boot doit toujours être la première du disque. Il est d'usage de ne pas mettre cette partition sur un système de fichier journalisé. ====La zone de swap==== Historiquement il était d'usage de calibrer la swap à 2 fois la RAM. Les serveurs étant dotés de RAM conséquentes ( 8Go est courant ), cette règle est obsolète, il convient d'appliquer maintenant le mode de calcul suivant : * RAM jusqu'a 1Go -> swap = 2 x RAM * RAM de 1Go à 4Go -> swap = RAM * Au dela swap = 0.5 x RAM ====Pourquoi partitionner ?==== Déjà pour éviter de bloquer le système par l'engorgement du disque. Le répertoire /var, comme son nom l'indique, est sujet à de grandes variations car il contient les fichiers traces, notamment le répertoire /var/log. Par sécurité ensuite, afin de ne pas bloquer un serveur par saturation d'espace disque ou encore d'interdire l'installation sauvage de logiciel. Le partitionnement permet de sécuriser simplement un serveur. L'objectif ici n'est pas de décrire la sécurisation complète d'un serveur, pour cela consultez [[http://www.debian.org/doc/manuals/securing-debian-howto/index.fr.html|le manuel de sécurisation complet]] proposé sur le site Debian. Ci-dessous un extrait relatif aux partitions. Un schéma de partitionnement dépend de l'utilisation de la machine. Une bonne règle est d'être assez large avec vos partitions et de faire attention aux facteurs suivants : * Une arborescence de répertoires modifiables par un utilisateur, telles que /home, /tmp et /var, doit être sur une partition distincte. Cela réduit le risque qu'un déni de service provoqué par un utilisateur ne remplisse votre point de montage « / » rendant ainsi le système inutilisable (Note : ce n'est pas strictement vrai car il existe toujours un espace réservé à l'utilisateur root qu'un utilisateur normal ne pourra pas remplir) et cela empêche les attaques de « liens durs » . Il est également intéressant d'interdire de lancer des exécutables depuis ces répertoires en ajoutant la clause noexec. La partition /var contient les paquets téléchargés par aptitude install et sont stockés dans /var/cache/apt/archives. Il est d'ailleurs conseillé une fois l'installation faite de purger ce répertoire par la commande suivante : //aptitude clean//. * Toute partition où vous voulez installer des logiciels ne faisant pas partie de la distribution devrait être sur une partition distincte. Selon le standard sur la hiérarchie des fichiers (FHS), c'est /opt ou /usr/local. Si ce sont des partitions distinctes, elles ne seront pas effacées si vous devez réinstaller Debian. * D'un point de vue sécurité, il est bien d'essayer de mettre les données statiques sur une partition et de monter celle-ci en lecture seule. /usr, /usr/local et /opt sont directement concernées, ainsi il est impossible d'installer des logiciels sans déverouiller le mode read-only. Dans le cas d'un serveur de courriers, il est important d'avoir une partition séparée pour le répertoire des courriers (spool). Les utilisateurs distants (soit consciemment, soit inconsciemment) peuvent remplir le répertoire des courriers (/var/mail ou /var/spool/mail). Si le répertoire est sur une partition séparée, cette situation ne rendra pas le système inutilisable. Sinon (si le répertoire est sur la même partition que /var), le système pourrait avoir d'importants problèmes : les entrées des journaux ne seront pas créées, aucun paquet ne pourra plus être installé et certains programmes pourraient même avoir des problèmes à être exécutés (s'ils utilisent /var/run). Ces règles simples ne sont évidement pas la panacée, mais c'est un début. Ci dessous quelques options possibles pour le montage des partitions. * nosuid - Impossibilité d'utiliser des programmes set SUID/SGID sur cette partition. * nodev - Impossible de créer des device sur cette partition * noexec - Interdire l'exécution de programme sur cette partition * ro - Montage de la partition en mode lecture seule * rw - Montage en lecture/écriture. * quota - Mise en place de quota disque. La clause defaults, qui est mise par défaut par l'installateur, correspond aux options suivantes : rw, suid, dev, exec, auto, nouser, et async. Voici le contenu du fichier /etc/fstab une fois tous les packages mis en place. Mettre en place cette configuration une fois la machine en production uniquement. # /etc/fstab: static file system information. # # proc /proc proc defaults 0 0 /dev/hda3 / ext3 errors=remount-ro 0 1 /dev/hda1 /boot ext2 defaults 0 2 /dev/hda10 /home ext3 rw,nosuid,nodev,noexec 0 2 /dev/hda7 /opt ext3 ro 0 2 /dev/hda9 /tmp ext3 rw,nosuid,nodev,noexec 0 2 /dev/hda5 /usr ext3 ro 0 2 /dev/hda6 /usr/local ext3 ro 0 2 /dev/hda8 /var ext3 rw,nosuid,nodev,noexec 0 2 /dev/hda2 none swap sw 0 0 Une fois le partitionnement effectué, choisir d'installer un noyau avec juste les pilotes utiles, la version du noyau livrée avec Lenny est la 2.6.26. ====Connexion du root ?==== Doit-on ou non autoriser les connexions directes du root ? En principe non, il faut créer un utilisateur qui accèdera aux droits root via la commande sudo. Ce principe, populaire notamment sur Ubuntu est à privilégier sur un serveur. Cet ouvrage à fait le choix de systématiquement utiliser sudo. Il est toutefois possible de se mettre root et ainsi ne plus préfixer par sudo chaque commande en utilisant //sudo -i// ====Suite et fin d'installation==== Il faut ensuite choisir un miroir sur le réseau pour l'installation des logiciels et éventuellement configurer le proxy si celui-ci est présent. Choisir ensuite de ne pas installer de logiciels non libres ou de la branche contrib. Le système demande alors les dépots de mise à jour, Lenny intègre par défaut les serveurs de la branche volatile qui servent pour les fonctions anti-spam et anti-virales principalement, ce dépot dans le cas d'un proxy dédié peut être retiré. Lors de l'affichage de la sélection des logiciels, ne rien installer, décocher toutes les cases. Sur un serveur il ne faut installer que ce qui est utile et rien d'autre. L'installation se termine alors et le système redémarre, il est impossible de se connecter à distance au serveur, pour cela il faut implanter le package ssh ( telnet est à proscrire ) par la commande aptitude. sudo aptitude install ssh Il importe de configurer correctement ssh en éditant le fichier /etc/ssh/sshd_config et en y placant l'adresse IP réelle du serveur dans la clause ListenAddress : sudo vi /etc/ssh/sshd_config # Package generated configuration file # See the sshd(8) manpage for details # What ports, IPs and protocols we listen for Port 22 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: ListenAddress 192.168.1.100 Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes ... Une fois le fichier sauvegardé, redemarrer ssh sudo /etc/init.d/ssh restart Le serveur est alors opérationnel. ====Post-installation==== Bien que pleinement fonctionnel, il est utile de mettre en place différents packages afin d'utiliser au mieux le serveur. sudo aptitude install lshw vim postfix ntpdate Par défaut Debian utilise le serveur de messagerie Exim, je lui préfère Postfix. Accepter les options par défaut demandées par debconf, l'objectif est uniquement d'avoir un serveur de messagerie local. Le package vim permet d'obtenir toutes les fonctions de l'éditeur, en particulier la coloration syntaxique qui se paramètre dans le fichier /etc/vim/vimrc en decommantant la ligne suivante : sudo vi /etc/vim/vimrc ... " Vim5 and later versions support syntax highlighting. Uncommenting the next " line enables syntax highlighting by default. syntax on ... **Configurer vim comme éditeur par défaut.** Certaines commandes lancent automatiquement l'éditeur de texte, c'est le cas par exemple de visudo. Par contre par défaut ce n'est pas vim mais nano qui est utilisé. Personnellement, je trouve cela gênant. Tout ceci se paramètre via la commande update-alternatives. Afin donc de stipuler vim comme éditeur par défaut, utiliser les commandes suivantes : sudo update-alternatives --config editor Il y a 4 alternatives fournissant « editor ». Sélection Alternative ----------------------------------------------- 1 /bin/ed * 2 /bin/nano 3 /usr/bin/vim.tiny 4 /usr/bin/vim.basic Appuyez sur Entrée pour conserver la valeur par défaut[*] ou choisissez le numéro sélectionné : Choisir 4 pour vim. Le package lshw, permet d'obtenir une visualisation de la configuration matérielle du serveur. erik@debian01:~$ sudo lshw -short H/W path Device Class Description ======================================================== system DIM4500 /0 bus D845EPT2 /0/1 memory 64KiB BIOS /0/5 processor Intel(R) Pentium(R) 4 CPU 2.00GHz /0/5/6 memory 8KiB L1 cache /0/5/7 memory 512KiB L2 cache /0/1d memory 512MiB System Memory /0/1d/0 memory DIMM DDR Synchronous 266 MHz (3.8 ns) [empty] /0/1d/1 memory 512MiB DIMM DDR Synchronous 266 MHz (3.8 ns) /0/100 bridge 82845 845 [Brookdale] Chipset Host Bridge /0/100/1 bridge 82845 845 [Brookdale] Chipset AGP Bridge /0/100/1/0 display NV17 [GeForce4 MX 420] /0/100/1d bus 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 /0/100/1d/1 usb1 bus UHCI Host Controller /0/100/1d.1 bus 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 /0/100/1d.1/1 usb2 bus UHCI Host Controller /0/100/1d.1/1/1 input Basic Optical Mouse /0/100/1d.1/1/2 input USB Multimedia Keyboard /0/100/1d.2 bus 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 /0/100/1d.2/1 usb3 bus UHCI Host Controller /0/100/1d.7 bus 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller /0/100/1d.7/1 usb4 bus EHCI Host Controller /0/100/1e bridge 82801 PCI Bridge /0/100/1e/0 network 3Com Corporation /0/100/1e/1 eth0 network RTL-8139/8139C/8139C+ /0/100/1e/2 network 88w8335 [Libertas] 802.11b/g Wireless /0/100/1f bridge 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge /0/100/1f.1 storage 82801DB (ICH4) IDE Controller /0/100/1f.1/0 ide0 bus IDE Channel 0 /0/100/1f.1/0/0 /dev/hda disk 81GB Maxtor 6L080L0 /0/100/1f.1/0/0/1 /dev/hda1 volume 94MiB Linux filesystem partition /0/100/1f.1/0/0/2 /dev/hda2 volume 972MiB Linux swap volume /0/100/1f.1/0/0/3 /dev/hda3 volume 478MiB EXT3 volume /0/100/1f.1/0/0/4 /dev/hda4 volume 74GiB Extended partition /0/100/1f.1/0/0/4/5 /dev/hda5 volume 4769MiB Linux filesystem partition /0/100/1f.1/0/0/4/6 /dev/hda6 volume 4769MiB Linux filesystem partition /0/100/1f.1/0/0/4/7 /dev/hda7 volume 9538MiB Linux filesystem partition /0/100/1f.1/0/0/4/8 /dev/hda8 volume 1906MiB Linux filesystem partition /0/100/1f.1/0/0/4/9 /dev/hda9 volume 956MiB Linux filesystem partition /0/100/1f.1/0/0/4/a /dev/hda10 volume 53GiB Linux filesystem partition /0/100/1f.1/1 ide1 bus IDE Channel 1 /0/100/1f.1/1/1 /dev/hdd disk HL-DT-STDVD-ROM GDR8164B /0/100/1f.3 bus 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller /0/100/1f.5 multimedia 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller erik@debian01:~$ Quand au package ntpdate, il permet une synchronisation horaire via le protocole ntp. Cette synchronisation est vitale sur un pproxy surtout si des plages horaires sont mises en place. Aussi il est bon de mettre dans le cron une ligne du type : vi /etc/crontab 00 00 * * * root ntpdate-debian Chaque jour à minuit, le serveur sera synchronisé. ====Apt-get vs aptitude==== La commande aptitude est la commande à privilégier par rapport à apt-get, et ce depuis la version Sarge de Debian. Avec la sortie de Lenny, Debian déconseille apt-get. La syntaxe est identique entre les deux commandes pour les options communes. Aptitude gère de manière plus efficace les dépendances que apt-get, notamment en supprimant les paquets inutiles lors d'une désinstallation. Ne pas hésiter à consulter la page de référence aptitude sur le site Debian [[http://www.debian.org/doc/manuals/reference/ch-package.fr.html|http://www.debian.org/doc/manuals/reference/ch-package.fr.html]]. Il importe de rajouter un point crucial : Pour la version Lenny, la commande aptitude upgrade est obsolète et il faut maintenant utiliser : aptitude safe-upgrade. Ci dessous un script standard de mise à jour de Debian. #/bin/sh aptitude update aptitude safe-upgrade Remarque : Il peut être tentant de mettre ce script dans le cron. A titre personnel je ne le fais plus, car j'aime contrôler les mises à jour. De plus la commande aptitude safe-upgrade demande parfois des réponses qui peuvent être automatiquement acceptées en passant l'option "-y". Cette pratique me semble dangereuse. Pour plus d'information il est possible de consulter la page anglophone suivante : [[http://pthree.org/2007/08/12/aptitude-vs-apt-get/|http://pthree.org/2007/08/12/aptitude-vs-apt-get/]] =====Proxy Squid===== Le Proxy Squid est un serveur mandataire qui sert, entre autres, à créer un cache d'URLs de façon à ce que celles les plus sollicitées par les navigateurs à l'intérieur du réseau local soient téléchargées une seule fois et réutilisées par les autres. Il permet aussi de définir des droit d'accès aux différents utilisateurs du réseau selon des règles définit dans des ACL (Access Control List). Les principaux fonctionnalités du proxy sont : * La journalisation des requêtes (« logging »). * Le cache. * La sécurité du réseau local. * Le filtrage et l'anonymat. La mise en place d'un serveur proxy ou mandataire HTTP présente de nombreux avantages, aussi bien en termes de sécurité que de contrôle parental, surtout dans le cadre d'établissements qui offrent à des mineurs la possibilité d'accès à l'internet (écoles, collèges, lycées, associations diverses…). Nous utiliserons Squid pour le proxy HTTP et SquidGuard pour l'élément de filtrage. Si une mise en place minimum de Squid ne présente guère de difficultés, l'insertion de SquidGuard reste tout de même plus délicate et mérite que l'on y passe un peu de temps. Transparent ou pas ? Nous verrons les avantages et inconvénients de chacune des méthodes. Identifier les utilisateurs ou se contenter de contrôler les accès de façon anonyme ? Nous envisagerons les deux possibilités. Bien que Debian soit utilisée ici, rien n'interdit de le transposer à une autre distribution, sous réserve d'utiliser des paquetages de bases de données Berkeley compatibles avec le fonctionnement de SquidGuard. =====Des passerelles entre réseaux===== Un petit rappel sur les modes d'inter-connexion réseaux est utile. La question de base est : //Comment permettre aux hôtes d'un réseau d'accéder aux hôtes d'un autre réseau ?// ====Cable==== {{:interco1.png|}} Au départ, nous disposons de deux réseaux physiques, construits avec des hubs. Il suffit de placer un câble, entre les deux. Cette solution simple inter-connecte au niveau le plus bas (couche physique), avec quelques contraintes et inconvénients : * Les trames émises par les nœuds de chaque réseau initial sont propagées sur l'autre réseau (en fait, il n'y a plus qu'un seul réseau physique) et le risque est grand de voir s'écrouler rapidement les performances du réseau ; * Du fait que nous sommes sur le même réseau physique, le réseau IP doit être également le même. Cette solution revient en fait à ajouter de nouveaux hôtes sur un réseau déjà existant. ====Le pont Ethernet==== {{:interco2.png|}} La même chose, mais avec un dispositif un peu plus intelligent qu'un simple bout de fil, puisque le pont évitera la propagation des trames qui ne concernent pas un hôte de l'autre réseau. L'interconnexion se fait ici au niveau 2. Au niveau IP, les contraintes restent les mêmes, nous sommes partout dans le même réseau IP. Cette solution est aujourd'hui complètement généralisée, puisque les switches ne sont rien d'autre que des ponts multivoies et donc, tirer un bout de câble entre deux switches revient à la solution du pont. ====Routeur IP==== {{:interco3.png|}} Ici, nous inter-connectons au niveau 3 (IP). Les deux réseaux disposent chacun de leur propre plan d'adressage IP. Les possibilités de contrôle d'accès d'un réseau à l'autre sont bien plus fines (filtrage de paquets genre Netfilter/IPtables). ====Le serveur mandataire==== {{:interco4.png|}} Nous travaillons ici au niveau du protocole d'application (HTTP pour ce qui nous concerne ici). Il existe deux types de serveurs mandataires : * **Le proxy normal**, qui nécessite que l'application cliente sache que le proxy existe et sache aussi travailler avec. En effet, dans ce cas, le client envoie ses requêtes au serveur mandataire, à charge pour lui d'aller chercher plus loin l'information réclamée par le client et de la lui transmettre, une fois l'information obtenue. Les clients HTTP (navigateurs) modernes savent tous le faire. C'est en revanche très rarement le cas pour d'autres protocoles comme POP, FTP, ... * **Le proxy transparen**t, qui agit dans la totale ignorance du client. Dans cette situation, le client croit s'adresser directement à la cible finale, mais la requête est interceptée et traitée par le mandataire. Cette solution, nécessaire le plus souvent pour des protocoles comme POP ou FTP où les clients ne savent pas utiliser de proxy, n'est pas obligatoire pour HTTP. Nous aurons l'occasion de rediscuter de ce choix. Dans l'illustration, les hôtes du réseau de gauche accèderont aux informations fournies par les serveurs HTTP du réseau de droite via le serveur mandataire qui est dans leur réseau. Nous reviendrons plus loin sur cette architecture qui peut sembler peu évidente au premier regard. =====Objectif===== Installer un système de proxy cache pour HTTP. Ce proxy-cache propose deux fonctions principales : * L'optimisation de la bande passante sur le lien Internet, lorsque de nombreux clients sont connectés et qu'ils visitent plus ou moins les mêmes sites, à la condition, bien sûr, que ces sites ne soient pas trop dynamiques, ASP, JSP, PHP… ni chiffrés (HTTPS). Comme vous le constatez, la fonction cache présente de moins en moins d'intérêt. Il en reste un cependant, surtout pour les illustrations qui ne sont pas encore toutes en flash, * Le contrôle et le filtrage de l'accès à la toile, en se servant des URI et, éventuellement, des noms d'utilisateurs, si l'on fait de l'authentification de ces derniers, autant de choses qu'il est difficile, voire impossible de faire avec du filtrage de paquets. En effet, en travaillant au niveau du protocole HTTP, il devient possible de mettre en place des filtres d'URI, des analyses de contenu dans les documents, alors qu'au niveau IP, nous ne pourrions filtrer que sur des adresses et des ports. Tout responsable d'un réseau local à l'usage de mineurs et connecté à l'Internet se doit de mettre en place un tel système de filtrage de manière à éviter, autant que possible, l'accès à des sites que la morale réprouve, d'autant qu'il s'agit d'une obligation légale. =====Présentation générale===== ====Les modes de fonctionnement==== ^ Direct ^^ |{{:direct.png|}}|Un navigateur HTTP interroge directement le serveur cible et il reçoit directement les réponses de ce dernier. Il n'y a pas de filtrage possible, autrement que sur les adresses IP des serveurs cible.| ^ Normal ^^ |{{:proxy.png|}}|Le client demande au proxy d'interroger le serveur cible. Ce dernier répond au proxy qui communique alors la réponse au client. Dans ce mode, le client est configuré pour utiliser un proxy et il modifie les requêtes http en fonction.| ^ Transparent ^^ |{{:proxy_t.png|}}|Le client ignore l'existence du proxy. Il croit envoyer ses requêtes directement au serveur cible, mais ses requêtes sont détournées vers le proxy par le routeur. Le serveur cible répond au proxy qui retransmet la réponse au client, mais ce dernier croit l'avoir reçue directement du serveur cible.| Nous discuterons plus loin dans ce document de l'intérêt comparé des deux façons d'utiliser notre proxy. ====Le logiciel==== Squid, principal composant de ce système, assure les fonctions de : * Cache, pour optimiser la bande passante, * Identification des utilisateurs, nous en verrons une simpliste et une nettement plus complexe, * Filtrage d'accès basique, mais déjà intéressant. SquidGuard propose un filtrage très puissant d'accès au web, en fonction : * De groupes d'utilisateurs, définis de diverses manières. Ici, nous nous baserons sur des IPs ou des groupes d'IPs, mais il est possible d'utiliser l'identification des utilisateurs mise en place sur Squid, * De listes de domaines et d'URI qui serviront à définir soit des cibles autorisées, soit des cibles interdites (listes blanches, listes noires), * De plages horaires pendant lesquelles l'accès sera autorisé ou interdit Et bien d'autres choses encore, que nous ne verrons pas ici. ===Principe de fonctionnement=== Squid tourne en tâche de fond (daemon). Il écoute sur un port spécifique (3128 par défaut, mais il est possible d'utiliser 8080, plus habituel pour un proxy HTTP). L'éventuel module d'identification vient se greffer dessus, ce qui fait apparaitre un certain nombre de processus fils (5 par défaut). SquidGuard vient également se greffer dessus et apparait lui aussi sous la forme de processus fils (également 5 par défaut). Au total, une fois Squid configuré, il n'y aura qu'à démarrer Squid et les processus d'identification et de filtrage avancé démarreront avec. SquidGuard utilise le format de bases de données Berkeley pour travailler. Berkeley DB (BDB) est une base de données embarquée, ce qui rend son déploiement et son administration aisés. La base n'est composée que d'enregistrements dont le format est librement déterminé par le programme appelant. Il n'y a pas de notion de table, et la base n'est pas interrogeable via un langage de manipulation de données comme par exemple SQL. Chaque enregistrement est composé d'une paire clé / valeur, la clé n'étant pas unique. Pour définir ces bases, l'administrateur a recours à des fichiers au format texte qui seront pré compilés en base de données ou compilés à la volée, suivant la façon de travailler. Berkeley DB est utilisée aussi par le SMTP Postfix. Depuis 2006, ce produit est la propriété de Oracle. Nous verrons que les « destination groups » constituent des bases pré compilées, alors que les « blacklists » sont compilées à la volée et résident uniquement en mémoire. Ce principe est a éviter autant que possible, dans la mesure où il consomme énormément de ressources au démarrage de chaque instance de SquidGuard. ===Administration=== Il n'existe pas vraiment d'interface graphique satisfaisante pour administrer Squid. Il faudra donc utiliser directement les fichiers de configuration. Il faut faire très attention à ce que l'on fait et vérifier chaque fois que nécessaire que le but recherché est atteint. SquidGuard réserve pas mal de mauvaises surprises à ce propos. Dans le cas de SquidGuard principalement, une gestion fine des bases de données pour les groupes de destination et les blacklists ne pourra se faire qu'à partir de la ligne de commande. Nous ne ferons qu'effleurer le problème, si vous en arrivez là, c'est que vous êtes déjà assez pointus sur le sujet pour pouvoir vous débrouiller tout seul avec la documentation (pauvre et laconique, il faut bien le dire). ===Utiliser un proxy sur https=== Cette question, qui semble venir comme un cheveu sur la soupe, est tout de même l'une des premières questions à se poser, lorsque l'on désire mettre en place un serveur proxy comme Squid : * Sur https, les échanges sont chiffrés et ne peuvent être mis en cache. Utiliser Squid pour ses fonctions de cache n'offre ici aucun intérêt, * https authentifie au moins le serveur interrogé, de manière à ce que le client soit « sûr » qu'il s'adresse au serveur réellement choisi. Qu'advient-t-il de cette certitude, si la connexion passe par un intermédiaire ? Lorsque nous utilisons un serveur proxy de façon « volontaire » (par le paramétrage de notre navigateur), nous savons que ce paramétrage modifie le comportement dudit navigateur, qui va alors envoyer toutes ses requêtes sur le proxy (voir le chapitre sur HTTP). Dans une telle situation, si le client peut authentifier le serveur proxy, sa connexion https peut à la rigueur encore être considérée comme fiable. Dans ce cadre, Squid peut assumer cette fonction. Mais dans le cas du passage par un proxy « involontaire » (proxy transparent), le client ne sait pas qu'il passe par un tel dispositif, son navigateur n'est pas paramétré pour s'adresser à un serveur proxy, le trafic est dérouté de façon « transparente ». Dans une telle situation, la démarche deviendrait malhonnête, à supposer qu'il soit possible de le faire de façon fonctionnelle. =====Installation===== Nous partons d'une Debian Lenny de base, seul ssh est configuré. Au niveau du matériel, un PII 300 MHz, 256 Mo de RAM et 20 G0 de disque dur devraient largement suffire pour un réseau d'une centaine de postes. L'installation proprement dite est des plus simple : aptitude install squid3 Par défaut squid est lancé avec un user proxy dédié et écoute sur le port 3128. adi153:~# netstat -ltaupen Connexions Internet actives (serveurs et établies) Proto Recv-Q Send-Q Adresse locale Adresse distante Etat User Inode PID/Program name tcp 0 0 91.121.7.88:22 0.0.0.0:* LISTEN 0 8057 5261/sshd tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN 0 10811403 609/(squid) tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 0 8286 5342/master tcp 0 48 91.121.7.88:22 86.195.24.174:46317 ESTABLISHED 0 10805717 480/0 udp 0 0 0.0.0.0:3130 0.0.0.0:* 0 10811404 609/(squid) udp 0 0 0.0.0.0:48612 0.0.0.0:* 13 10811387 609/(squid) adi153:~# ps aux|grep proxy proxy 609 0.2 7.6 35508 18624 ? S 18:00 0:00 (squid) -D -YC proxy 612 0.0 0.3 2964 964 ? Ss 18:00 0:00 (unlinkd) root 778 0.0 0.3 3500 740 pts/0 R+ 18:01 0:00 grep proxy adi153:~# =====Configuration de base===== Les ACL (Access Control Lists) permettent de définir des conditions sur les IPs, les ports, le contenu de certains textes, ... Si vous voulez tout savoir sur les diverses ACL de Squid, consultez la documentation officielle. Le fichier de configuration est /etc/squid3/squid.conf. Il est copieusement commenté et je vous propose cette petite manipulation qui retire toutes les lignes blanches et les commentaires afin d'obtenir un vrai fichier de configuration : cd /etc/squid3 mv squid.conf squid.conf.origin cat squid.conf.origin | egrep -v -e '^[:blank:]*#|^$' > squid.conf Une fois épuré le fichier se présente ainsi : 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 Dans un premier temps, disons pour aller très vite au but, que : * les « acl » (Access Control List) permettent de définir, par exemple, un 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. Les restrictions indiquent quoi faire lorsque ces conditions sont vérifiées. On autorise ou on interdit en fonction d'une ACL ou d'un groupe d'ACLs, le sens de « restriction » est donc à prendre avec un peu de recul, une restriction pouvant être une autorisation. La première restriction vérifiée est la bonne, d'où l'importance de l'ordre dans lequel elles sont placées. Sans faire une analyse détaillée, nous voyons que dans la configuration par défaut, seul « localhost » peut utiliser le proxy (Allow localhost). Si cette condition n'est pas respectée, la règle suivante étant deny all, personne ne passe. Il nous faut donc faire intervenir la notion de réseau local. ====Créer une ACL représentant le LAN==== Bien entendu, l'idée de faire plutôt Allow all est une mauvaise idée. Si votre proxy a un pied dans l'Internet (s'il est installé sur la passerelle), vous risquez un proxy ouvert, avec tous les usages pervertis que l'on peut en faire. Modifions le fichier squid.conf de cette manière : 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 reseau_local src 192.168.0.0/24 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 allow reseau_local 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 Nous avons créé une ACL nommée reseau_local représentant notre réseau local //acl reseau_local src 192.168.0.0/24//, et lui avons donné l'autorisation de passer le proxy //http_access allow reseau_local//. Nous relançons squid : # /etc/init.d/squid3 reload Reloading Squid HTTP Proxy 3.0 configuration files. done. Il s'agit de l'unique manipulation pour disposer d'un proxy cache en état de marche pour un réseau local. ====Comment restreindre l'accès au web en se basant sur l'IP==== * Mettre les postes autorisés en IP fixe, par exemple de 192.168.0.10 à 192.168.0.20. * Puis déclarer l'acl ainsi : //acl reseau_local src 192.168.0.10-192.168.0.20// * Mettre les autres postes en DHCP hors plage autorisée. Ainsi seules les IP fixes accèdent au web. =====Affiner la configuration===== Il y a deux points importants, qu'il peut être utile d'étudier, et qui correspondent aux deux fonctions principales d'un proxy. ====Identifier les utilisateurs==== **Attention. Vous aurez des ennuis pour identifier vos utilisateurs, si vous comptez rendre votre proxy transparent. Les deux fonctionnalités sont incompatibles.** Dans la configuration mise en œuvre jusqu'ici, nous ne faisions pas de contrôle sur les utilisateurs, seulement sur les IPs des machines clientes. Vous pouvez souhaiter identifier vos utilisateurs lorsqu'ils vont surfer sur le Net. Dans ce cas, il vous faudra mettre en place un système d'identification et renoncer au mode transparent. Il y a plusieurs méthodes disponibles pour authentifier les utilisateurs du proxy. Elles font toutes appel à un programme extérieur, différent suivant le moyen choisi. Debian propose les modules suivants : squid_ldap_auth, msnt_auth, ncsa_auth, pam_auth, sasl_auth, smb_auth, yp_auth, getpwname_auth, ntlm_auth, digest_ldap_auth, digest_pw_auth… Nous verrons la méthode la plus simple via ncsa_auth qui permet d'identifier les utilisateurs à partir d'un fichier local de type //htpasswd//. Pour cela il est nécessaire d'implanter le package apache2.2-common afin d'obtenir la commande htpasswd. aptitude install apache2.2-common ===Construire un fichier d'utilisateurs=== Nous allons créer un fichier /etc/squid/users touch /etc/squid3/users Nous le remplissons ensuite avec la commande htpasswd, normalement fournie dans le paquet apache-common. htpasswd -b /etc/squid3/users Dans l'exemple, nous allons créer 3 users/mot de passe ainsi htpasswd -b /etc/squid3/users user1 azerty Adding password for user user1 htpasswd -b /etc/squid3/users user2 uiopqs Adding password for user user2 htpasswd -b /etc/squid3/users user3 dfghjk Adding password for user user3 Le fichier se remplit comme suit : cat /etc/squid3/users user1:bHKXpuog9KolY user2:o5ThIE493nPco user3:unLsXCc4AC.tc Les mots de passe sont chiffrés. Vérifions le fonctionnement, en lançant à la main le module d'authentification /usr/lib/ncsa_auth. Nous entrerons alors dans une boucle où il faudra entrer sur une ligne un nom d'utilisateur et son mot de passe, séparés par une espace : /usr/lib/squid3/ncsa_auth /etc/squid3/users user1 azerty OK user2 azerty ERR Wrong password user2 uiopqs OK user3 dfghjk OK user4 lmwxcv ERR No such user Le système répond par OK ou par ERR suivant que l'authentification réussit ou non. Sortez de la boucle avec un ctrl-d. ===Configurer squid pour réclamer l'identification de vos utilisateurs=== Nous devons commencer par fournir quelques directives de type auth_param qui sont à rajouter au début du fichier /etc/squid3/squid.conf: auth_param basic program /usr/lib/squid3/ncsa_auth /etc/squid3/users auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours * program, indiquez le chemin du module ncsa_auth, suivi du chemin du fichier des utilisateurs, séparés par une espace. * children, 5 est une valeur usuelle. Si vous avez de nombreux utilisateurs, il sera peut-être nécessaire d'augmenter ce nombre. * realm, n'est rien d'autre qu'un texte qui apparaîtra dans la fenêtre de demande d'identification. * credentialsttl, durée de vie de l'identification. A condition bien sûr que le navigateur ne soit pas fermé avant. Il nous faut maintenant créer une “acl” supplémentaire, pour obliger l'identification, acl users proxy_auth REQUIRED Puis n'autoriser l'accès que si le client est dans notre réseau et que l'identification est réussie : http_access allow reseau_local users Ceci nous conduit à un fichier de configuration de la forme : auth_param basic program /usr/lib/squid3/ncsa_auth /etc/squid3/users auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours 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 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 reseau_local src 192.168.0.0/24 acl users proxy_auth REQUIRED 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 allow reseau_local users http_access deny all icp_access allow all http_port 3128 hierarchy_stoplist cgi-bin ? access_log /var/log/squid3/access.log squid acl QUERY urlpath_regex cgi-bin \? cache deny QUERY refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 icp_port 3130 coredump_dir /var/spool/squid3 Application des changements, nous vérifions que maintenant le module d'authentification est bien chargé : /etc/init.d/squid3 reload ps aux|grep proxy proxy 609 0.0 7.9 36320 19384 ? R 18:00 0:00 (squid) -D -YC proxy 612 0.0 0.3 2964 964 ? Ss 18:00 0:00 (unlinkd) proxy 2380 0.0 0.2 2172 532 ? Ss 18:24 0:00 (ncsa_auth) /etc/squid3/users proxy 2381 0.0 0.2 2172 532 ? Ss 18:24 0:00 (ncsa_auth) /etc/squid3/users proxy 2382 0.0 0.2 2172 528 ? Ss 18:24 0:00 (ncsa_auth) /etc/squid3/users proxy 2383 0.0 0.2 2172 532 ? Ss 18:24 0:00 (ncsa_auth) /etc/squid3/users proxy 2384 0.0 0.2 2172 528 ? Ss 18:24 0:00 (ncsa_auth) /etc/squid3/users root 2386 0.0 0.3 3500 740 pts/0 R+ 18:24 0:00 grep proxy Cette fois-ci, il y est. Ca devrait donc fonctionner. Pour accéder au monde extérieur, Squid nécessite maintenant une identification. Si nous allons faire un petit tour dans les dernières lignes de /var/log/squid/access.log, nous constatons que le nom d'utilisateur figure pour chaque requête : ====Optimiser le cache==== Un proxy sert à optimiser la bande passante utilisée sur le Net, en permettant de garder en cache les pages les plus souvent visitées. Si c'est une de vos principales préoccupations, il sera probablement nécessaire d'agir sur les diverses options du cache. Passez alors du temps à lire la documentation. Vous pourrez agir sur la taille du cache, sa répartition sur les divers disques durs… Pour réaliser correctement une telle opération, il vous faudra installer d'abord des outils d'audit de performance dudit cache. Détailler ces opération ici nous mènerait trop loin. ====Rendre le proxy transparent.==== Attention !!! * Cette méthode est incompatible avec l'authentification des utilisateurs. Même si squid est configuré comme nous l'avons vu pour l'authentification ncsa, celle-ci ne fonctionnera plus. * Cette méthode ne supporte que HTTP. FTP est impossible en mode transparent, * Un seul port peut être redirigé de façon transparente, le 80, de préférence, puisque c'est le port habituel pour HTTP. Utiliser un proxy nécessite normalement de configurer son navigateur de manière à ce qu'il interroge toujours le proxy, quelle que soit la cible. Vos utilisateurs ont donc généralement la main sur ce paramétrage, et pourront probablement passer outre le proxy, s'ils le décident, contournant par le fait toutes vos stratégies. Il existe cependant deux moyens d'éviter ceci : * Utilisez votre firewall pour bloquer pour vos postes clients l'accès direct à l'Internet par les ports http et https (80, 443, 563…). De cette manière, vos utilisateurs n'auront d'autre possibilité que de passer par le proxy (sauf pour des serveurs exotiques, qui utiliseraient un autre port), c'est la seule manière possible si vous souhaitez identifier vos utilisateurs ; * Rendre le proxy transparent, ce qui veut dire que configurés ou non, les requêtes http passeront quand même par le proxy. Pour arriver à ce résultat, il faut réaliser deux opérations : * Rediriger en PREROUTING le port 80 (vous devrez vous contenter d'un seul port transparent) vers le port proxy sur son port (3128 par défaut pour squid), ça se fait sans problèmes sur votre routeur NAT avec IPtables, * Configurer correctement squid pour qu'il interprète convenablement les requêtes HTTP qu'il reçoit. ===La règle de redirection=== Voici la règle à ajouter sur votre passerelle, en admettant que votre réseau est dans 192.168.0.0 et que votre proxy possède l'adresse 192.168.0.252. Nous supposons que le proxy est installé sur la machine qui assure également le rôle de passerelle (commande à entrer sur une seule ligne, bien entendu) : iptables -t nat -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 Avec un routeur à trois voies, par exemple deux réseaux IP (disons 192.168.0.0 et 192.168.1.0), et un accès Internet, si le LAN est sur 192.168.0.0, il faudra placer le proxy sur 192.168.1.0, disons 192.168.1.2. La règle IPtables s'écrira alors : iptables -t nat -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.2:3128 Bien entendu, il faudra que le routage se fasse entre les réseaux 192.168.0.0 et 192.168.1.0. ===Paramétrage de Squid=== Comme nous l'avons vu dans le chapitre sur HTTP, Le client HTTP n'agit pas de la même manière suivant qu'il a affaire à un proxy ou non. Ici, le client ne sait pas qu'il y a un proxy, il agit donc comme s'il interrogeait directement le serveur cible, alors que ce n'est pas le cas. Ca ne fonctionnera bien entendu pas, si Squid n'est pas informé de cette situation. Mais Squid sait contourner la difficulté, de façon très simple depuis la version 2.6 au moins, en ajoutant simplement le mot « transparent » sur la ligne de définition du port utilisé : http_port 3128 transparent ===Conclusions=== Comme nous l'avons vu, la transparence du proxy entraîne de nombreuses restrictions. A moins que vous y teniez absolument, mieux vaut choisir une autre solution, principalement si vous voulez cacher le FTP et/ou faire passer le HTTPS par votre proxy (il n'y aura pas d'effet de cache, juste un transfert des données comme dans un tunnel) ou encore, si vous devez identifier vos utilisateurs. Dans la suite de cet exposé, squid ne sera pas transparent. Pour ce qui est du filtrage d'accès, il est possible de faire déjà des choses avec Squid tout seul, mais le « helper » SquidGuard que nous allons voir dans la suite rend inutiles les tentatives de filtrage avec les seuls moyens de Squid. =====Active Directory===== Il faut intégrer le serveur proxy dans un domaine AD, pour cela il faut donc disposer des utilitaires clients Kerberos 5, samba 3 et winbind. Installer les packages suivants : aptitude install krb5-user krb5-config samba-common samba winbind ====Configuration Kerberos==== Modifier le fichier /etc/krb5.conf [libdefaults] default_realm = ADIMCOR.EU dns_lookup_realm = false dns_lookup_kdc = false [realms] ADIMCOR.EU = { kdc = 192.168.0.1 kdc = 192.168.0.2 admin_server = 192.168.0.1 default_domain = ADIMCOR.EU } [domain_realm] .adimcor.eu = ADIMCOR.EU adimcor.eu = ADIMCOR.EU [logging] default = FILE:/var/log/krb5.log kdc = FILE:/var/log/krb5kdc.log admin-server = FILE:/var/log/krb5adm.log [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false } * les adresses IP indiquées par kdc dans le paragraphe [realms] correspondent aux contrôleurs de domaine Microsoft, * l'adresse IP indiquée par admin_server correspond au contrôleur « Maître d'opérations » avec les 5 rôles « FSMO ». La commande « kinit » va permettre de vérifier que l'on peut obtenir un ticket kerberos pour un utilisateur du domaine ActiveDirectory : # kinit -V user1@ADIMCOR.EU Password for user1@ADIMCOR.EU: Authenticated to Kerberos v5 La commande « klist » permet de lister les tickets obtenus : # klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: user1@ADIMCOR.EU Valid starting Expires Service principal 10/29/09 10:36:18 10/29/07 20:36:22 krbtgt/ADIMCOR.EU@ADIMCOR.EU renew until 10/29/09 20:36:18 Kerberos 4 ticket cache: /tmp/tkt0 klist: You have no tickets cached user1@adimcor.eu a bien été authentifié et le ticket kerberos a bien été reçu. ====Configuration de Samba==== Modifier le fichier /etc/samba/smb.conf [global] workgroup = ADIMCOR realm = ADIMCOR.EU security = ADS password server = 192.168.0.1 192.168.0.2 client use spnego = yes client ntlmv2 auth = yes syslog = 0 log file = /var/log/samba/log.%m max log size = 1000 announce version = 4 announce as = Poste XP dns proxy = No idmap uid = 167771-335549 idmap gid = 167771-335549 winbind use default domain = Yes invalid users = root * Le 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. Voir la configuration Samba pour les autres paramètres. ====Configuration de winbind==== Modifiez comme suit le fichier « /etc/nsswitch.conf » : 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 Relancez winbind et samba: # /etc/init.d/winbind restart Stopping the Winbind daemon: winbind. Starting the Winbind daemon: winbind. # /etc/init.d/samba restart Stopping Samba daemons: nmbd smbd. Starting Samba daemons: nmbd smbd. ====Intégration au domaine==== net ads join -U -S En principe, un message doit vous annoncer que l'opération s'est bien déroulée et vous devriez retrouver votre proxy dans les « computers » dans votre mmc de gestion de « Active Directory Users and Computers » ===Modification de squid.conf=== Modifier le fichier /etc/squid3/squid.conf en remplacant les lignes auth basic par : auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5 auth_param ntlm keep_alive on Puis créer une acl acl motdepasse proxy_auth REQUIRED Et lui donner le droit d'accès http_access allow motdepasse Au final le fichier /etc/squid3/squid.conf doit être similaire au modèle ci-dessous. auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5 auth_param ntlm keep_alive on 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 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 reseau_local src 192.168.0.0/24 acl motdepasse proxy_auth REQUIRED 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 allow reseau_local http_access allow motdepasse http_access deny all icp_access allow all http_port 3128 hierarchy_stoplist cgi-bin ? access_log /var/log/squid3/access.log squid acl QUERY urlpath_regex cgi-bin \? cache deny QUERY refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 icp_port 3130 coredump_dir /var/spool/squid3 =====SquidGuard===== SquidGuard est un complément à Squid permettant de gérer finement des listes de contrôle d'accès selon différents critères ( URL, expressions clefs, plages horaires... ) ====Installation==== Comme toujours sous Debian : aptitude install squidguard Attention squidguard positionne par défaut son fichier de configuration sous /etc/squid et non /etc/squid3. Ce n'est pas dans la suite une erreur de frappe. Ceci peut être modifié. ====Configuration minimale==== Seule la machine de l'admin pourra aller n'importe où, tous les autres hôtes du réseau resteront bloqués : dbhome /var/lib/squidguard/db logdir /var/log/squid3 src admin { ip 192.168.0.10 } acl { admin { pass any } default { pass none redirect http://127.0.0.1/proxy.html } } La page web proxy.html est à créer afin d'afficher un avertissement. Enfin, il faut configurer squid3 pour qu'il invoque squidGuard en ajoutant ces lignes à la fin de /etc/squid3/squid.conf : url_rewrite_program /usr/bin/squidGuard -c /etc/squid/squidGuard.conf url_rewrite_children 5 Et demander à squid de recharger sa configuration : /etc/init.d/squid3 reload ====Configuration des destinations==== Un ensemble de destinations est activement maintenu par le Centre de Ressources Informatiques de l'Université de Toulouse. Le plus simple est de charger le fichier complet et de le mettre en place sous /var/lib/squidguard/db. cd /var/lib/squidguard/db/ wget ftp://ftp.univ-tlse1.fr/blacklist/blacklists.tar.gz tar xzf blacklists.tar.gz cd blacklists Affecter les bons droits au contenu de /var/lib/squidguard/db/blacklists qui doit être accessible en lecture et en écriture par l'utilisateur sous l'identité duquel squid tourne en l'occurrence proxy. cd /var/lib/squidguard/db/ chown -R proxy:proxy blacklists Nous devons maintenant créer un fichier de configuration pour squidGuard, qui tienne compte de quelques unes de ces destinations. Dans squidGuard.conf, nous allons tenir compte du sous répertoire porn : dest pornographie { urllist porn/urls domainlist porn/domains } Le fichier de configuration doit donc maintenant ressembler à ceci : dbhome /var/lib/squidguard/db/blacklists logdir /var/log/squid3 src admin { ip 192.168.0.10 } src users { ip 192.168.0.0/24 } dest pornographie { urllist porn/urls domainlist porn/domains } acl { admin { pass any } users { pass !pornographie any redirect http://127.0.0.1/proxy.html } default { pass none redirect http://127.0.0.1/proxy.html } } La dernière étape consiste à compiler les bases de données blacklists au format Berkeley. Très important, cette compilation doit se fait sous l'identité du user squid en l'occurrence proxy. su proxy squidGuard -C all Vérifier la compilation par la commande suivante : tail -f /var/log/squid/squidGuard.log En fin de fichier doit se trouver une ligne type : ... 2009-10-30 13:15:45 [6815] db update done ... =====Traçabilité des accès===== {{ :sarg.png|}}La phase logique qui suit l’authentification des utilisateurs reste celle de l’exploitation des logs générés par le serveur Squid. Vous pouvez, à tout instant, consulter manuellement ces derniers dans le fichier access.log qui se trouve habituellement dans le répertoire /var/log/squid3 (paramétrable dans le fichier squid.conf). Vous noterez que, selon votre distribution Linux, vous utilisez peut-être sans le savoir le programme logrotate afin de purger vos fichiers de logs. Dans ce cas, vérifiez que le champ size du fichier /etc/logrotate.d/squid3 est suffisamment important pour ne pas perdre d’informations (adaptez-le à la fréquence d’analyse de vos logs). Par contre, il semble plutôt impossible d’exploiter directement ce fichier tant le volume de données à traiter peut rapidement excéder celui de la capacité d’analyse normale d’un être humain. Heureusement, plusieurs logiciels existent qui excellent dans ce travail de synthèse : Calamaris, Webalizer, Squid-Log-Analzer, SARG,...Nous allons, pour notre part, vous proposer d’utiliser le logiciel SARG. L'installation sous Debian est simple : aptitude install sarg Vous devez ensuite configurer SARG en éditant le fichier /etc/squid/sarg.conf et en modifiant les deux premières directives. language French access_log /var/log/squid3/access.log Il vous sera alors possible de trier les accès selon les critères suivants : * Liste des cent sites les plus visités avec la bande passante utilisée et le nombre d’accès ; * Liste de tous les sites visités avec le nom des utilisateurs ; * Liste des utilisateurs triés sur le critère de la bande passante utilisée ; Par utilisateur : * La liste des sites visités par ordre d’importance (nombre d’accès ainsi que la date et l’heure des visites) ; * Un planning des connexions pour balayer d’un seul coup d’œil la charge par utilisateur ; * Par site, la date et l’heure de tous les accès ; * La liste des connexions échouées (utile pour localiser les logiciels espion). Sauf besoin ponctuel, il est préférable d’automatiser la génération de ces informations en plaçant l’appel à la commande sarg dans la crontab du système. Exemple d’utilisation en ligne de commande : /usr/bin/sarg -n -o /home/squid3/logs/ -i Il suffit ensuite de configurer un serveur web pour utiliser ce résultat.