CloudFront 연결 함수 연결 - Amazon CloudFront

CloudFront 연결 함수 연결

CloudFront 연결 함수를 사용하면 TLS 핸드셰이크 중에 사용자 지정 인증서 검증 로직을 구현하여 내장 mTLS 인증 기능을 확장할 수 있습니다.

연결 함수란 무엇입니까?

연결 함수는 클라이언트 인증서가 검증된 후 TLS 핸드셰이크 중에 실행되는 JavaScript 함수입니다. 검증된 클라이언트 인증서는 연결 함수로 전달되며, 이 시점에서 연결 함수는 액세스 권한 부여 여부를 추가로 결정할 수 있습니다. 연결 함수에 대한 자세한 내용은 CloudFront Functions를 사용하여 엣지에서 사용자 지정 섹션을 참조하세요.

연결 함수가 mTLS에서 작동하는 방식

클라이언트가 CloudFront 배포에 대한 mTLS 연결을 설정하려고 하면 다음 시퀀스가 발생합니다.

  1. 클라이언트가 CloudFront 엣지 로케이션으로 TLS 핸드셰이크를 시작합니다.

  2. CloudFront가 클라이언트 인증서를 요청하고 수신합니다.

  3. CloudFront가 트러스트 스토어에 대해 표준 인증서 검증을 수행합니다.

  4. 인증서가 표준 검증을 통과하면 CloudFront는 연결 함수를 간접적으로 호출합니다. ViewerMtlsConfig 내에서 IgnoreCertificateExpiry가 활성화된 경우 만료되었지만 유효한 인증서도 연결 함수로 전달됩니다. 클라이언트 인증서가 유효하지 않으면 연결 함수가 간접 호출되지 않습니다.

  5. 연결 함수는 구문 분석된 인증서 정보와 연결 세부 정보를 수신합니다.

  6. 함수는 사용자 지정 로직을 기반으로 허용/거부 결정을 내립니다.

  7. CloudFront는 사용자의 결정에 따라 TLS 연결을 완료하거나 종료합니다.

연결 함수는 확인 모드와 선택적 모드(클라이언트가 인증서를 제공하는 경우) 모두에 대해 간접적으로 호출됩니다.

연결 함수 할당량 증가 요청

AWS 계정에 대한 연결 함수 할당량 증가를 요청합니다.

연결 함수 할당량 증가를 요청하려면
  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/cloudfront/v4/home에서 CloudFront 콘솔을 엽니다.

  2. 탐색 창에서 함수를 선택합니다.

  3. 연결 함수 탭을 선택합니다.

  4. 요청에서 CloudFront 지원 엔지니어링 팀에 문의할 수 있는 링크를 선택합니다.

  5. CloudFront 지원 엔지니어링 팀에서는 요청을 검토합니다. 검토 프로세스는 최대 2일이 걸릴 수 있습니다.

요청이 승인되면 상호 TLS를 사용하는 동안 계정에서 연결 함수를 생성하고 이를 하나 이상의 배포와 연결할 수 있습니다.

연결 함수 생성

CloudFront 콘솔 또는 AWS CLI를 사용하여 연결 함수를 생성할 수 있습니다.

연결 함수를 생성하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/cloudfront/v4/home에서 CloudFront 콘솔을 엽니다.

  2. 탐색 창에서 함수를 선택합니다.

  3. 연결 함수 탭을 선택한 다음 연결 함수 생성을 선택합니다.

  4. AWS 계정 내에서 고유한 함수 이름을 입력합니다.

  5. 계속을 선택합니다.

  6. 함수 편집기에서 인증서 검증을 위한 JavaScript 코드를 작성합니다. 함수 핸들러는 허용 또는 거부를 직접 호출해야 합니다.

  7. 선택 사항: KeyValue 스토어를 연결 함수에 연결하여 해지 제어를 구현할 수 있습니다.

  8. 변경 사항 저장을 선택합니다.

연결 함수를 생성하려면(AWS CLI)

다음 예제에서는 연결 함수를 생성하는 방법을 보여줍니다.

code.js와 같은 별도의 파일에 함수 코드를 작성합니다.

function connectionHandler(connection) { connection.allow(); }
aws cloudfront create-connection-function \ --name "certificate-validator" \ --connection-function-config '{ "Comment": "Client certificate validation function", "Runtime": "cloudfront-js-2.0" }' \ --connection-function-code fileb://code.js

연결 함수 코드 구조

연결 함수는 인증서 및 연결 정보가 포함된 연결 객체를 수신하는 connectionHandler 함수를 구현합니다. 함수는 connection.allow() 또는 connection.deny()를 사용하여 연결에 대한 결정을 내려야 합니다.

기본 연결 함수 예제

다음 예제는 클라이언트 인증서의 제목 필드를 확인하는 간단한 연결 함수를 보여줍니다.

