Programaticamente Determine se o gpg-agent pedirá a frase secreta

0

Eu tenho gpg-agent em execução com uma frase secreta em cache por uma hora ou mais. Eu criptografo minhas senhas de contas de e-mail para o utilitário de sincronização offlineimap IMAP e faço o script passar as senhas descriptografando-as a partir de um arquivo criptografado por GPG.

Como eu executo offlineimap com o systemd, já que é uma tarefa do cron, ele irá naturalmente mostrar um programa de pinagem e solicitar a senha. Eu queria saber se há uma maneira de confirmar programaticamente se gpg-agent precisará de uma frase secreta para que eu possa consultar as informações e sair da tarefa do systemd / cron se a entrada da frase de inserção interativa for necessária.

Alguém já fez isso antes?

    
por songei2f 08.04.2014 / 12:53

2 respostas

1

Eu só tenho o plano semelhante para buscar periodicamente / sincronizar os e-mails usando mbsync e cron . As senhas são gerenciadas pelo pass que usa o GnuPG para criptografar os dados confidenciais.

O mais novo GnuPG (estou usando v2.1.18) deve usar gpg-agent para pedir a senha necessária para descriptografar as chaves privadas. E o gpg-agent será iniciado automaticamente quando, por exemplo, invoco pass para obter a senha da minha conta de e-mail e abrirá a caixa de diálogo pinentry solicitando a frase secreta.

Eu não quero configurar gpg-agent para armazenar em cache minha frase-senha por muito tempo (por exemplo, 1 dia ou até 1 ano) e não quero a caixa de diálogo pinentry irritante de gpg-agent acionado pelas tarefas agendadas, que devem ser apenas silenciosas.

Acho que a tarefa mbsync cron sincronizará meus e-mails quando gpg puder descriptografar a senha para pass sem acionar gpg-agent para solicitar ao usuário a frase secreta, caso contrário, a tarefa cron só sairá.

Eu encontrei o GnuPG tem a opção --pinentry-mode , que pode ter valores:

  • default : use o padrão do agente, que é ask .
  • ask : força o uso do Pinentry.
  • cancel : Emula o uso do botão Cancelar do Pinentry.
  • error : Retorna um erro de Pinentry ('' No Pinentry '').
  • loopback : redireciona as consultas do Pinentry para o chamador. Observe que, em contraste com o Pinentry, o usuário não será solicitado novamente se inserir uma senha incorreta.

Portanto, posso desabilitar explicitamente o uso de pinagem passando --pinentry-mode cancel ou --pinentry-mode error e deixe gpg tentar assinar / descriptografar uma mensagem. Se for bem sucedido, então gpg-agent já tem a frase secreta em cache e não exibirá a caixa de diálogo pinentry ; caso contrário, o teste de sinal / decodificação falhou.

Por exemplo:

Quando gpg-agent não armazena em cache a frase-senha necessária:

$ echo "test" | \
  gpg2 --sign --batch --no-tty --pinentry-mode error \
       --local-user <[email protected]> -o /dev/null

# Return code: 2
# OUTPUT:
# gpg: signing failed: No pinentry
# gpg: signing failed: No pinentry

Quando gpg-agent já armazenou em cache a frase secreta, o mesmo comando será bem-sucedido e retornará o código de status 0.

Se eu usar --pinentry-mode cancel , então gpg falhará com Operation cancelled .

    
por 25.05.2017 / 10:10
0

Eu não sei ao certo, mas eu me pergunto se é sensato ter essa opção porque ela poderia ser facilmente usada como:

#!/bin/sh
if gpg_ready_to_work_without_pinentry; then
    do_something_malicious_with_the_key;
fi

e você não teria nenhuma chance de detectar um uso indevido. (Na verdade eu nem gosto que cada programa na minha sessão de login tenha acesso à minha chave possivelmente desbloqueada sem uma maneira de verificar se ele está desbloqueado ou não. Eu encontrei sua pergunta na busca de uma opção para o gpg-agent pop uma caixa de diálogo de confirmação para cada uso exatamente por esse motivo.)

    
por 12.01.2015 / 19:58

Tags