Wir möchten GPG-Signaturen verwenden, um einige Aspekte unserer Systemkonfigurationsverwaltungstools zu überprüfen. Darüber hinaus möchten wir ein "Vertrauensmodell" verwenden, bei dem einzelne Sysadmin-Schlüssel mit einem Master-Signaturschlüssel signiert werden. Anschließend vertrauen unsere Systeme diesem Master-Schlüssel (und verwenden das "Vertrauensnetz", um Signaturen durch unsere Sysadmins zu validieren).
Dies gibt uns viel Flexibilität, zum Beispiel die Möglichkeit, das Vertrauen in einen Schlüssel einfach zu widerrufen, wenn jemand abreist, aber wir haben ein Problem. Während der gpg
Befehl Ihnen mitteilt , ob ein Schlüssel nicht vertrauenswürdig ist, scheint er keinen Beendigungscode zurückzugeben, der auf diesen Sachverhalt hinweist. Beispielsweise:
# 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
Der Teil, der uns interessiert, ist der folgende:
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Der Exit-Code, der in diesem Fall von gpg zurückgegeben wird, ist 0, trotz des Vertrauensfehlers:
# echo $?
0
Wie kann gpg fehlschlagen, wenn etwas mit einer nicht vertrauenswürdigen Signatur signiert ist?
Ich habe einige Vorschläge gesehen, dass der gpgv
Befehl einen korrekten Exit-Code gpgv
zurückgibt, weiß aber leider nicht, wie man Schlüssel von Keyservern abruft. Ich denke, wir können die Statusausgabe (mit --status-fd) analysieren gpg
, aber gibt es einen besseren Weg?
quelle
Es gibt zwei Möglichkeiten (außer dem Parsen der Ausgabe).
Eine schnelle und schmutzige Art und Weise wäre zu laufen beide
gpg
undgpgv
. Bei der ersten Ausführung von wirdgpg
sichergestellt, dass der Schlüssel vom Keyserver abgerufen wurde, und Sie erhalten dann den gewünschtengpgv
Rückkehrcode.Eine elegantere, kontrollierte Möglichkeit (obwohl dies mehr Arbeit bedeuten würde) wäre die Verwendung der gpgme- Bibliothek zum Überprüfen der Signatur. Es ist eine C-Bibliothek, obwohl es Wrapper für Perl , PHP , Python und Ruby gibt . (Die Python-Version ist ziemlich niedrig, während die Ruby-Version einige Abstraktionen höherer Ebenen enthält, die sich in Bezug auf Perl oder PHP nicht sicher sind.)
Die GPGME-Bibliothek scheint mit Keyservern zu kommunizieren, wenn ich sie verwendet habe, obwohl Sie dies bestätigen möchten. Ich habe ein bisschen Code geschrieben, der die ruby gpgme-Bibliothek verwendet (Suche nach
verify
undverified_ok?
nach Code, der eine Signatur überprüft, und nachsig_output_lines
Code, der herausfindet, ob eine Signatur vertrauenswürdig ist).quelle
Was ist mit der Migration Ihrer Systemkonfiguration auf ein Tool wie Puppet oder Chef ?
Während eine nicht triviale Menge an Arbeit, Chef (ich habe Puppet nicht verwendet), müssen Sie Benutzerkonten erstellen (und Pub / Private Keys werden generiert). Obwohl dies nicht verhindert, dass Benutzer die lokalen Dateien auf dem Server ändern, wird chef-client regelmäßig ausgeführt und überschreibt ihre Änderungen beim nächsten Durchlauf. (Regelmäßige Wiederholungsläufe sind standardmäßig aktiviert.)
quelle