Мы хотели бы использовать подписи gpg для проверки некоторых аспектов наших инструментов управления конфигурацией системы. Кроме того, мы хотели бы использовать модель «доверия», в которой отдельные ключи системного администратора подписываются главным ключом подписи, а затем наши системы доверяют этому главному ключу (и используют «сеть доверия» для проверки подписей нашими системными администраторами).
Это дает нам большую гибкость, например, возможность легко отозвать доверие к ключу, когда кто-то уходит, но мы столкнулись с проблемой. Хотя 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
, но есть ли лучший способ?
источник
На ум приходят два варианта (кроме анализа выходных данных).
Быстрый и грязный способ - запустить и то
gpg
и другоеgpgv
. Первый запускgpg
гарантирует, что ключ был получен с сервера ключей, а затемgpgv
даст вам код возврата, который вы хотите.Более элегантный, контролируемый способ (хотя это потребует дополнительных усилий ) - использовать библиотеку gpgme для проверки подписи. Это библиотека C, хотя есть обертки для Perl , PHP , Python и Ruby . (У Python достаточно низкий уровень, в то время как у Ruby есть несколько абстракций более высокого уровня, не уверен насчет Perl или PHP).
Библиотека GPGME, кажется, общается с серверами ключей, когда я ее использую, хотя вы захотите это подтвердить. Я написал немного кода, который использует библиотеку ruby gpgme (для поиска
verify
иverified_ok?
для кода, который проверяет подпись, иsig_output_lines
для некоторого кода, который выясняет, доверяют ли подписи).источник
А как насчет миграции конфигурации вашей системы на такой инструмент, как Puppet или Chef ?
В то время как нетривиальный объем работы, Chef (я не использовал Puppet), вы должны создавать учетные записи пользователей (и генерируются публичные / закрытые ключи). Хотя это не мешает пользователям изменять локальные файлы на сервере, chef-client периодически запускается и перезаписывает свои изменения при следующем запуске. (Периодические периодические запуски происходят по умолчанию.)
источник