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

나는 이것이 의도적이라고 가정했지만 ... 우리가 고치는 방법에 도달하기 전에 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

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


내 질문에 gpgv에 대해 언급했습니다 .gpgv의 문제점은 더 유용한 오류 코드를 반환하지만 키 서버에서 키를 가져 오는 방법을 모른다는 것입니다.
Larsks

1

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

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

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

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


-1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.