Validando a confiança da assinatura com o gpg?

12

Gostaríamos de usar assinaturas gpg para verificar alguns aspectos de nossa ferramentas de gerenciamento de configuração do sistema. Além disso, gostaríamos de usar um modelo "trust" em que chaves sysadmin individuais são assinadas com um chave mestre de assinatura, e então nossos sistemas confiam nessa chave mestra (e use a "web of trust" para validar as assinaturas dos nossos administradores de sistemas.

Isso nos dá muita flexibilidade, como a capacidade de facilmente revogar a confiança em uma chave quando alguém sai, mas encontramos um problema. Enquanto o comando gpg irá informar você se uma chave é não confiável, não parece retornar um código de saída indicando facto. Por exemplo:

# gpg -v < foo.asc
Version: GnuPG v1.4.11 (GNU/Linux)
gpg: armor header: 
gpg: original file name=''
this is a test
gpg: Signature made Fri 22 Jul 2011 11:34:02 AM EDT using RSA key ID ABCD00B0
gpg: using PGP trust model
gpg: Good signature from "Testing Key <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: ABCD 1234 0527 9D0C 3C4A  CAFE BABE DEAD BEEF 00B0
gpg: binary signature, digest algorithm SHA1

A parte que nos interessa é esta:

gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.

O código de saída retornado por gpg neste caso é 0, apesar da confiança falha:

# echo $?
0

Como podemos fazer com que o gpg falhe no caso de algo ser assinado com uma assinatura não confiável?

Eu vi algumas sugestões de que o comando gpgv retornará um código de saída adequado, mas infelizmente gpgv não sabe como buscar chaves dos servidores de chaves. Eu acho que podemos analisar a saída de status (usando --status-fd) de gpg , mas existe uma maneira melhor?

    
por larsks 22.07.2011 / 17:55

4 respostas

5

Isto é o que acabou com:

#!/bin/sh

tmpfile=$(mktemp gpgverifyXXXXXX)
trap "rm -f $tmpfile" EXIT

gpg --status-fd 3 --verify "$@" 3> $tmpfile || exit 1
egrep -q '^\[GNUPG:] TRUST_(ULTIMATE|FULLY)' $tmpfile

Isso procura as informações de confiança que gpg geram em --status-fd . O script sai com um erro na presença de uma assinatura não confiável (ou inválida / sem assinatura):

$ sh checksig sample.sh.bad 
gpg: Signature made Mon 24 Jun 2013 11:42:58 AM EDT using RSA key ID DCD5C569
gpg: Good signature from "Test User <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 6FCD 3CF0 8BBC AD50 662E  5070 E33E D53C DCD5 C569
$ echo $?
1

O script sai sem erro na presença de uma assinatura válida e confiável:

$ sh checksig sample.sh.good
gpg: Signature made Mon 24 Jun 2013 11:38:49 AM EDT using RSA key ID 5C2864A8
gpg: Good signature from "Lars Kellogg-Stedman <...>"
$ echo $?
0
    
por 24.06.2013 / 17:47
5

Então, deixe-me tentar dividir o problema:

A primeira questão parece que a chave com a qual você está testando não é confiável.

gpg -v < test.txt.asc 
gpg: armor header: Version: GnuPG v1.4.11 (GNU/Linux)
gpg: original file name='test.txt'
this is a test
gpg: Signature made Thu 11 Aug 2011 09:09:35 PM EST using RSA key ID FE1B770E
gpg: using PGP trust model
gpg: Good signature from "John Doe <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 5DD8 216D ADB1 51E8 4326  3ACA 1DED BB72 FE1B 770E
gpg: binary signature, digest algorithm SHA1

Eu assumi que isso é intencional ... mas antes de chegarmos a como corrigir, deixe-me sugerir que você use gpgv em vez de gpg -v ? Você vai saber porque em um minuto:

$ gpgv < test.txt.asc 
gpgv: keyblock resource '/user/.gnupg/trustedkeys.gpg': file open error
gpgv: Signature made Thu 11 Aug 2011 09:09:35 PM EST using RSA key ID FE1B770E
gpgv: Can't check signature: public key not found

$ echo $?
2

Sem chave, sem confiança ... Não, nós importamos a chave para trustedkeys.gpg

$ gpg --no-default-keyring --keyring trustedkeys.gpg --import jdoe_pub.gpg
gpg: keyring '/user/.gnupg/trustedkeys.gpg' created
gpg: key FE1B770E: public key "John Doe <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
$ gpgv < test.txt.asc 
gpgv: Signature made Thu 11 Aug 2011 09:09:35 PM EST using RSA key ID FE1B770E
gpgv: Good signature from "John Doe <[email protected]>"

$ echo $?
0

Espero que ajude

    
por 11.08.2011 / 13:37
1

Duas opções vêm à mente (além de analisar a saída).

Uma maneira rápida e suja seria executar ambos gpg e gpgv . A primeira execução de gpg garantiria que a chave foi buscada no servidor de chaves e, em seguida, gpgv fornecerá o código de retorno desejado.

Uma maneira mais elegante e controlada (embora envolva mais trabalho) seria usar a biblioteca gpgme para verificar a assinatura. É uma biblioteca C, embora existam invólucros para Perl , PHP , Python e < href="http://ruby-gpgme.rubyforge.org/"> Ruby . (O Python é bem baixo, enquanto o Ruby tem algumas abstrações de nível mais alto, não tenho certeza sobre Perl ou PHP).

A biblioteca GPGME parece falar com os servidores de chaves quando eu os usei, embora você queira confirmar isso. Eu escrevi um pouco do código que usa a biblioteca ruby gpgme (pesquisa para verify e verified_ok? para o código que verifica uma assinatura e para sig_output_lines para algum código que funcione se uma assinatura é confiável).

    
por 06.09.2011 / 19:08
-1

Que tal migrar a configuração do seu sistema para uma ferramenta como o Puppet ou o Chef ?

Embora seja uma quantidade não trivial de trabalho, Chef (eu não usei Puppet) você deve criar contas de usuário (e as chaves pub / private são geradas). Embora isso não impeça que as pessoas modifiquem os arquivos locais no servidor, o chef-client é executado periodicamente e sobrescreverá as alterações na próxima execução. (Execuções recorrentes periódicas ocorrem por padrão.)

    
por 22.07.2011 / 19:48