J'écris un bash
script et je dois demander à l'utilisateur son mot de passe et le transmettre à openssl
. Bien que openssl
je puisse lire le mot de passe lui-même, j'ai besoin de deux exécutions du programme et je ne veux pas demander à l'utilisateur deux fois. Voici le script:
cp file{,.old}
read -sp 'Enter password. ' PASS; echo
export PASS
# decode | edit | encode
openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \
sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file
unset PASS
Ce n'est pas sûr car le mot de passe est facilement accessible en regardant la ligne de commande; quelqu'un peut le lire en utilisant ps
, par exemple.
openssl
peut lire un mot de passe à partir d'une variable d'environnement, donc je peux le remplacer -k "$PASS"
par -pass env:PASS
, mais ce n'est toujours pas sûr; les variables d'environnement de n'importe quel processus peuvent être lues librement (encore une fois, ps
peuvent le faire).
Alors, comment puis-je transmettre le mot de passe en toute sécurité aux deux openssl
instances?
la source
ps
lit l'environnement d'un processus à partir de/proc/<pid>/environ
, mais ce fichier a des0600
autorisations, donc seuls root et l'utilisateur exécutant le processus peuvent lire l'environnement du processus. Je dirais que c'est assez sûr.Réponses:
Passez le mot de passe sur un descripteur de fichier distinct de l'entrée (deux fois, une fois pour le chiffrement et une fois pour le déchiffrement). N'exportez pas
PASS
vers l'environnement.Si votre système n'en a pas
/dev/fd
, vous pouvez utiliser l'-pass
argument pour indiqueropenssl
de lire la phrase secrète à partir d'un descripteur de fichier ouvert.la source
bash
version avecenv:PASS
est également sûr.printf '%s\n' "$PASS"
n'est pas sûr. Quelqu'un peut lire la ligne de commande avecps
par exemple.env:PASS
n'est pas sûr car le mot de passe apparaîtrait dans l'environnement duopenssl
processus (il n'apparaîtrait pas dans l'environnement dubash
processus, mais ce n'est pas suffisant). L'utilisationprintf
est sûre car c'est un bash intégré.echo $PASS | openssl ...
. Il n'apparaîtrait pas dans la liste ps. Le seul endroit où vous pouvez passer serait dans la mémoire du processus bash. Je pense ?echo
serait sûr pour la même raisonprintf
est sûr (etprintf
ne serait pas sûr dans un shell où il n'est pas intégré). La raison pour laquelle j'utiliseprintf
et nonecho
est que celaecho
peut modifier les barres obliques inverses (selon les options de bash).En utilisant Bash, cela peut être fait sans utiliser
printf '%s\n' "$PASS"
en associant une soi-disant chaîne ici avec des descripteurs de fichiers en utilisant laexec
commande intégrée Bash .Pour plus d'informations, voir: Sécurité du mot de passe du script shell des paramètres de ligne de commande .
la source
Désolé, ma réponse précédente venait de openssl man, pas des documents openssl enc.
Cette solution n'est pas un pipeline, mais je pense que cette solution empêche le mot de passe d'être visible par ps.
En utilisant un document ici, seul openssl voit le texte du mot de passe.
Tant que vous êtes certain d'éliminer le fichier intermédiaire, aucune trace ne reste. Peut-être que quelqu'un peut aider à le faire dans un pipeline et éliminer le fichier intermédiaire?
la source
enc
commande n'a pas de-kn
commutateur, du moins sur les versions actuelles, c'est le cas-pass
), mais pas très informatif. (Le downvote n'est pas le mien.)