Gpg ile imza güvenini doğrulamak istiyor musunuz?


13

Sistem yapılandırma yönetimi araçlarımızın bazı yönlerini doğrulamak için gpg imzalarını kullanmak istiyoruz. Ayrıca, bağımsız sysadmin anahtarlarının bir ana imzalama anahtarıyla imzalandığı bir "güven" modeli kullanmak istiyoruz ve daha sonra sistemlerimiz bu ana anahtara güveniyor (ve sistem yöneticilerimiz tarafından imzaları doğrulamak için "güven ağını" kullanıyor).

Bu bize birileri terk ettiğinde bir anahtara olan güveni kolayca iptal etme yeteneği gibi çok fazla esneklik sağlar, ancak bir sorunla karşılaştık. İken gpgkomut edecek anlatmak anahtar güvenilmeyen ise size, gerçeği gösteren bir çıkış kodu geri dönmek için görünmüyor. Örneğin:

# 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 <someone@example.com>"
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

Önemsediğimiz kısım şudur:

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

Bu durumda gpg tarafından döndürülen çıkış kodu, güven hatasına rağmen 0'dır:

# echo $?
0

Güvenilmeyen bir imzayla bir şey imzalanması durumunda gpg'nin nasıl başarısız olmasını sağlayabiliriz?

gpgvKomutun uygun bir çıkış kodu döndüreceği konusunda bazı öneriler gördüm , ancak ne yazık ki gpgvanahtar sunucularından anahtarları nasıl alacağımı bilmiyor. Sanırım durum çıktısını (--status-fd kullanarak) ayrıştırabiliriz gpg, ancak daha iyi bir yol var mı?

Yanıtlar:


6

Sonuç olarak:

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

Bu, gpgçıktı olarak alınan güven bilgilerini arar --status-fd. Komut dosyası güvenilir olmayan bir imza varlığında (veya geçersiz / imza yokken) bir hata ile çıkıyor:

$ 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 <testuser@example.com>"
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

Komut dosyası, geçerli, güvenilir bir imza varlığında hatasız olarak çıkar:

$ 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

5

Sorunu bölmeye çalışayım:

İlk sorun, test ettiğiniz anahtarın güvenilir olmadığı anlaşılıyor.

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 <jdoe@noemail.com>"
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

Bunun kasıtlı olduğunu farz ... ama biz düzeltme nasıl ulaşmadan, beni kullanmak önerdiğimiz gpgv yerine gpg -v ? Nedenini bir dakika içinde göreceksiniz:

$ 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

Anahtar yok, güven yok ... Hayır, anahtarı Trustedkeys.gpg dosyasına aktarıyoruz

$ 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 <jdoe@noemail.com>" 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 <jdoe@noemail.com>"

$ echo $?
0

Umarım yardımcı olur


Sorumda gpgv hakkında yorum yaptım - gpgv ile ilgili sorun, daha kullanışlı bir hata kodu döndürürken, nasıl bir keyserver anahtarları getirileceğini bilmiyor olmasıdır.
larsks

1

İki seçenek akla geliyor (çıktıyı ayrıştırmak dışında).

Hızlı ve kirli bir yol hem gpg ve çalıştırmak olacaktır gpgv. İlk çalışması gpg, anahtarın anahtar sunucusundan alınmasını sağlar ve ardından gpgvistediğiniz dönüş kodunu verir.

Daha zarif, kontrollü bir yol (daha fazla iş gerektirse de) imzayı doğrulamak için gpgme kütüphanesini kullanmak olacaktır . Perl , PHP , Python ve Ruby için sarmalayıcılar olmasına rağmen bir C kütüphanesidir . (Python olanı oldukça düşük seviyedeyken, Ruby'nin Perl veya PHP'den emin olmayan daha yüksek seviyeli soyutlamaları vardır).

GPGME kütüphanesi, kullandığımda anahtar sunucularıyla konuşuyor gibi görünüyor, ancak bunu onaylamak istersiniz. Ben biraz yazdım yakut gpgme kütüphanesini kullanan kod (aramak verifyve verified_ok?doğrular bir imza ve için kodu için sig_output_linesbir imza güvenilir olup olmadığını çalışır bazı kod için).


-1

Sistem yapılandırmanızı Kukla veya Şef gibi bir araca geçirmeye ne dersiniz ?

Önemsiz miktarda çalışma yaparken, Şef (Kukla kullanmadım) kullanıcı hesapları oluşturmanız gerekir (ve pub / özel anahtarlar oluşturulur). Bu, kullanıcıların sunucudaki yerel dosyaları değiştirmesini engellemese de, chef-client periyodik olarak çalışır ve bir sonraki çalıştırmada değişikliklerinin üzerine yazacaktır. (Periyodik olarak tekrar eden çalışmalar varsayılan olarak gerçekleşir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.