Les arguments de processus sont visibles pour tous les utilisateurs, mais l'environnement n'est visible que pour le même utilisateur ( au moins sous Linux , et je pense sur toutes les variantes Unix modernes). Il est donc sûr de passer un mot de passe via une variable d'environnement. Si quelqu'un peut lire vos variables d'environnement, il peut exécuter des processus comme vous, donc c'est déjà fini.
Le contenu de l'environnement risque de fuir indirectement, par exemple si vous exécutez ps
une enquête et copiez-collez accidentellement le résultat, y compris les variables d'environnement confidentielles dans un lieu public. Un autre risque est que vous passiez la variable d'environnement à un programme qui n'en a pas besoin (y compris les enfants du processus qui a besoin du mot de passe) et que ce programme expose ses variables d'environnement car il ne s'attendait pas à ce qu'elles soient confidentielles. La gravité de ces risques de fuite secondaire dépend de ce que fait le processus avec le mot de passe (combien de temps dure-t-il? Exécute-t-il des sous-processus?).
Il est plus facile de s'assurer que le mot de passe ne fuit pas accidentellement en le faisant passer par un canal qui n'est pas conçu pour être écouté, comme un tuyau. C'est assez facile à faire du côté de l'envoi. Par exemple, si vous avez le mot de passe dans une variable shell, vous pouvez simplement faire
echo "$password" | theprogram
si theprogram
attend le mot de passe sur son entrée standard. Notez que cela est sûr car il echo
s'agit d'une fonction intégrée; ce ne serait pas sûr avec une commande externe car l'argument serait exposé en ps
sortie. Une autre façon d'obtenir le même effet est avec un document ici:
theprogram <<EOF
$password
EOF
Certains programmes qui nécessitent un mot de passe peuvent être invités à le lire à partir d'un descripteur de fichier spécifique. Vous pouvez utiliser un descripteur de fichier autre que l'entrée standard si vous avez besoin d'une entrée standard pour autre chose. Par exemple, avec gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Si le programme ne peut pas être invité à lire à partir d'un descripteur de fichier mais peut être invité à lire à partir d'un fichier, vous pouvez lui dire de lire à partir d'un descripteur de fichier en utilisant un nom de fichier comme `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
Dans ksh, bash ou zsh, vous pouvez le faire de manière plus concise grâce à la substitution de processus.
theprogram --password-from-file=<(echo "$password")