Sécuriser l’utilisation de wget et curl en ligne de commande

Dans un script shell, il est assez commun d’utiliser les outils wget ou curl pour faire des requêtes HTTP(S). Ces logiciels sont effectivement très pratiques ; ils permettent de faire la jonction entre un script local et des services distants, réduisant la frontière entre les deux.

Il y a toutefois un point auquel on ne pense souvent pas, et qui peut poser problème, c’est la sécurité liée à l’utilisation de ces logiciels. On les appelle en passant toutes les options nécessaires sur la ligne de commande, et l’exécution nous fournit le résultat attendu.

Sauf qu’en procédant de la sorte, on ne se rend pas compte qu’on divulgue potentiellement des informations confidentielles, si jamais le script s’exécute sur une machine qui accueille plusieurs utilisateurs. Il faut savoir que, par défaut, il est facilement possible de voir la liste des programmes qui sont en cours d’exécution, en utilisant les commandes ps ou top (ou htop), ou en parcourant directement l’arborescence virtuelle /proc. Et cela concerne tous les programmes qui s’exécutent, même ceux lancés par d’autres utilisateurs (même le root).

Donc, suivant les options passées en paramètre à wget et curl, on peut se retrouver à dévoiler l’URL de connexion, les paramètres GET, le User-Agent, les login et mot de passe d’authentification HTTP… ce qui peut être très problématique si ces informations ne doivent pas être accessibles à tous les utilisateurs qui peuvent se connecter sur le serveur par SSH.

Nous allons voir trois méthodes pour nous prémunir de ce problème.

Bloquer la visualisation des processus tiers

Ici le but est d’empêcher les utilisateurs de voir les processus qui ne leur appartiennent pas. Ce moyen est à la fois le plus simple et le plus compliqué à mettre en œuvre.

Le plus compliqué parce qu’il est techniquement complexe et touche la gestion des systèmes de fichiers. Le plus simple parce qu’une fois mis en place, il permet de garder des appels wget/curl inchangés.

La solution est d’ajouter l’option hidepid=2 au point de montage /proc dans le fichier /etc/fstab :

proc  /proc  proc  defaults,hidepid=2

Cette solution est mise en œuvre par défaut par certaines distributions Linux orientées sécurité, mais ce n’est pas le cas des plus répandues.

Ce paramétrage est recommandé, à vous de voir si vous voulez le mettre en place (cela peut gêner le fonctionnement de certains systèmes de monitoring ou de gestion de processus, ce qui peut amener à exécuter plus de programmes avec l’identité root, ce qui peut engendrer potentiellement d’autres problèmes de sécurité).

Mais attention à ne pas s’en contenter : si vos scripts shell ne sont pas eux-mêmes sécurisés, vous prenez le risque qu’ils soient un jour exécutés sur un serveur qui n’a pas reçu ce paramétrage.

Sécuriser wget

Pour sécuriser l’exécution de wget, il faut faire en sorte que toutes les informations importantes ne soient pas passées en paramètres sur la ligne de commande.

Le programme wget peut prendre en paramètre le chemin vers un fichier qui contient l’URL à récupérer. Cela permet de cacher l’URL elle-même, les paramètres GET, et les login et mot de passe d’authentification.

Exemple de code :

#!/bin/sh

# création d'un fichier temporaire
INPUT_FILE="$(mktemp /tmp/wget-XXXXXXXXXX.input)"

# ajout de l'URL dans le fichier
echo "https://toto:titi@domain.com/path?param=value" > $INPUT_FILE

# exécution de wget
wget -nv --auth-no-challenge -i $INPUT_FILE -O - 2> /dev/null

# effacement du fichier temporaire
rm -f $INPUT_FILELangage du code : Bash (bash)
  • Avec toto le login et titi le mot de passe de l’authentification HTTP.
  • L’option -nv évite que wget soit verbeux sur le déroulement de la connexion.
  • L’option --auth-no-challenge permet de faire une authentification Basic ou Digest sans avoir reçu d’abord une réponse 401.
  • l’option -i permet d’indiquer le fichier de paramétrage.
  • L’option -O avec la valeur - (tiret) demande à wget d’écrire le résultat sur sa sortie standard.
  • Enfin, la sortie d’erreur est éliminée en étant redirigée vers /dev/null, pour éviter de récupérer des informations sur le traitement de la requête.

Cette méthode est efficace, mais elle a ses limites. Si vous avez besoin de spécifier des en-têtes HTTP, ou un user-agent spécifique, vous serez toujours obligés de les fournir en paramètres sur la ligne de commande, et ils seront donc visibles.

Exemple avec un user-agent personnalisé :

wget -nv --user-agent="MyAgent/1.0" -i $INPUT_FILE -O - 2> /dev/nullLangage du code : Bash (bash)

Sécuriser curl

Le logiciel curl est plus puissant que wget et propose beaucoup plus d’options. Il offre notamment deux solutions pour écrire des fichiers de configuration, un peu comme on a vu pour wget ci-dessus.

Si les seuls paramètres à sécuriser sont le login et le mot de passe d’une authentification Basic ou Digest, il est possible de créer un fichier « netrc » et de le fournir à curl.

Exemple de code :

#!/bin/sh

# création d'un fichier temporaire
NETRC_FILE="$(mktemp /tmp/XXXXXXXXXX.netrc)"

# ajout des informations dans le fichier
echo "default" > $NETRC_FILE
echo "login toto" >> $NETRC_FILE
echo "password titi" >> $NETRC_FILE

# appel de curl
curl --netrc-file $NETRC_FILE https://domain.com?param=value 2> /dev/null

# effacement du fichier temporaire
rm -f $NETRC_FILELangage du code : Bash (bash)
  • Avec toto le login et titi le mot de passe de l’authentification HTTP.
  • L’option --netrc-file permet de spécifier le fichier de paramétrage.

Si vous avez besoin de sécuriser d’autres informations, comme l’URL elle-même, les paramètres GET, des en-têtes HTTP ou le user-agent, il faudra passer par un fichier de configuration :

#!/bin/sh

# création d'un fichier temporaire
CONFIG_FILE="$(mktemp /tmp/XXXXXXXXXX.conf)"

# ajout des informations dans le fichier
echo 'url = "https://domain.com?param=value"' > $CONFIG_FILE
echo 'user-agent = "MyAgent/1.0"' >> $CONFIG_FILE
echo 'user = "toto:titi"' >> $CONFIG_FILE

# appel de curl
curl --config $CONFIG_FILE 2> /dev/null

# effacement du fichier temporaire
rm -f $CONFIG_FILELangage du code : Bash (bash)
  • Avec toto le login et titi le mot de passe de l’authentification HTTP.
  • L’option --config permet de donner à curl le chemin vers le fichier de configuration.

Ici, toutes les informations nécessaires étant enregistrées dans le fichier de configuration, vous êtes certains qu’elles ne seront pas visibles par les autres utilisateurs.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.