Introduction

Dans le cadre professionnel, la plupart de nos connexions se trouvent filtrées voire analysées par des composants tels que des proxies. Filtrage particulièrement efficace pour limiter certaines surfaces d’attaques de nos équipements, mais ne facilitant pas l’intégration de nouvelles plateformes qui doivent se conformer aux contraintes de connectivité.

Configurations

Voici un rapide tour d’horizon de quelques logiciels et de leur configuration de connexion proxy. Travaillant quotidiennement avec des systèmes Linux basés sur le système d’exploitation Debian, je me limiterai ici à ces systèmes et aux logiciels couramment utilisés dans ce contexte.

Debian

Pour commencer, la machine elle-même change son comportement de connexion si certaines variables d’environnement sont présentes. Mais ce n’est pas un changement global unitaire d’un coup d’un seul ; c’est un changement au demeurant global émergeant de la somme des changements de configuration de chaque logiciel ou bibliothèque utilisée en coulisses. Il s’agit des variables HTTP_PROXY, HTTPS_PROXY, NO_PROXY et leur équivalent en minuscule. Ces variables sont lues et prises en charge par de nombreux logiciels, te:ls que: curl, python requests. On pourra exécuter les commandes suivantes :

$ export HTTP_PROXY=http://example.proxy.com:80
$ export HTTPS_PROXY=http://example.proxy.com:80
$ export NO_PROXY=127.0.0.1,localhost,domain.towhitelist.org

$ export http_proxy=http://example.proxy.com:80
$ export https_proxy=http://example.proxy.com:80
$ export no_proxy=127.0.0.1,localhost,domain.towhitelist.org

Curl

Concernant Curl, la documentation est claire à ce sujet 1, plusieurs types de proxies sont paramétrables via les variables d’environnement en minuscules ou majuscules: ftp, http,https,…

The proxy example above is for HTTP, but can of course also set ftp_proxy, https_proxy, and so on for the specific protocols you want to proxy. All these proxy environment variable names except http_proxy can also be specified in uppercase, like HTTPS_PROXY.

Il peut alors être intéressant d’utiliser la variable ALL_PROXY à des fins de factorisation, notamment comme valeur par défaut d’un environnement. Cette variable sera ignorée pour le protocole pour lequel on lui a défini un proxy.

To set a single variable that controls all protocols, the ALL_PROXY exists. If a specific protocol variable one exists, such a one takes precedence.

Apt (Advanced Package Tool)

apt nécessite l’édition spécifique d’un fichier de configuration ou l’injection en ligne de commande les paramètres de proxy.

  • En configurant le fichier /etc/apt/apt.conf :
Acquire::http::Proxy "http://example.proxy.com:80";
Acquire::https::Proxy "http://example.proxy.com:80";

Acquire:http:Proxy::domain.towhitelist.org DIRECT;
Acquire:https:Proxy::domain.towhitelist.org DIRECT;
  • En injectant en ligne de commande les options suivantes :
$ apt-get -o Acquire::http::Proxy="http://example.proxy.com:80" update

Docker

Client

La configuration proxy devient moins intuitive pour les étapes de construction (build) d’images.

  • Un première solution consiste à passer dans le Dockerfile les paramètres proxy, tout en se souciant de leur cycle de vie.
ARG http_proxy

FROM ...
[...]

RUN export \
  http_proxy=$http_proxy \
  https_proxy=$http_proxy \
  \
  && curl .... \
  && unset http_proxy https_proxy

[...]

Et lancer la construction d’image avec

$ docker build --build-arg http_proxy="http://example.proxy.com:80"

Attention à bien supprimer cette variable dans la même commande RUN pour que cette variable ne se retrouve pas disponible 2.

  • Une seconde solution fait appel à la configuration générale du client Docker utilisé. Il inspecte le fichier ~/.docker/config.json à la recherche de paramètres. Son contenu est du JSON de la forme :
{
 "proxies": {
   "default": {
     "httpProxy": "http://example.proxy.com:80",
     "httpsProxy": "http://example.proxy.com:80",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
   }
 }
}

On prêtera également attention à l’activation de cette configuration, qui ne sera appliquée que pour les futurs conteneurs construits et déployés 3.

The configuration becomes active after saving the file, you don’t need to restart Docker. However, the configuration only applies to new containers and builds, and doesn’t affect existing containers.

Le stockage de la configuration est cependant en clair sur le système.

Server

Le daemon Docker suit lui aussi la pratique standard de se configurer automatiquement en réponse à la présence des variables d’environnement système 4.

Il est également possible d’éditer le fichier de configuration global.

{
  "proxies": {
    "http-proxy": "http://example.proxy.com:80",
    "https-proxy": "http://example.proxy.com:80",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}

Plus d’informations pour d’autres situations (systemd) sur la documentation officielle 5.

Git

On peut directement éditer la configuration proxy via la ligne de commande suivante 6.

$ git config --global http.proxy http://example.proxy.com:80

Et pour vérifier que la configuration a bien été changée :

$ git config --global --get-regexp http.*

La suppression de cette configuration peut se faire en ligne de commande également.

$ git config --global --unset http.proxy
$ git config --global --unset https.proxy