Aller au contenu

Proxy et cache avec apt-cacher-ng

Qu'est-ce qu'un proxy ?

Un proxy est un logiciel hébergé sur un serveur qui fait office d'intermédiaire entre un serveur source et un serveur de destination. Ses objectifs sont multiples :

  • Filtrer le traffic afin de l'autoriser (ex: une url ou port) ou de l'interdire.
  • Inspection du traffic : inspecter et bloquer (ex: un virus) tout contenu malveillant.
  • Accélération de l'accès aux données (si mise en cache) pour les serveurs appelant le proxy.
  • Réduction de la consommation de bande passante entre l'infrastructure et internet.

Fonctionnement avec la mise en cache

apt-cacher-ng est à la fois un proxy et un système de cache, il stocke les paquets téléchargés via ce même proxy. Il est utilisé pour apt ou même pip pour python.

apt-cacher-ng

Pré-requis et environnement

Nous déployons sur l'environnement suivant :

  • OS : Ubuntu 22.x
  • Version : apt-cacher-ng version 3.7.4
  • IP du proxy : 10.0.0.10
  • IP du système source : 10.0.0.20

Nous ne filtrons pas les urls ici puisque nous avons un second proxy en amont du apt-cacher-ng. Cet autre proxy filtre les urls, nous autorisons donc toute URL.

Installation

apt install apt-cacher-ng -y

Fichier de configuration /etc/apt-cacher-ng/acng.conf

CacheDir: /var/cache/apt-cacher-ng
LogDir: /var/log/apt-cacher-ng
SupportDir: /usr/lib/apt-cacher-ng
Proxy: http://url.proxy:3128 # on indique le proxy
ExThreshold: 4
FollowIndexFileRemoval: 1
LocalDirs: acng-doc /usr/share/doc/apt-cacher-ng
PassThroughPattern: ^(.*):443$ # on autorise l'accès aux urls externes sur le port 443 (https par défaut)

Activation, puis démarrage du service :

