Nos gustaría utilizar las firmas gpg para verificar algunos aspectos de nuestras herramientas de administración de configuración del sistema. Además, nos gustaría usar un modelo de "confianza" en el que las claves individuales del administrador de sistemas se firman con una clave maestra de firma, y luego nuestros sistemas confían en esa clave maestra (y usan la "red de confianza" para validar las firmas de nuestros administradores de sistemas).
Esto nos da mucha flexibilidad, como la capacidad de revocar fácilmente la confianza en una clave cuando alguien se va, pero nos hemos encontrado con un problema. Si bien el gpg
comando le dirá si una clave no es confiable, no parece devolver un código de salida que indique este hecho. Por ejemplo:
# 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
La parte que nos importa es esta:
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
El código de salida devuelto por gpg en este caso es 0, a pesar de la falla de confianza:
# echo $?
0
¿Cómo conseguimos que gpg falle en caso de que algo esté firmado con una firma no confiable?
He visto algunas sugerencias de que el gpgv
comando devolverá un código de salida adecuado, pero desafortunadamente gpgv
no sabe cómo obtener claves de los servidores de claves. Supongo que podemos analizar la salida de estado (usando --status-fd) desde gpg
, pero ¿hay una mejor manera?
fuente
Se me ocurren dos opciones (aparte de analizar la salida).
Una forma rápida y sucia sería ejecutar ambos
gpg
ygpgv
. La primera ejecución degpg
garantizaría que la clave se obtuviera del servidor de claves, y luegogpgv
le daría el código de retorno que desea.Una forma más elegante y controlada (aunque implicaría más trabajo) sería utilizar la biblioteca gpgme para verificar la firma. Es una biblioteca C, aunque hay contenedores para Perl , PHP , Python y Ruby . (El Python tiene un nivel bastante bajo, mientras que el Ruby tiene algunas abstracciones de mayor nivel, no estoy seguro acerca de Perl o PHP).
La biblioteca GPGME parece hablar con los servidores de claves cuando la he usado, aunque querría confirmar eso. He escrito un poco de código que usa la biblioteca ruby gpgme (busca
verify
yverified_ok?
busca código que verifique una firma, ysig_output_lines
para algún código que determine si una firma es confiable).fuente
¿Qué pasa con la migración de la configuración de su sistema a una herramienta como Puppet o Chef ?
Si bien es una cantidad de trabajo no trivial, Chef (no he usado Puppet) debe crear cuentas de usuario (y se generan claves de pub / privadas). Si bien esto no impide que las personas modifiquen los archivos locales en el servidor, chef-client se ejecuta periódicamente y sobrescribirá sus cambios en la próxima ejecución. (Las ejecuciones periódicas periódicas se producen de forma predeterminada).
fuente