Squid

Par ce salop de FanfanlaTulipe et corrigé par ce salop de fl0w5

Squid est un proxy HTTP, HTTPS et FTP. Il permet un bon controle sur le réseau, en particulier web.

Un proxy, c'est quoi cette saloperie ?

Un proxy (à ne pas confondre avec un reverse-proxy) est un système permettant de faire rebond. Dans le cas de Squid, cela permet de mettre un intermédiaire entre un client et un serveur principalement web. Cela a donc l'avantage de cacher les clients derrière un système configurable et qui peut tout journaliser. Son utilisation en entreprise est donc très recommandée.

Proxy HTTP

On entre dans la partie simple du guide. Tout d'abord, nous allons voir comment faire un simple proxy HTTP. L'exemple sera fait sur une machine Debian.

Installation

On va commencer par récupérer le paquet Squid et activer le service :

apt install squid -y
systemctl enable squid
systemctl start squid

systemctl status squid  # Pour vérifier qu'il fonctionne

Configuration

Squid tourne sur le port 3128 par défaut. On regardera comment le modifier plus bas mais nous utiliserons ce port pour le reste de cette saloperie de guide.

Le fichier de configuration de Squid est /etc/squid/squid.conf.

Tout d'abord, si vous souhaitez changer le port d'écoute, trouvez http_port 3128 et modifiez le.

Nous allons maintenant passer aux ACL (Access Control List) du proxy Squid.

vim /etc/squid/squid.conf

La configuration par défaut de Squid n'autorise pas les connexions entrantes. On va régler ça. Trouver http_access allow localnet et décommenter le.
Trouver ensuite un ensemble de lignes (ligne 1188 par défaut) :

acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

Elles définissent les IPs autorisées à communiquer avec le proxy. Il est possible d'ajouter une seule IP ou plusieurs :

acl localnet src 1.2.3.4            # Une seule IP
acl localnet src 1.2.3.0-1.2.3.255  # Un ensemble d'IPs
acl localnet src 1.2.3.0/24         # Un CIDR

Si vous souhaitez ajouter votre IP publique, vous pouvez la trouver ici. Il est également conseillé de supprimer les IPs par défaut qui ne sont pas utiles.

Test du proxy

Sur la machine cliente :

curl -x http://<ip du proxy>:<port> -I http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 27 Nov 2021 22:36:13 GMT
Expires: Mon, 27 Dec 2021 22:36:13 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Age: 5276
X-Cache: HIT from vps-xxxxxxxx
X-Cache-Lookup: HIT from vps-xxxxxxxx:3128
Via: 1.1 vps-xxxxxxxx (squid/x.x)
Connection: keep-alive

Il est normal que Google réponde avec l'erreur 301, pas de panique (on va chercher http://google.com, google.com nous répond d'aller voir à http://www.google.com).

Félicitations, vous avez un proxy HTTP. J'insiste sur le fait que ce n'est que HTTP car le trafic entre le proxy et le client est en clair :

serveur web <-------> proxy web <------> client
              https               http

Ce genre de protocole n'étant pas acceptable, nous allons essayer de le résoudre dans la suite de ce guide. Un moyen simple de résoudre ce problème est de passer par un VPN. Nous ne traiterons pas ce cas dans ce guide.

Enfin, maintenant que nous avons la base d'un proxy, il serait interessant que la navigation ne soit pas anonyme afin de journaliser le trafic.

Authentification des clients

apt install apache2-utils -y

Nous allons ensuite créer un fichier qui va contenir les mots de passe :

touch /etc/squid/passwd
chown proxy /etc/squid/passwd

Nous allons créer un utilisateur pour le proxy, ici proxyuser :

htpasswd /etc/squid/passwd proxyuser

La commande demandera le mot de passe.

Enfin, ouvrir /etc/squid/squid.conf :

vim /etc/squid/squid.conf

Ajouter les règles suivantes dans le fichier :

auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid Basic Authentication
auth_param basic credentialsttl 2 hours
acl auth_users proxy_auth REQUIRED
http_access allow auth_users

Penser à recharger Squid :

systemctl restart squid

Pour tester :

curl -x http://<ip du proxy>:<port> --proxy-user proxyuser:<mot de passe> \
https://www.google.com

ATTENTION, si vous n'utilisez pas de VPN chiffré ou un proxy https, les identifiants transittent en clair dans le réseau !

Proxy HTTPS

Il est nécessaire d'utiliser un serveur mandataire qui fonctionne en HTTPS afin que les flux entre les clients et le serveur soit chiffré.

Il est nécessaire d'avoir un bi-clé pour faire fonctionner un serveur mandataire en HTTPS et de mettre dans les autorités de certification de confiance le certificat. En effet, le proxy va signer à la volée des certificats pour qu'un flux HTTPS entre le client et le proxy soit possible sans erreur.

http_port 3128 tls-cert=/etc/ssl/certs/squid-cert.pem tls-key=/etc/ssl/private/squid-key.pem generate-host-certificates=on cipher=HIGH:!MEDIUM:!LOW:!IDEA:!3DES:!MD5 options=NO_TLSv1,NO_SSLv3,NO_SSLv2,SINGLE_DH_USE,SINGLE_ECDH_USE

Références

Site officiel de Squid
Recommandation de l'ANSSI sur l'interconnexion d'un SI avec Internet
Recommandation de l'ANSSI sur l'analyse des flux HTTPS