¿Hay alguna manera de obtener un archivo cifrado (GPG) sobre la marcha en un script?

8

Necesito una secuencia de comandos bash para obtener un archivo cifrado, ya que el archivo que se obtiene contiene información confidencial.

Me gustaría que el script solicite la frase de contraseña GPG y luego se ejecute, obteniendo el archivo cifrado. Sin embargo, no puedo entender cómo hacer esto. Debe haber una entrada del usuario para la frase de contraseña, ya que no quiero almacenar una clave en el servidor con el archivo cifrado.

Buscando algunos métodos diferentes, no quiero descifrar el archivo, obtener el archivo no cifrado y luego eliminarlo. Me gustaría reducir la posibilidad de dejar un archivo no encriptado si algo sale mal en el script.

¿Hay alguna manera de obtener la salida GPG de un archivo para obtenerlo de esta manera? Posiblemente recopilar STDOUT y analizarlo (si GPG puede incluso generar el contenido de esta manera).

Además, si hay otra forma de cifrar un archivo que los scripts de shell pueden usar, no lo sé, pero estoy abierto a otras posibilidades.

BriGuy
fuente

Respuestas:

16

Puede hacerlo utilizando la sustitución de procesos .

. <(gpg -qd "$encrypted_filename")

Aquí hay un ejemplo:

% cat > to-source <<< 'echo "Hello"'
% . ./to-source                     
Hello
% gpg -e -r chris@chrisdown.name to-source
% . <(gpg -qd to-source.gpg)
Hello

gpg -dno conserva el archivo en el disco, solo lo envía a stdout. <()usa un FIFO , que tampoco da como resultado que los datos del archivo real se escriban en el disco.

En bash, .y sourceson sinónimos, pero .es más portátil (es parte de POSIX), así que lo he usado aquí. Tenga en cuenta, sin embargo, que <()no es tan portátil, que yo sepa, solo es compatible con bash, zsh, ksh88 y ksh93. pdksh y mksh tienen coprocesos que pueden tener el mismo efecto.

Chris Down
fuente
Esta es una muy buena solución. Pensé en una tubería con nombre, pero no quería administrarla. No sabía que podía hacerlo de esta manera.
BriGuy
Por supuesto, si le preocupa que alguien pueda leer un ARCHIVO temporal, con esto tiene exactamente la misma preocupación con alguien que pueda leer la tubería temporal creada por <(command).
Zan Lynx
@ZanLynx La pregunta establece explícitamente que se trata de no persistir en el disco. La solución para hacer esto de forma segura es la misma que en cualquier otro lugar: use un usuario que solo usted controle y hágalo en un sistema donde solo usted tiene root.
Chris Down
1
También puede hacer esto con un archivo cifrado aescrypt (que hice): . <(aescrypt -d -o - file.aes)
Freedom_Ben
3

Si ha gpg-agentconfigurado correctamente, utilizando pinentry-ttyo alguna otra versión que no contamine stdin / stdout, entonces debería poder hacer algo como:

source <( gpg --decrypt file.gpg )

Esto utiliza la sustitución de procesos para alimentar el resultado sourcecomo si fuera un archivo. Los datos específicos del archivo desaparecerán tan pronto como el shell termine con él, aunque aún debe tener cuidado con los datos sensibles en la memoria del shell después de eso.

Tom Hunt
fuente
0

Dado que la respuesta más sensata ya se ha dado, aquí hay una loca: use este sistema de archivos:

https://github.com/jseppanen/gpgfs

De esta manera, su programa no notará que está hablando con una tubería.

d33tah
fuente