Existe uma maneira de obter um arquivo criptografado (GPG) on-the-fly em um script?

8

Preciso de um script bash para originar um arquivo criptografado, pois o arquivo que está sendo originado contém informações confidenciais.

Gostaria que o script solicitasse a senha do GPG e depois executasse, fornecendo o arquivo criptografado. Mas não consigo descobrir como fazer isso. Deve haver entrada do usuário para a senha, pois não quero armazenar uma chave no servidor com o arquivo criptografado.

Analisando alguns métodos diferentes, não quero descriptografar o arquivo, originar o arquivo não criptografado e excluí-lo depois. Gostaria de reduzir a chance de deixar um arquivo não criptografado para trás, se algo desse errado no script.

Existe uma maneira de obter a saída GPG de um arquivo para a fonte dessa maneira? Possivelmente coletando STDOUT e analisando-o (se o GPG puder gerar o conteúdo dessa maneira).

Além disso, se houver outra maneira de criptografar um arquivo que os scripts do shell possam usar, eu não o conheço, mas aberto a outras possibilidades.

BriGuy
fonte

Respostas:

16

Você pode fazer isso usando a substituição do processo .

. <(gpg -qd "$encrypted_filename")

Aqui está um exemplo:

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

gpg -dnão persiste o arquivo no disco, apenas o envia para o stdout. <()usa um FIFO , que também não resulta na gravação dos dados reais do arquivo no disco.

No bash, .e sourcesão sinônimos, mas .é mais portátil (faz parte do POSIX), então eu o usei aqui. Observe, no entanto, que <()não é tão portátil - até onde eu sei, é suportado apenas no bash, zsh, ksh88 e ksh93. pdksh e mksh têm coprocessos que podem ter o mesmo efeito.

Chris Down
fonte
Esta é uma solução muito boa. Pensou em um pipe nomeado, mas não queria gerenciá-lo. Eu não sabia que poderia fazê-lo dessa maneira.
BriGuy
Claro, se você tem uma preocupação sobre alguém ser capaz de ler um arquivo temporário, com isso, você tem exatamente a mesma preocupação com alguém ser capaz de ler o tubo temporário criado por <(command).
Zan Lynx
@ZanLynx A pergunta afirma explicitamente que se trata de não persistir no disco. A solução para fazer isso de forma segura é a mesma que em qualquer outro lugar: use um usuário que apenas você controla e faça em um sistema em que apenas você tenha root.
Chris Baixo
1
Você também pode fazer isso com um arquivo criptografado aescrypt (o que eu fiz): . <(aescrypt -d -o - file.aes)
Freedom_Ben
3

Se você gpg-agentconfigurou corretamente, usando pinentry-ttyou alguma outra versão que não polua stdin / stdout, você poderá fazer algo como:

source <( gpg --decrypt file.gpg )

Isso usa substituição de processo para alimentar o resultado sourcecomo se fosse um arquivo. Os dados específicos do arquivo desaparecerão assim que o shell for concluído, embora você ainda precise tomar cuidado com os dados confidenciais na memória do shell.

Tom Hunt
fonte
0

Como a resposta mais sensata já foi dada, aqui está uma resposta insana - use este sistema de arquivos:

https://github.com/jseppanen/gpgfs

Dessa forma, seu programa não notará que está falando com um pipe.

d33tah
fonte