[server] gpg로 서명 신뢰를 확인 하시겠습니까?

시스템 구성 관리 도구의 일부 측면을 확인하기 위해 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있지만 더 좋은 방법이 있습니까?



답변

이것은 결국 :

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


답변

그래서 문제를 나누려고합니다.

첫 번째 문제는 테스트하는 키가 신뢰할 수없는 것 같습니다.

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

나는 이것이 의도적이라고 가정했지만 … 우리가 고치는 방법에 도달하기 전에 gpg -v 대신 gpgv 를 사용하도록 제안하자 . 몇 분 안에 이유를 알 수 있습니다.

$ 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

그것이 도움이되기를 바랍니다.


답변

출력을 파싱하는 것 외에 두 가지 옵션이 떠 오릅니다.

빠르고 더러운 방법은 과를 모두 실행하는 것 입니다. 첫 번째 실행은 키 서버에서 키를 가져 왔는지 확인한 다음 원하는 리턴 코드를 제공합니다.gpggpgvgpggpgv

보다 우아하고 통제 된 방법 (더 많은 작업이 필요하지만)은 gpgme 라이브러리를 사용하여 서명을 확인하는 것입니다. Perl , PHP , PythonRuby 용 래퍼가 있지만 C 라이브러리 입니다. (파이썬은 상당히 낮은 레벨이고, 루비는 펄이나 PHP에 대해 확실하지 않은 더 높은 수준의 추상화를 가지고 있습니다).

GPGME 라이브러리는 키 서버를 사용했을 때 키 서버와 대화하는 것처럼 보이지만 확인하고 싶습니다. 루비 gpgme 라이브러리를 사용 하는 약간의 코드를 작성했습니다 ( 서명을 확인하는 코드 검색 verifyverified_ok?서명, sig_output_lines서명의 신뢰성 여부를 결정하는 일부 코드).


답변

Puppet 또는 Chef 와 같은 도구로 시스템 구성을 마이그레이션하는 것은 어떻습니까?

사소한 양의 작업은 아니지만 Chef (Puppet을 사용하지 않았습니다) 사용자 계정을 만들어야합니다 (그리고 펍 / 개인 키가 생성됨). 이렇게해도 사람들이 서버에서 로컬로 파일을 수정하는 것을 막을 수는 없지만 chef-client는 주기적으로 실행되며 다음 실행시 변경 사항을 덮어 씁니다. (정기 반복 실행은 기본적으로 발생합니다.)


답변