Nous aimerions utiliser les signatures gpg pour vérifier certains aspects de nos outils de gestion de la configuration du système. De plus, nous aimerions utiliser un modèle de «confiance» dans lequel les clés sysadmin individuelles sont signées avec une clé de signature principale, puis nos systèmes font confiance à cette clé principale (et utilisent le «web de confiance» pour valider les signatures de nos administrateurs système).
Cela nous donne beaucoup de flexibilité, comme la possibilité de révoquer facilement la confiance sur une clé lorsque quelqu'un part, mais nous avons rencontré un problème. Bien que la gpg
commande vous indique si une clé n'est pas approuvée, elle ne semble pas renvoyer un code de sortie indiquant ce fait. Par exemple:
# 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 partie qui nous tient à cœur est la suivante:
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Le code de sortie renvoyé par gpg dans ce cas est 0, malgré l'échec de l'approbation:
# echo $?
0
Comment faire échouer gpg dans le cas où quelque chose est signé avec une signature non fiable?
J'ai vu quelques suggestions selon lesquelles la gpgv
commande renverrait un code de sortie correct, mais gpgv
ne sait malheureusement pas comment récupérer les clés des serveurs de clés. Je suppose que nous pouvons analyser la sortie d'état (en utilisant --status-fd) gpg
, mais y a-t-il une meilleure façon?
Deux options viennent à l'esprit (autre que l'analyse de la sortie).
Un moyen rapide et sale serait d'exécuter les deux
gpg
etgpgv
. La première exécution degpg
garantirait que la clé a été récupérée à partir du serveur de clés, puisgpgv
vous donnera le code retour que vous souhaitez.Une manière plus élégante et contrôlée (bien que cela impliquerait plus de travail) serait d'utiliser la bibliothèque gpgme pour vérifier la signature. Il s'agit d'une bibliothèque C, bien qu'il existe des wrappers pour Perl , PHP , Python et Ruby . (Celui de Python est de niveau assez bas, tandis que celui de Ruby a des abstractions de niveau supérieur, pas sûr de Perl ou PHP).
La bibliothèque GPGME semble parler aux serveurs de clés lorsque je l'ai utilisée, bien que vous souhaitiez le confirmer. J'ai écrit un peu de code qui utilise la bibliothèque gpgme rubis (recherche
verify
etverified_ok?
pour le code qui vérifie une signature, etsig_output_lines
pour un code qui fonctionne si une signature est digne de confiance).la source
Qu'en est-il de la migration de la configuration de votre système vers un outil comme Puppet ou Chef ?
Bien qu'une quantité de travail non négligeable, Chef (je n'ai pas utilisé Puppet), vous devez créer des comptes d'utilisateurs (et les clés pub / privées sont générées). Bien que cela n'empêche pas les utilisateurs de modifier les fichiers localement sur le serveur, chef-client s'exécute périodiquement et écrasera leurs modifications lors de la prochaine exécution. (Des exécutions périodiques périodiques se produisent par défaut.)
la source