NitroTPM 증명 문서 검증 - Amazon Elastic Compute Cloud

NitroTPM 증명 문서 검증

참고

이 주제는 서드 파티 키 관리 서비스를 사용하고 자체 증명 문서 검증 메커니즘을 빌드해야 하는 사용자를 대상으로 합니다.

이 주제에서는 전체 NitroTPM 증명 흐름에 대한 상세 개요를 제공합니다. 또한 증명 문서가 요청될 때 AWS Nitro 시스템에서 생성되는 내용을 설명하고 키 관리 서비스가 증명 문서를 처리하는 방법을 설명합니다.

증명의 목적은 인스턴스가 실행 중인 코드와 구성을 기반으로 신뢰할 수 있는 엔터티임을 증명하는 것입니다. 인스턴스에 대한 신뢰의 근간에는 증명 문서를 제공하는 AWS Nitro 시스템이 있습니다.

증명 문서는 모든 서비스에 통합할 수 있는 게시된 인증 기관을 포함하는 AWS Nitro 증명 퍼블릭 키 인프라(PKI)에 의해 서명됩니다.

증명 문서

증명 문서는 Concise Binary Object Representation(CBOR)으로 인코딩되고 CBOR 객체 서명 및 암호화(COSE)를 사용하여 서명됩니다.

CBOR에 대한 자세한 내용은 RFC 8949: Concise Binary Object Representation (CBOR)을 참조하세요.

증명 문서 사양

다음은 증명 문서의 구조를 보여줍니다.

AttestationDocument = { module_id: text, ; issuing Nitro hypervisor module ID timestamp: uint .size 8, ; UTC time when document was created, in ; milliseconds since UNIX epoch digest: digest, ; the digest function used for calculating the ; register values nitrotpm_pcrs: { + index => pcr }, ; map of PCRs at the moment the Attestation Document was generated certificate: cert, ; the public key certificate for the public key ; that was used to sign the Attestation Document cabundle: [* cert], ; issuing CA bundle for infrastructure certificate ? public_key: user_data, ; an optional DER-encoded key the attestation ; consumer can use to encrypt data with ? user_data: user_data, ; additional signed user data, defined by protocol ? nonce: user_data, ; an optional cryptographic nonce provided by the ; attestation consumer as a proof of authenticity } cert = bytes .size (1..1024) ; DER encoded certificate user_data = bytes .size (0..1024) pcr = bytes .size (32/48/64) ; PCR content index = 0..31 digest = "SHA384"

증명 문서의 선택적 파라미터(public_key, user_data, nonce)를 사용하여 증명 인스턴스와 외부 서비스 간에 사용자 지정 검증 프로토콜을 설정할 수 있습니다.

증명 문서 검증

Nitro 하이퍼바이저에서 증명 문서를 요청하는 경우 서명된 증명 문서가 포함된 바이너리 BLOB이 수신됩니다. 서명된 증명 문서는 CBOR로 인코딩되고 COSE로 서명된 객체(COSE_Sign1 서명 구조 사용)입니다. 전체 검증 프로세스에는 다음 단계가 포함됩니다.

  1. CBOR 객체를 디코딩하고 COSE_Sign1 구조에 매핑하세요.

  2. COSE_Sign1 구조에서 증명 문서를 추출하세요.

  3. 인증서의 체인을 확인하세요.

  4. 증명 문서에 올바르게 서명되었는지 확인하세요.

증명 문서는 상용 AWS 파티션에 대한 루트 인증서를 포함하는 AWS Nitro 증명 PKI에 의해 서명됩니다. 루트 인증서는 https://aws-nitro-enclaves.amazonaws.com/AWS_NitroEnclaves_Root-G1.zip에서 다운로드할 수 있으며 다음 지문을 사용하여 확인할 수 있습니다.

64:1A:03:21:A3:E2:44:EF:E4:56:46:31:95:D6:06:31:7E:D7:CD:CC:3C:17:56:E0:98:93:F3:C6:8F:79:BB:5B

루트 인증서는 AWS Certificate Manager 프라이빗 인증 기관(AWS Private CA)의 프라이빗 키에 기반하며 수명은 30년입니다. PCA의 제목 형식은 다음과 같습니다.

