Pourquoi ?
Tout d'abord afin de cerner le besoin, il est préférable de cerner pourquoi bloquer l'accès à internet pour une serveur Linux ? Tous les serveurs ils peuvent être compromis ( principe du Zero Trust ). Le principe est donc de ne pas donner accès à Internet aux machines tout en continuant de faire les mises à jour. Le débat de ne pas mettre à jour car la machine n'est pas exposée n'est plus d'actualité car l'attaque peut venir de l'intérieur ( voir Stuxnet ). Donc comment récupérer les mises à jour ?
A moins d'avoir des données classifiées ou le besoin et les ressources nécessaire pour respecter scrupuleusement une identification unique auprès d'un proxy pour chaque machine qui peut être changé très rapidement, nous allons voir une solution intermédiaire : simple, peu gourmande en ressources mais qui réduit la surface d'ouverture.
Les relais propriétaires
Les distributions payantes comme Suse peuvent proposer des solutions de proxy pour les mises à jour. Seulement ces relais sont valables que pour les paquets de mises à jour de la distribution, ils ne fonctionnent pas pour les autres sources.
Les relais spécifiques à une distribution
Les relais spécifique comme apt-cache supposent que vous utilisez toujours la même distribution ou la même "famille" de distribution. Seulement pour certains déploiement comme Docker cela ne fonctionne pas.
Comment faire ?
La machine relai
Le première chose est de déployer une seule machine qui elle aura accès à internet. Elle ne doit héberger aucune donnée mais seulement faire proxy. Il est alors préférable de lui déployer un firewall pour réduire sa surface d'exposition.
Squid
Finalement Squid s'avère être la solution. Inutile de le configurer pour faire du cache, il va seulement servir à faire relai. D'expérience, le fait de mettre un mot de passe pour l'authentification complexifie les choses ( si vous avez à changer le mot de passe sur de nombreuses machines, il faut prévoir un script type Ansible pour le faire ) mais en plus il doit être écrit en clair dans le fichier de configuration ( apt, yum, zypper ... ). Nous allons donc les ip source et limiter les domaines cibles sans authentification.
Fichier squid.conf
Pour atteindre les fonctionnalités décrites ci-dessus le fichier de configuration squid.conf peut rester simple :
http_port 8080
acl lan_1 src 192.168.1.0/24
acl lan_2 src 192.168.2.0/24
acl dmz_1 src 192.168.100.0/24
#defaults
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT
acl allowed_sites dstdomain "/etc/squid/urllist.txt"
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
#http_access deny CONNECT !SSL_ports
#http_access allow localnet
http_access allow localhost
http_access allow lan_1 allowed_sites
http_access allow lan_2 allowed_sites
http_access allow dmz_1 allowed_sites
http_access deny all
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
cache deny all
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
Fichier des domaines autorisé
Le fichier squid.conf fait référence à un fichier contenant la liste des domaines autorisés, à savoir "/etc/squid/urllist.txt". L'acl squid dstdomain attend un fichier text avec un domaines autorisés par ligne. Si la ligne commence par un . tous les sous-domaines sont aussi autorisé.
.debian.org
.docker.io
.docker.com
.fedoraproject.org
.flathub.org
.launchpadcontent.net
.mariadb.org
.mariadb.com
.npmjs.org
.postgresql.org
.snapcraft.io
.ubuntu.com
.registry.hub.docker.com
.dbeaver.io
.lemonldap-ng.org
.fr.archive.ubuntu.com
.archive.ubuntu.com
.ppa.launchpad.net
.rpmfind.net
.opensuse.org
.suse.com
.openh264.org
.artifacts.chirpstack.io
Pour finir
Reste à configurer sur chaque serveur pour Apt, Ym, Zypper, Docker, etc... un proxy avec le fqdn de ce serveur et le port 8080 ( donné dans le fichier squid.conf ).
Commentaires