Estoy escribiendo un bashscript y necesito pedirle al usuario su contraseña y pasarla openssl. Si bien opensslpuedo leer la contraseña en sí, necesito dos ejecuciones del programa y no quiero preguntarle dos veces al usuario. Aquí está el guión:
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
Esto no es seguro ya que la contraseña está fácilmente disponible mirando la línea de comando; alguien puede leerlo usando ps, por ejemplo.
opensslpuede leer una contraseña de una variable de entorno, por lo que puede sustituir -k "$PASS"con -pass env:PASS, pero todavía no es seguro; Las variables de entorno de cualquier proceso pueden leerse libremente (de nuevo, pspueden hacerlo).
Entonces, ¿cómo puedo pasar con seguridad la contraseña a las dos opensslinstancias?
bash
command-line
password
openssl
Chris Down
fuente
fuente

pslee el entorno de un proceso/proc/<pid>/environ, pero este archivo tiene0600permisos, por lo que solo el usuario root y el usuario que ejecuta el proceso pueden leer el entorno del proceso. Yo diría que es bastante seguro.Respuestas:
Pase la contraseña en un descriptor de archivo separado de la entrada (dos veces, una para cifrar y otra para descifrar). No exportar
PASSal medio ambiente.Si su sistema no tiene
/dev/fd, puede usar el-passargumento para indicaropensslque lea la frase de contraseña de un descriptor de archivo abierto.fuente
bashversión conenv:PASS.printf '%s\n' "$PASS"no es seguro Alguien puede leer la línea de comando con,pspor ejemplo.env:PASSno es seguro porque la contraseña aparecería en el entorno delopensslproceso (no aparecería en el entorno delbashproceso, pero eso no es suficiente). Usarprintfes seguro porque es un bash incorporado.echo $PASS | openssl .... No aparecería en el listado de ps. El único lugar donde puede pasar sería en la memoria del proceso bash. Yo creo que ?echosería seguro por la misma razón queprintfes seguro (yprintfno sería seguro en un shell donde no está integrado). La razón por la que usoprintfy noechoes queechopuede alterar las barras invertidas (dependiendo de las opciones de bash).Usando Bash se puede hacer sin usar
printf '%s\n' "$PASS"asociando una llamada cadena aquí con descriptores de archivo usando elexeccomando incorporado Bash .Para obtener más información, consulte: Seguridad de contraseña de script de shell de parámetros de línea de comandos .
fuente
Lo siento, mi respuesta anterior fue de openssl man, no de openssl enc docs.
Esta solución no es una tubería, pero creo que evita que la contraseña sea visible para ps.
Usando un documento aquí, solo openssl ve el texto de la contraseña.
Mientras esté seguro de eliminar el archivo intermedio, no queda rastro. ¿Quizás alguien puede ayudar a hacer esto en una tubería y eliminar el archivo intermedio?
fuente
enccomando no tiene-kninterruptor, al menos en las versiones actuales, es-pass), pero no es muy informativo. (El voto negativo no es mío.)