Squid avec ssl

 
Note avril 2020 : Squid (version  4.9-20200102) est toujours actif et j'ajoute régulièrement quelques données dans les fichiers de filtrage pour définir quelques origines gênantes et je récupère toutes les semaines les informations sur les serveurs de pub depuis https://pgl.yoyo.org

Note juin 2018 : j'utilise toujours Squid (version 4.0.25) sur mon système frontal ce qui permet de bloquer certains sites de pub un peu trop intrusifs et aussi d'accélérer l'affichage. Pour voir le principe des "ACL" et quelques exemples aller ici.

Note septembre 2017, en cas d'ennui de compilation vérifier l'installation de : 
libssl-dev et libcrypto++-dev 
apt-get install libssl-dev libcrypto++-dev 

La version qui "tourne" actuellement est la version 3.5.19-20160618-r14061. Je recompile une nouvelle version de temps en temps, quelques "trucs" que j'utilise sont décrits en annexe. 
Surtout ne pas oublier d'installer votre certificat sur les postes client !

J'ai voulu essayer d'utiliser Squid3 en proxy SSL, mais malheureusement le binaire proposé par Debian est compilé sans l'option SSL. Pour persister dans mon idée il m'a fallu passer par les sources et je vous conte ci-après l'histoire correspondante. 
Cette opération a été réalisée sur une machine Debian 7.4, pour d'autres distributions les répertoires peuvent varier. 
Télécharger la dernière archive (pour moi : squid-3.5.02.tar.xz) et la décompresser dans un répertoire tranquille, j'utilise /usr/src/PGM/BUILD comme répertoire de base et ne touche pas à la disposition "classique des programmes locaux dans /usr/local/.... 
J'ai mis les options de configuration qui m'intéressent dans le petit script suivant :

#!/bin/bash 
# A lancer dans le répertoire de "BUILD" au niveau "au dessus" de squid 
# Mise à jour Aout 2016 pour SQUID 3.5

OPTIONS=' --with-default-user=squid ' 
# MAX FD 
OPTIONS=${OPTIONS}' --with-filedescriptors=16384 ' 
# NO IPV6 
OPTIONS=${OPTIONS}' --disable-ipv6 ' 
#    Enable SSL 
OPTIONS=${OPTIONS}' --enable-ssl --enable-ssl-crtd --enable-inline ' 
# SQUID 3.5 
OPTIONS=${OPTIONS}' --with-openssl ' 
# transparent 
OPTIONS=${OPTIONS}' --enable-linux-netfilter --enable-icmp --with-large-files ' 
OPTIONS=${OPTIONS}' --enable-icap-client --enable-useragent-log --enable-referer-log' 
OPTIONS=${OPTIONS}' --disable-poll --enable-epoll --disable-ident-lookups  ' 
OPTIONS=${OPTIONS}' --enable-async-io=16 --enable-underscores --enable-carp' 
OPTIONS=${OPTIONS}' --enable-storeio=aufs,diskd,rock ' 
OPTIONS=${OPTIONS}' --enable-htpc ' 
OPTIONS=${OPTIONS}' --enable-err-language=fr ' 
OPTIONS=${OPTIONS}' --enable-http-violations '

cd squid-3.5       

./bootstrap.sh

./configure $OPTIONS 2>&1 | tee LOG.CONFIGURE

make clean 2>&1 | tee LOG.CLEAN

make 2>&1 | tee LOG.MAKE

exit

