Перевірка довіри підпису за допомогою gpg?


13

Ми хотіли б використовувати підписи gpg для перевірки деяких аспектів наших інструментів управління конфігурацією системи. Крім того, ми хотіли б використовувати модель "довіри", де окремі ключі sysadmin підписуються головним ключем підпису, а потім наші системи довіряють цьому майстер-ключу (і використовують "веб-довіру" для перевірки підписів наших системних адміністраторів).

Це дає нам велику гнучкість, наприклад, можливість легко відкликати довіру на ключ, коли хтось піде, але ми зіткнулися з проблемою. Незважаючи на те, що 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, не знає, як отримати ключі від серверів ключів. Я думаю, ми можемо проаналізувати вихідний статус (використовуючи --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 полягає в тому, що, хоча він повертає корисніший код помилки, він не знає, як отримати ключі з сервера ключів.
larsks

1

Приходять в голову два варіанти (крім розбору результатів).

Швидкий і брудний спосіб буде запускати і те, gpg і gpgv. Перший запуск gpgзабезпечить отримання ключа з сервера ключів, а потім gpgvдасть вам потрібний код повернення.

Більш елегантним, контрольованим способом (хоча це залучатиме більше роботи) буде використання бібліотеки gpgme для перевірки підпису. Це бібліотека С, хоча є обгортки для Perl , PHP , Python та Ruby . (У Python один досить низький рівень, у той час як у Ruby є абстракції вищого рівня, не впевнені в Perl або PHP).

Здається, бібліотека GPGME розмовляє із серверами клавіш, коли я ним користуюся, хоча ви хочете це підтвердити Я написав трохи коду, який використовує бібліотеку rupg gpgme (пошук verifyі verified_ok?код, який підтверджує підпис, і sig_output_linesякийсь код, який працює, чи довіряти підпису).


-1

Що з міграцією конфігурації системи на такий інструмент, як Ляльковий або шеф-кухар ?

Під час роботи нетривіальної роботи, шеф-кухареві (я ще не використовував Лялечку), ви повинні створити облікові записи користувачів (і паби / приватні ключі створюються). Хоча це не заважає людям змінювати локальні файли на сервері, клієнт-шеф-кухар періодично запускається та замінить їх зміни під час наступного запуску. (Періодичні повторювані запуски відбуваються за замовчуванням.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.