rpmsign com prompt de senha da CLI

3

Estou trabalhando em uma estação de trabalho Fedora 25 (F25), o KDE. Estou escrevendo alguns scripts para realizar testes automatizados.

Um dos testes automatizados envolve a chamada do programa RPMSIGN (8) que, por sua vez, invoca o GPG (1) para anexar uma assinatura digital a alguns arquivos RPM que estou criando. Obviamente, o GPG usa pinentry (PIN entry) para solicitar que o ser humano insira a frase secreta para a chave de assinatura do RPM (um par de chaves RSA). Eu quero tirar o humano do loop e automatizar totalmente a tarefa de fornecer a senha para a chave de assinatura do RPM (e sim, eu sei sobre as implicações de segurança. Isso é simplesmente um ambiente de teste automatizado e não um host de produção, então Não estou muito preocupado com a segurança. Na versão de produção, o usuário digitará manualmente a senha da chave de assinatura do RPM.

No passado, usei um script EXPECT (1) que esperava que o GPG excluísse o texto "Enter pass phrase:" para o console e, em seguida, o script EXPECT digitaria a frase secreta e eu iria. Funcionou muito bem.

No F25, o recurso de pinagem quebra minha solução baseada em EXPECT existente para entrada automática da frase secreta para a chave de assinatura do RPM.

Quando executo o RPMSIGN em uma janela do console da GUI neste host F25, o GPG usa o pinentry para abrir uma caixa de diálogo da GUI que solicita ao usuário (eu) que insira a frase secreta para a chave de assinatura do RPM. Esse comportamento de pinagem, é claro, interfere e impede a entrada automática da frase secreta.

Se eu criar um script Bash que desabilite momentaneamente a variável de ambiente DISPLAY, não receberei mais a caixa de diálogo da GUI,

#!/bin/bash
DISPLAY_SAVE=$DISPLAY
unset DISPLAY
rpmsign --resign "/path/to/test-1.0.0-1.fc25.noarch.rpm"
export DISPLAY=$DISPLAY_SAVE

mas agora recebo uma versão ncurses da caixa de diálogo no console:

+----------------------------------------------------------------+
| Please enter the passphrase to unlock the OpenPGP secret key:  |
| "Testing (rpm-sign)"                                           |
| 1024-bit RSA key, ID 0123456789ABCDEF,                         |
| created 2016-12-02.                                            |
|                                                                |
|                                                                |
| Passphrase: __________________________________________________ |
|                                                                |
|         <OK>                                    <Cancel>       |
+----------------------------------------------------------------+

Mais uma vez, a "caixa de diálogo" do console de curses do tipo pinentry interfere e impede a entrada automática da frase secreta.

Eu não quero modificar ou desabilitar permanentemente os módulos de pinagem; Eu só quero desabilitá-los temporariamente para voltar ao prompt de CLI do GPG "Enter pass phrase:" (ou qualquer que seja a string de prompt agora) sem interferir na pinagem.

Alguma sugestão para automatizar totalmente a entrada da senha da chave de assinatura do RPM através da CLI sem interferência de pinagem?

    
por Jim Fischer 07.12.2016 / 08:33

3 respostas

6

Obrigado ao @Joe Damato por me apontar para o utilitário gpg-preset-passphrase . A solução descrita abaixo foi desenvolvida e testada em um host Fedora 25 com gnupg2-2.1.x instalado.

(nb Ainda não descobri como determinar o valor de keygrip da chave de assinatura do RPM em plataformas executando versões antigas do GnuPG porque elas não suportam a opção --with-keygrip . Se alguém quiser comentar sobre uma solução para isso, por favor, faça.)

Assegure que ~/.gnupg/gpg-agent.conf contenha a linha.

allow-preset-passphrase

Após modificar ~/.gnupg/gpg-agent.conf , recarregue o agente gpg.

$ gpg-connect-agent reloadagent /bye
OK

Liste as chaves GPG para obter o ID da chave com oito dígitos hexadecimais para a chave de assinatura do RPM. Neste exemplo, a ID da chave é 0123ABCD .

$ gpg --list-keys
/home/me/.gnupg/pubring.gpg
-----------------------------------
pub   1024R/0123ABCD 2015-06-13
uid                  Test (rpm-sign)

Obtenha o código do keygrip para a chave de assinatura do RPM. (nos navegadores RHEL 7.2 e Fedora 20 que utilizo para testes, o programa GPG2(1) nesses hosts não reconheceu a opção --with-keygrip .)

$ gpg2 --with-keygrip -K 0123ABCD
sec   rsa1024 2015-06-13 [SCEA]
      0A1B2C3D4E5F6A7B8C9D0E0F1A2B3C4D0123ABCD
      Keygrip = 2EACA0C5A4B46168EB91970B6715AF1AA52968BE
uid           [ unknown] Test (rpm-sign)

Armazene em cache a frase secreta para a chave de assinatura do RPM. Na linha de comando mostrada abaixo, substitua 'PASSPHRASE' pela senha real da chave de assinatura do RPM.

$ /usr/libexec/gpg-preset-passphrase --passphrase 'PASSPHRASE' --preset 2EACA0C5A4B46168EB91970B6715AF1AA52968BE

:: TESTE ::

Crie um arquivo RPM de teste que não esteja assinado. Verifique se o arquivo RPM de teste não está assinado.

$ rpm --checksig test-1.0.0-1.f25.noarch.rpm
test-1.0.0-1.fc25.noarch.rpm: sha1 md5 OK

Verifique se RPMSIGN(8) usa a senha armazenada em cache - ou seja, que RPMSIGN(8) não solicita a inserção da frase secreta para a chave de assinatura do RPM - ao assinar o arquivo RPM de teste.

$ rpmsign --resign test-1.0.0-1.f25.noarch.rpm

Verifique se o arquivo RPM de teste está assinado.

$ rpm --checksig test-1.0.0-1.f25.noarch.rpm
test-1.0.0-1.fc25.noarch.rpm: rsa sha1 (md5) pgp md5 OK

:: ADENDO 1 (2016-12-17) ::

De acordo com esta página da Web do GnuPG, edição 2331 :

gpg1 does not known about keygrips. Instead of the keygrip, gpg1 uses the fingerprint as cacheid for gpg-agent. The agent's command GET_PASSPHRAE, as used by gpg1, uses a different cache mode from what gpg-preset-passphrases uses. Thus even if you replace the keygrip with the fingerprint of the (sub)key, it won't work.

Por que vale a pena, eu fiz alguns testes com o GnuPG versão 2.0.x em hosts RHEL7 e gpg-preset-passphrase não parece ser suportado. Eu só posso obter gpg-preset-passphrase para trabalhar com o GnuPG versão 2.1.x.

Referências

ArcWiki do GnuPG

    
por 09.12.2016 / 05:46
4

Uma solução para esse tipo de problema é usar gpg-agent , que gerencia chaves secretas de GPG. Você pode usar essa ferramenta em conjunto com gpg-preset-passphrase para propagar a frase secreta no gpg-agent cache. Leia mais sobre o gpg-agent aqui . Isso permitirá que você evite a inserção manual de uma frase secreta para executar suas tarefas automatizadas.

BTW, escrevi um post útil sobre Assinatura GPG e verificação de pacotes RPM e repositórios YUM que você pode achar útil também.

    
por 07.12.2016 / 23:55
0

Ao adicionar / modificar a macro %__gpg_sign_cmd no seu arquivo .rpmmacros , você pode dizer ao gpg para ler a frase secreta de um arquivo. Use rpm --showrc para ver a aparência do seu %__gpg_sign_cmd atual e coloque-o no arquivo .rpmmacros , com a seguinte adição:

--batch --pinentry-mode loopback --passphrase-file /path/to/passphrase-file

Não se esqueça de terminar cada linha, exceto a última com \ , se você tiver um valor de várias linhas.

Isso fará com que o gpg não solicite de forma alguma a frase secreta e, em vez disso, leia-a a partir do arquivo definido. Isso representa um risco de segurança , portanto, considere se isso é algo que você deseja fazer e tome as medidas necessárias para protegê-lo (por exemplo, propriedade e permissão).

Exemplo de %__gpg_sign_cmd total em .rpmmacros :

%__gpg_sign_cmd %{__gpg} \
    gpg --no-verbose --no-armor --batch --pinentry-mode loopback \
    --passphrase-file /path/to/passphrase-file \
    %{?_gpg_digest_algo:--digest-algo %{_gpg_digest_algo}} \
    --no-secmem-warning \
    -u "%{_gpg_name}" -sbo %{__signature_filename} %{__plaintext_filename}

Assinando um pacote:

$ rpm --checksig somepackage.rpm 
somepackage.rpm: sha1 md5 OK

$ rpmsign --addsign somepackage.rpm
somepackage.rpm:

$ rpm --checksig somepackage.rpm 
somepackage.rpm: rsa sha1 (md5) pgp md5 OK
    
por 08.01.2019 / 14:16