กำลังตรวจสอบความน่าเชื่อถือของลายเซ็นกับ gpg หรือไม่


13

เราต้องการใช้ลายเซ็น gpg เพื่อตรวจสอบบางแง่มุมของเครื่องมือการจัดการการกำหนดค่าระบบของเรา นอกจากนี้เราต้องการใช้รูปแบบ "ความไว้วางใจ" ที่คีย์ดูแลระบบแต่ละคีย์ถูกเซ็นชื่อด้วยคีย์การเซ็นชื่อหลักจากนั้นระบบของเราจะเชื่อถือคีย์หลักนั้น (และใช้ "เว็บที่ไว้วางใจ" เพื่อตรวจสอบลายเซ็นโดย sysadmins ของเรา)

สิ่งนี้ทำให้เรามีความยืดหยุ่นมากเช่นความสามารถในการเพิกถอนความไว้วางใจในคีย์เมื่อมีคนออกไปได้อย่างง่ายดาย แต่เราพบปัญหา ในขณะที่gpgคำสั่งจะบอกคุณว่าคีย์ไม่น่าเชื่อถือหรือไม่ดูเหมือนว่าจะส่งคืนรหัสออกซึ่งบ่งชี้ข้อเท็จจริงนี้ ตัวอย่างเช่น:

# 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

ส่วนที่เราใส่ใจคือ:

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

รหัสทางออกที่ส่งคืนโดย gpg ในกรณีนี้คือ 0 แม้จะมีความน่าเชื่อถือล้มเหลว:

# echo $?
0

เราจะทำให้ gpg ล้มเหลวในกรณีที่มีบางสิ่งถูกเซ็นชื่อด้วยลายเซ็นที่ไม่น่าเชื่อถือได้อย่างไร

ฉันเห็นคำแนะนำบางอย่างแล้วว่าgpgvคำสั่งจะส่งคืนรหัสการออกที่ถูกต้อง แต่น่าเสียดายที่gpgvไม่รู้วิธีดึงข้อมูลคีย์จาก keyservers ฉันเดาว่าเราสามารถแยกวิเคราะห์สถานะเอาต์พุต (โดยใช้ --status-fd) จากgpgแต่มีวิธีที่ดีกว่านี้หรือไม่

คำตอบ:


6

นี่คือสิ่งที่จบลงด้วย:

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

ลักษณะนี้สำหรับข้อมูลความไว้วางใจที่เอาท์พุทบนgpg --status-fdสคริปต์ออกจากข้อผิดพลาดต่อหน้าลายเซ็นที่ไม่น่าเชื่อถือ (หรือลายเซ็นไม่ถูกต้อง / ไม่มี):

$ 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

สคริปต์ออกโดยไม่มีข้อผิดพลาดต่อหน้าลายเซ็นที่ถูกต้องและเชื่อถือได้:

$ 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

ดังนั้นฉันจะพยายามแยกปัญหา:

ปัญหาแรกดูเหมือนว่ากุญแจที่คุณใช้ทดสอบนั้นไม่น่าเชื่อถือ

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

ฉันคิดว่านี่เป็นความตั้งใจ ... แต่ก่อนที่เราจะแก้ไขวิธีให้ฉันแนะนำให้คุณใช้gpgvแทนgpg -v ? คุณจะเห็นว่าทำไมในไม่กี่นาที:

$ 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

ไม่มีกุญแจไม่มีความน่าเชื่อถือ ... เราไม่นำเข้ากุญแจไปที่ 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 <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

หวังว่ามันจะช่วย


ฉันแสดงความคิดเห็นใน gpgv ในคำถามของฉัน - ปัญหาของ gpgv คือในขณะที่มันส่งคืนรหัสข้อผิดพลาดที่มีประโยชน์มากขึ้นก็ไม่ทราบวิธีการดึงกุญแจจาก keyserver
larsks

1

มีตัวเลือกสองอย่างที่นึกถึง (นอกเหนือจากการแยกวิเคราะห์เอาต์พุต)

วิธีที่รวดเร็วและสกปรกจะทำงานทั้งใน และgpg gpgvการเรียกใช้ครั้งแรกgpgจะช่วยให้มั่นใจว่ามีการดึงคีย์จาก keyserver จากนั้นgpgvจะให้รหัสส่งคืนที่คุณต้องการ

วิธีที่หรูหราและมีการควบคุมมากขึ้น (แม้ว่าจะเกี่ยวข้องกับการทำงานมากขึ้น) ก็คือการใช้ไลบรารีgpgmeเพื่อตรวจสอบลายเซ็น มันเป็นห้องสมุดเซลเซียสแม้ว่าจะมีห่อสำหรับPerl , PHP , PythonและRuby (Python หนึ่งอยู่ในระดับค่อนข้างต่ำในขณะที่ Ruby หนึ่งมี abstractions ระดับที่สูงขึ้นบางอย่างไม่แน่ใจเกี่ยวกับ Perl หรือ PHP)

ไลบรารี GPGME ดูเหมือนจะพูดคุยกับ keyservers เมื่อฉันใช้แม้ว่าคุณจะต้องการยืนยัน ฉันได้เขียนโค้ดเล็กน้อยที่ใช้ไลบรารี ruby ​​gpgme (ค้นหาverifyและverified_ok?หารหัสที่ตรวจสอบลายเซ็นและสำหรับsig_output_linesรหัสบางอย่างที่ใช้งานได้ว่าลายเซ็นน่าเชื่อถือ)


-1

สิ่งที่เกี่ยวกับการย้ายการกำหนดค่าระบบของคุณเพื่อเครื่องมือเช่นหุ่นกระบอกหรือเชฟ ?

ในขณะที่มีปริมาณงานไม่มากพ่อครัว (ฉันไม่ได้ใช้ Puppet) คุณต้องสร้างบัญชีผู้ใช้ (และสร้าง pub / private keys) แม้ว่าสิ่งนี้จะไม่ป้องกันผู้คนจากการแก้ไขไฟล์ในเครื่องบนเซิร์ฟเวอร์ แต่ Chef-client จะทำงานเป็นระยะและจะเขียนทับการเปลี่ยนแปลงในการทำงานครั้งต่อไป (การเรียกใช้ซ้ำเป็นประจำจะเกิดขึ้นตามค่าเริ่มต้น)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.