Signaturvertrauen mit gpg validieren?

13

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 gpgBefehl 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 gpgvBefehl einen korrekten Exit-Code gpgvzurü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?

larsks
quelle

Antworten:

6

Dies ist, was endete mit:

#!/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

Dies sucht nach den Vertrauensinformationen, die gpgausgegeben werden --status-fd. Das Skript wird mit einem Fehler beendet, wenn eine nicht vertrauenswürdige Signatur (oder eine ungültige / keine Signatur) vorliegt:

$ 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

Das Skript wird ohne Fehler beendet, wenn eine gültige, vertrauenswürdige Signatur vorliegt:

$ 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
larsks
quelle
5

Lassen Sie mich versuchen, das Problem aufzuteilen:

Das erste Problem scheint, dass der Schlüssel, gegen den Sie testen, nicht vertrauenswürdig ist.

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

Ich nahm an, dass dies beabsichtigt ist ... aber bevor wir uns der Behebung zuwenden , möchte ich vorschlagen, dass Sie gpgv anstelle von gpg -v verwenden . Sie werden gleich sehen, warum:

$ 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

Kein Schlüssel, kein Vertrauen ... Nein, wir importieren den Schlüssel in 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

Ich hoffe es hilft

Andre de Miranda
quelle
Ich habe gpgv in meiner Frage kommentiert - das Problem mit gpgv ist, dass es zwar einen nützlicheren Fehlercode zurückgibt, aber nicht weiß, wie man Schlüssel von einem Schlüsselserver abruft.
Larsks
1

Es gibt zwei Möglichkeiten (außer dem Parsen der Ausgabe).

Eine schnelle und schmutzige Art und Weise wäre zu laufen beide gpg und gpgv. Bei der ersten Ausführung von wird gpgsichergestellt, dass der Schlüssel vom Keyserver abgerufen wurde, und Sie erhalten dann den gewünschten gpgvRü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 verifyund verified_ok?nach Code, der eine Signatur überprüft, und nach sig_output_linesCode, der herausfindet, ob eine Signatur vertrauenswürdig ist).

Hamish Downer
quelle
-1

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.)

gWaldo
quelle