Il ne reste plus qu'à vérifier les logs et lancer un "make install" (en root). 
Ainsi je pourrais compiler d'autres versions sans ennuis, du moins en principe. 
Après un essai de compilation "direct" j'ai eu des ennuis à la première exécution. Après recherche j'ai suivi la procédure conseillée (internet dixit) : lancer avant toute chose dans le répertoire de Squid la commande "./bootstrap.sh" qui configure elle même plein de trucs ... en résultat tout est OK (Le script ci-dessus vous évite ce genre d'ennui. 

Après ce petit baratin on lance le truc et on commence pas aller dans le répertoire de Squid et on lance la grande magie : 
./bootstrap.sh 

On lance le petit script de configuration créé précédemment. Puis le fatidique : 
make 2>&1 | tee MAKE.LOG 

La compilation est assez longue, presque autant que celle d'un noyau Linux! 
Ensuite on peut passer au "make install" en "root" bien sûr ! 
On reste "root" pour la suite, il faut, dans le répertoire par défaut (pour moi /usr/local/squid) :

 

  • Créer un répertoire pour stocker le certificat racine de notre autorité 
    mkdir ssl_cert
  • Créer un certificat 
    Voir le script joint
  • Créer un repertoire "lib" dans  /usr/local/squid/var 
    mkdir lib
  • initialiser le répertoire de cache des certificats créés 
    /usr/local/squid/libexec/ssl_crtd -c -s /usr/local/squid/var/lib/ssl_db

Note : Si le répertoire existe, tout le monde peut faire des erreurs ! Il faut le détruire avant de relancer la commande. Dans ce cas ne pas oublier : 
chown -R squid:squid /usr/local/squid/var/lib/ssl_db"

  • Initialiser les pages de messages d'erreur dans /usr/local/squid/share/errors
  • Créer un répertoire "fr" et un lien de "fr" vers "fr-fr"
  • copier le répertoire "templates" dans "fr" et, pour bien faire traduire les pages !

cd /usr/local/squid/share/errors 
mkdir fr 
ln -s fr fr-fr 
cp ./templates/* ./fr

  • Créer un user "squid" groupe "squid" sans droit de login
  • Comme le user d'exécution prévu est "squid" faire un "chown -R squid:squid /usr/local/squid"

Pour la suite je considère que vous avez déjà un fichier de config qui fonctionne en HTTP classique avec les "acl" et filtres qui vous conviennent. Si ce n'est pas le cas commencer par ce point pour que le cache fonctionne selone vos désirs en HTTP. Pour tester configurez votre navigateur avec Squid comme proxy, dans ce cas otez l'option "transparent" de la configuration, vous la remettrez plus tard avant d'activer le système de redirection. 
Ajouter les paramètres adéquats dans le fichier de configuration "squid.conf" :

# 
# Recommended minimum configuration: 
# 
shutdown_lifetime 5 seconds 

# Example rule allowing access from your local networks. 
# Adapt to list your (internal) IP networks from where browsing 
# should be allowed 
# ACLs all, manager, localhost, and to_localhost are predefined. 
# acl localnet src 10.0.0.0/8    # RFC1918 possible internal network 
# acl localnet src 172.16.0.0/12    # RFC1918 possible internal network 
acl localnet src 192.168.2.0/24     
acl localnet src 192.168.3.0/24 
acl localnet src fc00::/7       # RFC 4193 local private network range 
acl localnet src fe80::/10      # RFC 4291 link-local (directly plugged) machines 

acl SSL_ports port 443 
acl Safe_ports port 80        # http 
acl Safe_ports port 81        # 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 

# 
# Recommended minimum Access Permission configuration: 
# 
# Deny requests to certain unsafe ports 
http_access deny !Safe_ports 

# Deny CONNECT to other than secure SSL ports 
http_access deny CONNECT !SSL_ports 

# Only allow cachemgr access from localhost 
http_access allow localhost manager 
http_access deny manager 

# We strongly recommend the following be uncommented to protect innocent 
# web applications running on the proxy server who think the only 
# one who can access services on "localhost" is a local user 
http_access deny to_localhost

# 
#     Ajouter ici vos ACL 
# 
 

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS 
http_access allow localnet 
http_access allow localhost 

# And finally deny all other access to this proxy 
http_access deny all 
 

# Squid normally listens to port 3128 
http_port 3128 transparent 


# Squid listen Port Add "intercept" ou "transparent" pour proxy transparent 
#     Squid pour redirection (Une seule ligne) 
https_port 192.168.2.11:3129 intercept ssl-bump generate-host-certificates=on cert=/usr/local/squid/ssl_cert/xxxxxx.crt key=/usr/local/squid/ssl_cert/xxxxxx.private options=NO_SSLv2,NO_SSLv3 

# 
## Disable ssl interception for dropbox.com and hotmail.com (and localhost) 
acl no_ssl_interception dstdomain .dropbox.com .hotmail.com 
ssl_bump none localhost 
ssl_bump none no_ssl_interception 
  
# SSL Bump Config 
always_direct allow all 
ssl_bump server-first all 
sslproxy_cert_error allow all 
sslproxy_flags DONT_VERIFY_PEER 
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /usr/local/squid/var/lib/ssl_db -M 4MB 
sslcrtd_children 4 startup=2 idle=1 

# Uncomment and adjust the following to add a disk cache directory. 
cache_dir ufs /usr/local/squid/var/cache/squid 2048 32 256

Il faut alors mettre en place une redirection de ports des ports entrants 80 et 443 vers la machine "Squidifiée" sur les ports 3128 et 3129. 
Voir le script joint "Redirection iptables". 
Récupérer un script d'init (il n'y en a pas dans le paquet source) ou bien récupérez celui joint ici (repris de Debian avec quelques adaptations à "/usr/local/squid") puis lancer : 

service squid start 

Et c'est parti ... enfin presque il vous faut avant tout usage HTTPS aller installer votre fichier ".crt" dans le magasin de certificats des browsers du réseau. 
Sinon c'est le blocage assuré de tous les sites HTTPS ! 
C'est le seul inconvénient du proxy HTTPS, comme il doit signer les certificats qu'il vous envoie en lieu et place de ceux qu'il a négociés avec le site il faut qu'il dispose d'une autorité adéquate. Tous les navigateurs disposent de cette possibilité, mais c'est une contrainte importante. 
Pour "curl" et "wget" il faut copier votre certificat de CA dans /etc/ssl/certs, puis l'ajouter à la fin du fichier /etc/ssl/certs/ca-certificates.crt. 
A part cela c'est le  seul moyen de cacher efficacement les pages HTTPS.

Remarque :

Depuis la version du 2 juillet 2015 il est nécessaire d'effectuer une petite modif pour éviter un plantage fatal au démarrage avec message : 
"icmp_sock: (1) Operation not permitted". 
Il suffit de passer le binaire "pinger" (dans squid/libexec) en mode suid root :

cd le_repertoire_de_squid 
cd libexec 
chown root:squid pinger 
chmod 4755 pinger

ou de réaliser un "make install-pinger". 
Comme "pinger" utilise des ports "au hasard" (?) j'ai préféré ajouter l'option "pinger_enable false" dans mon fichier "squid.conf".


Scripts joints :

  • Création certificat
  • Script d'init
  • Exemple de redirection IPTABLES