Los argumentos del proceso son visibles para todos los usuarios, pero el entorno solo es visible para el mismo usuario ( al menos en Linux , y creo que en todas las variantes modernas de Unix). Por lo tanto, pasar una contraseña a través de una variable de entorno es seguro. Si alguien puede leer las variables de su entorno, puede ejecutar procesos como usted, por lo que ya se acabó el juego.
El contenido del entorno tiene cierto riesgo de fugas indirectas, por ejemplo, si corre ps
para investigar algo y accidentalmente copia y pega el resultado, incluidas las variables de entorno confidenciales en un lugar público. Otro riesgo es que pase la variable de entorno a un programa que no la necesita (incluidos los elementos secundarios del proceso que necesita la contraseña) y ese programa expone sus variables de entorno porque no esperaba que fueran confidenciales. La gravedad de estos riesgos de fuga secundaria depende de lo que haga el proceso con la contraseña (¿cuánto tiempo dura? ¿Ejecuta subprocesos?).
Es más fácil asegurarse de que la contraseña no se filtre accidentalmente al pasarla a través de un canal que no está diseñado para ser escuchado, como una tubería. Esto es bastante fácil de hacer en el lado de envío. Por ejemplo, si tiene la contraseña en una variable de shell, simplemente puede hacer
echo "$password" | theprogram
si theprogram
espera la contraseña en su entrada estándar. Tenga en cuenta que esto es seguro porque echo
es un incorporado; no sería seguro con un comando externo ya que el argumento estaría expuesto en la ps
salida. Otra forma de lograr el mismo efecto es con un documento aquí:
theprogram <<EOF
$password
EOF
A algunos programas que requieren una contraseña se les puede pedir que la lean desde un descriptor de archivo específico. Puede usar un descriptor de archivo que no sea la entrada estándar si necesita una entrada estándar para otra cosa. Por ejemplo, con gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Si no se le puede decir al programa que lea desde un descriptor de archivo, pero se le puede decir que lea desde un archivo, puede decirle que lea desde un descriptor de archivo utilizando un nombre de archivo como `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
En ksh, bash o zsh, puede hacer esto de manera más concisa a través de la sustitución del proceso.
theprogram --password-from-file=<(echo "$password")