Estoy escribiendo un bash
script y necesito pedirle al usuario su contraseña y pasarla openssl
. Si bien openssl
puedo 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.
openssl
puede 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, ps
pueden hacerlo).
Entonces, ¿cómo puedo pasar con seguridad la contraseña a las dos openssl
instancias?
bash
command-line
password
openssl
Chris Down
fuente
fuente
ps
lee el entorno de un proceso/proc/<pid>/environ
, pero este archivo tiene0600
permisos, 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
PASS
al medio ambiente.Si su sistema no tiene
/dev/fd
, puede usar el-pass
argumento para indicaropenssl
que lea la frase de contraseña de un descriptor de archivo abierto.fuente
bash
versión conenv:PASS
.printf '%s\n' "$PASS"
no es seguro Alguien puede leer la línea de comando con,ps
por ejemplo.env:PASS
no es seguro porque la contraseña aparecería en el entorno delopenssl
proceso (no aparecería en el entorno delbash
proceso, pero eso no es suficiente). Usarprintf
es 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 ?echo
sería seguro por la misma razón queprintf
es seguro (yprintf
no sería seguro en un shell donde no está integrado). La razón por la que usoprintf
y noecho
es queecho
puede 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 elexec
comando 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
enc
comando no tiene-kn
interruptor, al menos en las versiones actuales, es-pass
), pero no es muy informativo. (El voto negativo no es mío.)