Xác thực chữ ký với gpg?


13

Chúng tôi muốn sử dụng chữ ký gpg để xác minh một số khía cạnh của các công cụ quản lý cấu hình hệ thống của chúng tôi. Ngoài ra, chúng tôi muốn sử dụng mô hình "tin cậy" trong đó các khóa sysadmin riêng lẻ được ký bằng khóa ký chính và sau đó hệ thống của chúng tôi tin cậy khóa chính đó (và sử dụng "web tin cậy" để xác thực chữ ký của các sysadins của chúng tôi).

Điều này mang lại cho chúng tôi rất nhiều sự linh hoạt, chẳng hạn như khả năng dễ dàng thu hồi niềm tin vào một chìa khóa khi ai đó rời đi, nhưng chúng tôi gặp phải một vấn đề. Mặc dù gpglệnh sẽ cho bạn biết nếu một khóa không đáng tin cậy, nhưng nó không xuất hiện để trả về mã thoát cho biết thực tế này. Ví dụ:

# 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

Phần chúng tôi quan tâm là đây:

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

Mã thoát được trả về bởi gpg trong trường hợp này là 0, mặc dù lỗi tin cậy:

# echo $?
0

Làm thế nào để chúng ta có được gpg thất bại trong trường hợp một cái gì đó được ký với một chữ ký không đáng tin cậy?

Tôi đã thấy một số gợi ý rằng gpgvlệnh sẽ trả về mã thoát thích hợp, nhưng không may là gpgvkhông biết cách tìm nạp khóa từ trình khóa. Tôi đoán chúng ta có thể phân tích cú pháp đầu ra trạng thái (sử dụng --status-fd) từ đó gpg, nhưng có cách nào tốt hơn không?

Câu trả lời:


6

Đây là những gì đã kết thúc với:

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

Điều này tìm kiếm thông tin tin cậy mà gpgđầu ra trên --status-fd. Tập lệnh thoát với lỗi khi có chữ ký không tin cậy (hoặc không hợp lệ / không có chữ ký):

$ 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

Tập lệnh thoát không có lỗi khi có chữ ký hợp lệ, đáng tin cậy:

$ 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

Vì vậy, hãy để tôi cố gắng phân chia vấn đề:

Vấn đề đầu tiên dường như là chìa khóa mà bạn đang thử nghiệm không đáng tin cậy.

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

Tôi cho rằng đây là cố ý ... nhưng trước khi chúng tôi tìm cách khắc phục, hãy để tôi đề nghị bạn sử dụng gpgv thay vì gpg -v ? Bạn sẽ thấy tại sao trong một phút:

$ 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

Không có khóa, không có niềm tin ... Không có chúng tôi nhập khóa vào 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

Hy vọng nó giúp


Tôi đã nhận xét về gpgv trong câu hỏi của tôi - vấn đề với gpgv là trong khi nó trả về mã lỗi hữu ích hơn, nó không biết cách lấy khóa từ máy chủ khóa.
larsks

1

Hai tùy chọn xuất hiện (ngoài phân tích cú pháp đầu ra).

Một cách nhanh chóng và bẩn thỉu sẽ là chạy cả gpggpgv. Lần chạy đầu tiên gpgsẽ đảm bảo khóa được lấy từ máy chủ khóa và sau đó gpgvsẽ cung cấp cho bạn mã trả về mà bạn muốn.

Một cách kiểm soát, thanh lịch hơn (mặc dù nó sẽ liên quan đến nhiều công việc hơn) sẽ là sử dụng thư viện gpgme để xác minh chữ ký. Nó là một thư viện C, mặc dù có các hàm bao cho Perl , PHP , PythonRuby . (Python one ở mức khá thấp, trong khi Ruby one có một số trừu tượng cấp cao hơn, không chắc chắn về Perl hoặc PHP).

Thư viện GPGME dường như nói chuyện với các trình điều khiển khóa khi tôi đã sử dụng nó, mặc dù bạn muốn xác nhận điều đó. Tôi đã viết một chút mã sử dụng thư viện ruby ​​gpgme (tìm kiếm verifyverified_ok?tìm mã xác minh chữ ký và đối sig_output_linesvới một số mã tìm hiểu xem chữ ký có đáng tin hay không).


-1

Còn việc di chuyển cấu hình hệ thống của bạn sang một công cụ như Puppet hay Chef thì sao?

Mặc dù khối lượng công việc không hề nhỏ, Chef (Tôi chưa sử dụng Puppet), bạn phải tạo tài khoản người dùng (và khóa pub / private được tạo). Mặc dù điều này không ngăn mọi người sửa đổi các tệp cục bộ trên máy chủ, nhưng đầu bếp-khách hàng chạy định kỳ và sẽ ghi đè lên các thay đổi của họ trong lần chạy tiếp theo. (Các lần chạy định kỳ xảy ra theo mặc định.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.