Memvalidasi kepercayaan tanda tangan dengan gpg?

13

Kami ingin menggunakan tanda tangan gpg untuk memverifikasi beberapa aspek dari alat manajemen konfigurasi sistem kami. Selain itu, kami ingin menggunakan model "kepercayaan" di mana kunci sysadmin individual ditandatangani dengan kunci penandatanganan master, dan kemudian sistem kami mempercayai kunci master (dan menggunakan "web of trust" untuk memvalidasi tanda tangan oleh sysadmin kami).

Ini memberi kami banyak fleksibilitas, seperti kemampuan untuk dengan mudah mencabut kepercayaan pada kunci ketika seseorang pergi, tetapi kami mengalami masalah. Sementara gpgperintah akan memberi tahu Anda jika kunci tidak dipercaya, tampaknya tidak mengembalikan kode keluar yang menunjukkan fakta ini. Sebagai contoh:

# 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

Bagian yang kami pedulikan adalah ini:

gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.

Kode keluar yang dikembalikan oleh gpg dalam hal ini adalah 0, meskipun kegagalan kepercayaan:

# echo $?
0

Bagaimana caranya agar gpg gagal jika ada sesuatu yang ditandatangani dengan tanda tangan tidak tepercaya?

Saya telah melihat beberapa saran bahwa gpgvperintah akan mengembalikan kode keluar yang tepat, tetapi sayangnya gpgvtidak tahu cara mengambil kunci dari server kunci. Saya kira kita dapat mem-parsing keluaran status (menggunakan --status-fd) dari gpg, tetapi apakah ada cara yang lebih baik?

larsks
sumber

Jawaban:

6

Inilah yang berakhir dengan:

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

Ini mencari informasi kepercayaan yang gpgdihasilkan --status-fd. Script keluar dengan kesalahan di hadapan tanda tangan yang tidak dipercaya (atau tidak valid / tidak ada tanda tangan):

$ 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

Script keluar tanpa kesalahan di hadapan tanda tangan yang valid dan tepercaya:

$ 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
sumber
5

Jadi izinkan saya mencoba untuk membagi masalah:

Masalah pertama tampaknya bahwa kunci yang Anda uji tidak dapat dipercaya.

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

Saya berasumsi ini disengaja ... tapi sebelum kita sampai ke cara memperbaikinya, izinkan saya menyarankan Anda menggunakan gpgv daripada gpg -v ? Anda akan melihat mengapa dalam satu menit:

$ 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

Tidak ada kunci, tidak ada kepercayaan ... Tidak, kami mengimpor kunci ke dipercayakeys.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

Semoga ini bisa membantu

Andre de Miranda
sumber
Saya mengomentari gpgv dalam pertanyaan saya - masalah dengan gpgv adalah bahwa sementara ia mengembalikan kode kesalahan yang lebih berguna, ia tidak tahu bagaimana cara mengambil kunci dari keyserver.
larsks
1

Dua opsi muncul di pikiran (selain parsing output).

Cara cepat dan kotor adalah dengan menjalankan keduanya gpg dan gpgv. Jalankan pertama gpgakan memastikan kunci diambil dari server kunci, dan kemudian gpgvakan memberi Anda kode kembali yang Anda inginkan.

Cara yang lebih elegan dan terkontrol (meskipun akan melibatkan lebih banyak pekerjaan) adalah menggunakan pustaka gpgme untuk memverifikasi tandatangan. Ini adalah pustaka C, meskipun ada pembungkus untuk Perl , PHP , Python dan Ruby . (Yang Python adalah tingkat yang cukup rendah, sedangkan yang Ruby memiliki beberapa abstraksi tingkat yang lebih tinggi, tidak yakin tentang Perl atau PHP).

Pustaka GPGME tampaknya berbicara dengan server kunci ketika saya menggunakannya, meskipun Anda ingin mengonfirmasi itu. Saya telah menulis sedikit kode yang menggunakan pustaka gpgme ruby (mencari verifydan verified_ok?untuk kode yang memverifikasi tanda tangan, dan sig_output_linesuntuk beberapa kode yang mengetahui apakah tanda tangan tepercaya).

Hamish Downer
sumber
-1

Bagaimana dengan memigrasikan konfigurasi sistem Anda ke alat seperti Wayang atau Koki ?

Meskipun jumlah pekerjaan yang tidak sepele, Chef (saya belum menggunakan Wayang) Anda harus membuat akun pengguna (dan kunci pub / pribadi dihasilkan). Meskipun hal ini tidak mencegah orang untuk memodifikasi file lokal di server, chef-client berjalan secara berkala, dan akan menimpa perubahan mereka pada menjalankan berikutnya. (Berjalan berkala berulang terjadi secara default.)

gWaldo
sumber