Gostaríamos de usar assinaturas gpg para verificar alguns aspectos de nossas ferramentas de gerenciamento de configuração do sistema. Além disso, gostaríamos de usar um modelo de "confiança" em que chaves sysadmin individuais são assinadas com uma chave de assinatura principal e, em seguida, nossos sistemas confiam nessa chave mestra (e usam a "rede de confiança" para validar assinaturas por nossos administradores de sistema).
Isso nos dá muita flexibilidade, como a capacidade de revogar facilmente a confiança em uma chave quando alguém sai, mas encontramos um problema. Embora o gpg
comando diga se uma chave não é confiável, ela não parece retornar um código de saída indicando esse fato. 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 com a qual nos preocupamos é a seguinte:
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 nesse caso é 0, apesar da falha de confiança:
# echo $?
0
Como fazemos com que o gpg falhe no caso de algo ser assinado com uma assinatura não confiável?
Eu já vi algumas sugestões de que o gpgv
comando 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) gpg
, mas existe uma maneira melhor?
fonte
Duas opções vêm à mente (além de analisar a saída).
Uma maneira rápida e suja seria executar ambos
gpg
egpgv
. A primeira execuçãogpg
garantiria que a chave fosse buscada no servidor de chaves egpgv
forneceria o código de retorno desejado.Uma maneira mais elegante e controlada (embora isso envolvesse mais trabalho) seria usar a biblioteca gpgme para verificar a assinatura. É uma biblioteca C, embora haja wrappers para Perl , PHP , Python e Ruby . (O Python é de nível bastante baixo, enquanto o Ruby tem algumas abstrações de nível superior, não tenho certeza sobre Perl ou PHP).
A biblioteca GPGME parece conversar com os servidores de chaves quando eu a usei, embora você queira confirmar isso. Eu escrevi um pouco de código que usa a biblioteca ruby gpgme (pesquise
verify
e identifique overified_ok?
código que verifica uma assinatura, e procuresig_output_lines
algum código que verifique se uma assinatura é confiável).fonte
Que tal migrar a configuração do sistema para uma ferramenta como Puppet ou Chef ?
Enquanto uma quantidade não trivial de trabalho, Chef (eu não usei o Puppet), você deve criar contas de usuário (e chaves públicas / privadas são geradas). Embora isso não impeça as pessoas de modificar os arquivos locais no servidor, o chef-client é executado periodicamente e substituirá as alterações na próxima execução. (Execuções periódicas periódicas ocorrem por padrão.)
fonte