web-dev-qa-db-fra.com

N'est-il pas sûr d'envoyer un mot de passe dans une commande `curl`?

Voici un exemple de demande que nous pouvons adresser à l'API GitHub:

curl 'https://api.github.com/authorizations' --user "USERNAME"

Cela vous demandera le mot de passe du compte, pour continuer:

Enter Host password for user 'USERNAME':

Si nous ne voulons pas recevoir l'invite, nous pouvons fournir le mot de passe en même temps que le nom d'utilisateur:

curl 'https://api.github.com/authorizations' --user "USERNAME:PASSWORD"

Mais cette méthode est-elle moins sûre? curl envoie-t-il toutes les données à la fois, ou configure-t-il d'abord une connexion sécurisée, puis envoie-t-il seulement les USERNAME et PASSWORD?

35
user137369

Concernant la connexion il n'y a pas de différence: le TLS est négocié en premier et la requête HTTP est sécurisée par le TLS.

Localement, cela peut être moins sûr, car:

  • Le mot de passe est enregistré dans l'historique des commandes (~/.bash_history) dans le cadre de la commande. Remarque: Cela peut être évité en ajoutant un espace devant la commande avant de l'exécuter (à condition que vous ayez le paramètre ignorespace dans la variable HISTCONTROL ).
  • Sur un système partagé, il sera généralement visible par les autres dans ps, top et autres, ou en lisant /proc/$pid/cmdline, tant que la commande est en cours d'exécution.
  • Le stockage du mot de passe non sécurisé dans un script peut poser un risque pour la sécurité, selon l'endroit où le script lui-même est stocké.
73
Esa Jokinen

Mais cette méthode est-elle moins sûre?

Non, ce n'est pas le cas si vous utilisez https. Lorsque vous utilisez HTTPS, votre transaction complète sera cryptée. Mais comme @Esa l'a mentionné, il n'est pas sécurisé localement, vous pouvez éviter d'ajouter un space avant votre commande afin que la commande ne soit pas dans votre historique de commandes. Si vous craignez d'exposer la commande aux autres utilisateurs ps plutôt que de durcir /proc vous aiderait. Suivez le lien pour activer hidepid .

curl envoie-t-il toutes les données en même temps, ou configure-t-il d'abord une connexion sécurisée, puis envoie-t-il seulement USERNAME et PASSWORD?

Non curl n'envoie pas toutes les données en même temps. Comme les autres SSL/TLS connexion, curl initiera une négociation SSL avant de transmettre des données.

Vous pouvez inspecter la façon dont vos données sont transférées avec tcpdump, tshark ou Wireshark comme suit, (après avoir exécuté tcpdump/tshark, exécutez la commande curl)

[~ # ~] tcpdump [~ # ~]

[root@arif]# tcpdump -i eth0 -n src Host 192.168.1.1 and dst Host 192.168.1.2 and port 443 -XX

Où,

  • -i: pour écouter sur une interface spécifique qui est dans ce cas eth0
  • src Host: Spécification de l'adresse source ip
  • dst Host: Spécification de l'adresse de destination ip
  • port: spécification du port 443 qui est la valeur par défaut pour la connexion SSL. Vous pouvez changer selon vos besoins.
  • XX: pour afficher l'en-tête, le contenu des paquets et l'en-tête de niveau lien en HEX et ASCII.

Vous commencerez à voir le contenu de gibberish après quelques paquets. Vous pouvez également grep votre mot de passe à partir du paquet avec la commande suivante,

[root@arif]# tcpdump -li eth0 -n src Host 192.168.1.1 and dst Host 192.168.1.2 and port 443 -XX | grep 'password'

Si votre mot de passe apparaît, votre mot de passe n'a pas été crypté avant la transmission. Sinon, ça va.

[~ # ~] tshark [~ # ~]

[root@arif]# tshark -O tls "ip src 192.168.1.1 and ip dst 192.168.1.2" -x

Où,

  • -O: pour mentionner le protocole.
  • -x: pour voir le contenu des paquets.

vous pouvez également grep votre mot de passe avec la commande ci-dessus.

8
Muhammad

La meilleure façon de se protéger des utilisateurs locaux est d'utiliser un fichier ".netrc". La page de manuel curl doit contenir des détails sur son utilisation.

3
sitaram