CN=aws.nitro-enclaves, C=US, O=Amazon, OU=AWS

COSE 및 CBOR

일반적으로 COSE_Sign1 서명 구조는 메시지에 하나의 서명만 배치되는 경우에 사용됩니다. 콘텐츠와 서명을 처리하는 파라미터는 COSE_Sign을 분리하는 대신 보호된 헤더에 배치됩니다. 구조는 사용할 컨텍스트에 따라 태그가 지정되거나 지정되지 않은 상태로 인코딩할 수 있습니다. 태그가 지정된 COSE_Sign1 구조는 CBOR 태그 18로 식별됩니다.

본문, 서명 그리고 본문 및 서명에 대한 정보를 전달하는 CBOR 객체를 COSE_Sign1 구조라고 합니다. COSE_Sign1 구조는 CBOR 배열입니다. 배열에는 다음 필드가 포함됩니다.

[ protected: Header, unprotected: Header, payload: This field contains the serialized content to be signed, signature: This field contains the computed signature value. ]

증명 문서의 컨텍스트에서 배열에는 다음이 포함됩니다.

18(/* COSE_Sign1 CBOR tag is 18 */ {1: -35}, /* This is equivalent with {algorithm: ECDS 384} */ {}, /* We have nothing in unprotected */ $ATTESTATION_DOCUMENT_CONTENT /* Attestation Document */, signature /* This is the signature */ )

CBOR에 대한 자세한 내용은 RFC 8949: Concise Binary Object Representation (CBOR)을 참조하세요.

의미 체계 유효성

증명 문서에는 항상 다음 순서로 CA 번들이 포함됩니다.

[ ROOT_CERT - INTERM_1 - INTERM_2 .... - INTERM_N] 0 1 2 N - 1

Java PKI API Programmer’s Guide의 Java CertPath와 같은 일부 기존 도구는 다른 순서로 정렬되어야 할 수 있으므로 이 순서를 염주에 두어야 합니다.

인증서를 검증하려면 증명 문서 CA 번들에서 시작하여 필요한 체인을 생성합니다. 여기서 TARGET_CERT는 증명 문서의 인증서입니다.

[TARGET_CERT, INTERM_N, ..... , INTERM_2, INTERM_1, ROOT_CERT]

인증서 유효성

체인의 모든 인증서에서 현재 날짜가 인증서에 지정된 유효 기간에 포함되는지 확인해야 합니다.

인증서 체인 유효성

일반적으로 한 CA가 서명한 퍼블릭 키 소유자의 인증서와 다른 CA가 서명한 0개 이상의 추가 CA 인증서로 구성된 여러 인증서 체인이 필요할 수 있습니다. 퍼블릭 키 사용자는 제한된 수의 보장된 CA 퍼블릭 키로만 초기화되므로 인증 경로라고 하는 이러한 체인이 필요합니다. 인터넷 PKI에 대한 인증 경로 검증 절차는 X.509에 제공된 알고리즘에 기반합니다. 인증 경로 처리 시 주체 고유 이름 및/또는 주체 대체 이름과 주체 퍼블릭 키 간의 바인딩을 확인합니다. 바인딩은 신뢰 당사자가 지정한 경로 및 입력을 구성하는 인증서에 지정된 제약 조건에 의해 제한됩니다. 기본 제약 조건 및 정책 제약 조건 확장을 통해 인증 경로 처리 로직이 의사 결정 프로세스를 자동화할 수 있습니다.

참고

검증을 수행할 때 CRL을 비활성화해야 합니다.

Java를 사용하면 루트 경로 및 생성된 인증서 체인부터 시작하여 다음과 같이 체인 검증이 수행됩니다.

validateCertsPath(certChain, rootCertficate) { /* The trust anchor is the root CA to trust */ trustAnchors.add(rootCertificate); /* We need PKIX parameters to specify the trust anchors * and disable the CRL validation */ validationParameters = new PKIXParameters(trustAnchors); certPathValidator = CertPathValidator.getInstance(PKIX); validationParameters.setRevocationEnabled(false); /* We are ensuring that certificates are chained correctly */ certPathValidator.validate(certPath, validationParameters); }