function connectionHandler(connection) { // Only process if a certificate was presented if (!connection.clientCertificate) { console.log("No certificate presented"); connection.deny(); } // Check the subject field for specific organization const subject = connection.clientCertificate.certificates.leaf.subject; if (!subject.includes("O=ExampleCorp")) { console.log("Certificate not from authorized organization"); connection.deny(); } else { // All checks passed console.log("Certificate validation passed"); connection.allow(); } }

연결 객체에서 사용할 수 있는 클라이언트 인증서 속성의 전체 사양은 여기에서 확인할 수 있습니다.

{ "connectionId": "Fdb-Eb7L9gVn2cFakz7wWyBJIDAD4-oNO6g8r3vXDV132BtnIVtqDA==", // Unique identifier for this TLS connection "clientIp": "203.0.113.42", // IP address of the connecting client (IPv4 or IPv6) "clientCertificate": { "certificates": { "leaf": { "subject": "CN=client.example.com,O=Example Corp,C=US", // Distinguished Name (DN) of the certificate holder "issuer": "CN=Example Corp Intermediate CA,O=Example Corp,C=US", // Distinguished Name (DN) of the certificate authority that issued this certificate "serialNumber": "4a:3f:5c:92:d1:e8:7b:6c", // Unique serial number assigned by the issuing CA (hexadecimal) "validity": { "notBefore": "2024-01-15T00:00:00Z", // Certificate validity start date (ISO 8601 format) "notAfter": "2025-01-14T23:59:59Z" // Certificate expiration date (ISO 8601 format) }, "sha256Fingerprint": "a1b2c3d4e5f6...abc123def456", // SHA-256 hash of the certificate (64 hex characters) }, }, }, }

연결 함수 연결

연결 함수를 생성한 후에는 이를 라이브 단계에 게시하고 배포와 연결해야 합니다.

연결 함수를 게시하고 연결하려면(콘솔)

  1. AWS Management 콘솔에 로그인한 다음 https://console.aws.amazon.com/cloudfront/v4/home에서 CloudFront 콘솔을 엽니다.

  2. 탐색 창에서 함수를 선택합니다.

  3. 연결 함수 탭을 선택하고 연결 함수를 선택합니다.

  4. 게시를 선택하여 라이브 단계로 이동합니다.

  5. 게시 섹션 아래의 연결된 배포 테이블에서 연결 추가를 선택합니다.

  6. 연결하려는 뷰어 mTLS가 활성화된 배포를 선택합니다.

또는 배포 세부 정보 페이지에서 게시된 연결 함수를 연결할 수도 있습니다.

  1. 모든 배포가 나열된 콘솔 홈 페이지로 이동합니다.

  2. 연결하려는 배포를 선택합니다.

  3. 일반 탭을 선택합니다.

  4. 설정 섹션에서 편집을 선택합니다.

  5. 연결성 섹션에서 뷰어 상호 인증(mTLS)을 찾습니다.

  6. 연결 함수에서 함수를 선택합니다.

  7. 변경 사항 저장을 선택합니다.

연결 함수를 연결하려면(AWS CLI)

다음 예제에서는 연결 함수를 배포와 연결하는 방법을 보여줍니다.

// DistributionConfig: { ...other settings, "ConnectionFunctionAssociation": { "Id": "cf_30c2CV2elHwCoInb3LtcaUJkZeD" } }

연결 함수 사용 사례

연결 함수를 사용하면 다음과 같은 여러 고급 mTLS 사용 사례를 사용할 수 있습니다.

  • 인증서 속성 검증 - 조직 단위 요구 사항 또는 주체 대체 이름 패턴과 같은 클라이언트 인증서의 특정 필드를 확인합니다.

  • 인증서 해지 확인 - KeyValueStore를 사용하여 해지된 인증서 일련 번호를 저장하는 사용자 지정 인증서 해지 확인을 구현합니다.

  • IP 기반 인증서 정책 - 클라이언트 IP 주소 또는 지리적 제한에 따라 다른 인증서 정책을 적용합니다.

  • 다중 테넌트 검증 - 호스트 이름 또는 인증서 속성에 따라 다양한 인증서 요구 사항이 적용되는 테넌트별 검증 규칙을 구현합니다.

참고

연결 함수는 TLS 핸드셰이크 중에 클라이언트 연결당 한 번 실행됩니다.

연결 함수는 HTTP 요청/응답을 수정하지 않고 연결만 허용하거나 거부할 수 있습니다.

라이브 단계 함수(게시됨)만 배포와 연결할 수 있습니다.

각 배포에는 최대 하나의 연결 함수가 있을 수 있습니다.

다음 단계

연결 함수를 CloudFront 배포와 연결한 후 선택적 설정을 구성하여 mTLS 구현의 동작을 사용자 지정할 수 있습니다. 선택적 클라이언트 인증서 검증 모드와 같은 추가 설정을 구성하는 방법에 대한 자세한 지침은 추가 설정 구성 섹션을 참조하세요.