systemctl enable apt-cacher-ng
systemctl start apt-cacher-ng
systemctl status apt-cacher-ng
● apt-cacher-ng.service - Apt-Cacher NG software download proxy
     Loaded: loaded (/lib/systemd/system/apt-cacher-ng.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-12-27 16:12:06 CET; 43min ago
   Main PID: 161294 (apt-cacher-ng)
      Tasks: 3 (limit: 2221)
     Memory: 2.0M
        CPU: 13ms
     CGroup: /system.slice/apt-cacher-ng.service
             └─161294 /usr/sbin/apt-cacher-ng -c /etc/apt-cacher-ng ForeGround=1

Dec 27 16:12:06 repo-linux.secnumcloud systemd[1]: Starting Apt-Cacher NG software download proxy...
Dec 27 16:12:06 repo-linux.secnumcloud systemd[1]: Started Apt-Cacher NG software download proxy.

Utiliser le proxy

APT

Sur chaque système source, 2 solutions :

  • soit on spécifie l'utilisation du proxy pour tous les repo,
  • soit on spécifie l'utilisation du proxy pour certains repos uniquement.

Pour tous les repo :

cat <<EOF > /etc/apt/apt.conf.d/10proxy.conf
Acquire::http::Proxy "http://10.0.0.10:3142";
EOF

Puis on vérifie :

apt update ; apt install apache2 -y

Et dans les logs du proxy, on retrouve :

# cat /var/log/apt-cacher-ng/apt-cacher.log
1703692839|I|7663|10.0.0.10|uburep/dists/jammy/InRelease
1703692839|O|102|10.0.0.20|uburep/dists/jammy/InRelease
1703692839|I|119487|10.0.0.20|uburep/dists/jammy-updates/InRelease
1703692839|O|119034|10.0.0.20|uburep/dists/jammy-updates/InRelease
1703692840|I|111077|10.0.0.20|security.ubuntu.com/ubuntu/dists/jammy-security/InRelease
1703692840|O|110626|10.0.0.20|security.ubuntu.com/ubuntu/dists/jammy-security/InRelease
1703692840|I|4742|10.0.0.20|uburep/dists/jammy-backports/InRelease
1703692840|O|102|10.0.0.20|uburep/dists/jammy-backports/InRelease
1703692957|I|108678|10.0.0.20|uburep/pool/main/a/apr/libapr1_1.7.0-8ubuntu0.22.04.1_amd64.deb
1703692957|O|108302|10.0.0.20|uburep/pool/main/a/apr/libapr1_1.7.0-8ubuntu0.22.04.1_amd64.deb
1703692957|I|93430|10.0.0.20|uburep/pool/main/a/apr-util/libaprutil1_1.6.1-5ubuntu4.22.04.2_amd64.deb
1703692957|O|93066|10.0.0.20|uburep/pool/main/a/apr-util/libaprutil1_1.6.1-5ubuntu4.22.04.2_amd64.deb
1703692957|I|12014|10.0.0.20|uburep/pool/main/a/apr-util/libaprutil1-dbd-sqlite3_1.6.1-5ubuntu4.22.04.2_amd64.deb
1703692957|O|11664|10.0.0.20|uburep/pool/main/a/apr-util/libaprutil1-dbd-sqlite3_1.6.1-5ubuntu4.22.04.2_amd64.deb
1703692957|I|9838|10.0.0.20|uburep/pool/main/a/apr-util/libaprutil1-ldap_1.6.1-5ubuntu4.22.04.2_amd64.deb
1703692957|O|9482|10.0.0.20|uburep/pool/main/a/apr-util/libaprutil1-ldap_1.6.1-5ubuntu4.22.04.2_amd64.deb
1703692958|I|140700|10.0.0.20|uburep/pool/main/l/lua5.3/liblua5.3-0_5.3.6-1build1_amd64.deb
1703692958|O|140324|10.0.0.20|uburep/pool/main/l/lua5.3/liblua5.3-0_5.3.6-1build1_amd64.deb
1703692958|I|1346730|10.0.0.20|uburep/pool/main/a/apache2/apache2-bin_2.4.52-1ubuntu4.7_amd64.deb
1703692958|O|1346356|10.0.0.20|uburep/pool/main/a/apache2/apache2-bin_2.4.52-1ubuntu4.7_amd64.deb
1703692958|I|165582|10.0.0.20|uburep/pool/main/a/apache2/apache2-data_2.4.52-1ubuntu4.7_all.deb
1703692958|O|165210|10.0.0.20|uburep/pool/main/a/apache2/apache2-data_2.4.52-1ubuntu4.7_all.deb
1703692958|I|89488|10.0.0.20|uburep/pool/main/a/apache2/apache2-utils_2.4.52-1ubuntu4.7_amd64.deb
1703692958|O|89118|10.0.0.20|uburep/pool/main/a/apache2/apache2-utils_2.4.52-1ubuntu4.7_amd64.deb
1703692958|I|24498|10.0.0.20|uburep/pool/main/m/mailcap/mailcap_3.70+nmu1ubuntu1_all.deb
1703692958|O|24123|10.0.0.20|uburep/pool/main/m/mailcap/mailcap_3.70+nmu1ubuntu1_all.deb
1703692958|I|4362|10.0.0.20|uburep/pool/main/m/mime-support/mime-support_3.66_all.deb
1703692958|O|3988|10.0.0.20|uburep/pool/main/m/mime-support/mime-support_3.66_all.deb
1703692958|I|98488|10.0.0.20|uburep/pool/main/a/apache2/apache2_2.4.52-1ubuntu4.7_amd64.deb
1703692958|O|98114|10.0.0.20|uburep/pool/main/a/apache2/apache2_2.4.52-1ubuntu4.7_amd64.deb
1703692958|I|35494|10.0.0.20|uburep/pool/main/b/bzip2/bzip2_1.0.8-5build1_amd64.deb
1703692958|O|35112|10.0.0.20|uburep/pool/main/b/bzip2/bzip2_1.0.8-5build1_amd64.deb
1703692958|I|18034|10.0.0.20|uburep/pool/main/s/ssl-cert/ssl-cert_1.1.2_all.deb
1703692958|O|17650|10.0.0.20|uburep/pool/main/s/ssl-cert/ssl-cert_1.1.2_all.deb

On retrouve le paquet apache2 et ses dépendances en cache sur le proxy :

# ls -l /var/cache/apt-cacher-ng/uburep/pool/main/a/
total 12
drwxr-sr-x 2 apt-cacher-ng apt-cacher-ng 4096 Dec 27 16:02 apache2
drwxr-sr-x 2 apt-cacher-ng apt-cacher-ng 4096 Dec 27 16:02 apr
drwxr-sr-x 2 apt-cacher-ng apt-cacher-ng 4096 Dec 27 16:02 apr-util

Pour un repo spécifique :

Repo gitlab :

curl -s https://packages.gitlab.com/gpg.key | apt-key add - ; apt-get update
cat <<EOF > /etc/apt/sources.list.d/gitlab.list
deb http://10.0.0.10:3142/packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ focal main
EOF

Installation de gitlab :

apt update ; apt install gitlab-ce -y

Et dans les logs du proxy, on retrouve :

# cat /var/log/apt-cacher-ng/apt-cacher.log
1703693539|I|24896|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/focal/InRelease
1703693539|O|23678|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/focal/InRelease
1703693584|I|1586|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/focal/InRelease
1703693584|O|24357|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/focal/InRelease
1703693584|I|52465|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/focal/main/binary-amd64/by-hash/SHA256/11f8ba2a80824208dfb54573e37ca38bd3c1456acb46ff36824a75372f174ba8
1703693584|O|51319|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/dists/focal/main/binary-amd64/by-hash/SHA256/11f8ba2a80824208dfb54573e37ca38bd3c1456acb46ff36824a75372f174ba8
1703694091|I|1098496138|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/pool/focal/main/g/gitlab-ce/gitlab-ce_16.7.0-ce.0_amd64.deb
1703694091|O|1098494772|10.0.0.20|packages.gitlab.com/gitlab/gitlab-ce/ubuntu/pool/focal/main/g/gitlab-ce/gitlab-ce_16.7.0-ce.0_amd64.deb

On retrouve le paquet apache2 et ses dépendances en cache sur le proxy :

# ls -l /var/cache/apt-cacher-ng/packages.gitlab.com/
total 4
drwxr-sr-x 3 apt-cacher-ng apt-cacher-ng 4096 Dec 27 16:12 gitlab

PIP

pip peut également utiliser le proxy pour télécharger et installer ses paquets python :

pip install pip-install-test --proxy=http://10.0.0.10:3142/

Aller plus loin...

  • Prévoir un nettoyage régulier du cache.
  • Dans un objectif de sécurité, il est tout à fait possible d'ajouter une étape supplémentaire pour vérifier que les paquets téléchargés via ce proxy ne sont pas malveillants (ex: antivirus).
  • Une interface web est disponible: http://10.0.0.10:3142/acng-report.html