상호 TLS 인증

일반적으로 HTTPS 커뮤니케이션에서 인증은 클라이언트가 서버의 ID를 확인하는 방식의 단방향으로만 작동합니다.

부하 분산기가 연결하는 클라이언트의 ID를 인증해야 하는 애플리케이션의 경우 상호 TLS(mTLS)를 사용합니다.

mTLS에서 부하 분산기는 부하 분산기와의 TLS 핸드셰이크 중 클라이언트가 자체 인증을 위해 인증서를 전송하도록 요청합니다. 부하 분산기가 클라이언트 인증서의 신뢰 체인을 검증하는 데 사용하는 트러스트 저장소를 구성할 수 있습니다.

다음 애플리케이션 부하 분산기는 mTLS를 지원합니다.

  • 전역 외부 애플리케이션 부하 분산기
  • 기본 애플리케이션 부하 분산기
  • 리전 외부 애플리케이션 부하 분산기
  • 리전 내부 애플리케이션 부하 분산기
  • 리전 간 내부 애플리케이션 부하 분산기

아키텍처

부하 분산기가 mTLS 인증 배포를 지원하려면 다음 리소스가 필요합니다.

  • 클라이언트 인증(ServerTLSPolicy라고도 함) 리소스. 클라이언트 인증서를 검증할 때 사용할 서버 측 TLS 모드와 TrustConfig 리소스를 지정할 수 있습니다. 서버 TLS 정책에서 모든 mTLS 인증 관련 매개변수를 지정할 수 있습니다. 서버 TLS 정책은 대상 HTTPS 프록시 리소스에 연결될 수 있습니다.

  • TrustConfig 리소스. 인증서 관리자 리소스. TrustConfig에는 클라이언트 인증서를 검증하는 데 사용되는 단일 트러스트 저장소 리소스가 포함됩니다. 자세한 내용은 트러스트 구성 관리를 참조하세요.

    TrustConfig에 대한 허용 목록에 추가된 인증서를 업데이트할 수 있습니다. 허용 목록에 추가된 인증서는 인증서가 파싱 가능하고 비공개 키 소유 증명이 설정되었으며 인증서의 SAN 필드에 대한 제약조건이 충족되는 한 항상 유효하다고 간주됩니다. 만료된 인증서가 허용 목록에 있으면 유효하다고 간주됩니다.

  • 트러스트 저장소. 클라이언트 인증서 체인을 검증하는 데 사용되는 신뢰 앵커와 중간 인증 기관(CA) 인증서를 포함합니다. CA는 클라이언트에 대해 신뢰할 수 있는 인증서를 발급하는 데 사용됩니다. CA는 부하 분산기의 신뢰 앵커 루트 인증서 또는 중간 CA 인증서로 식별됩니다.

    다음 유형의 클라이언트 인증서를 트러스트 저장소에 업로드할 수 있습니다.

다음 이미지는 mTLS 구성요소를 보여줍니다.

전역

다음 다이어그램은 외부 애플리케이션 부하 분산기 배포의 구성요소를 보여줍니다. 이 아키텍처는 전역 구성요소를 사용하는 내부 애플리케이션 부하 분산기인 리전 간 내부 애플리케이션 부하 분산기에도 적용됩니다.

전역 외부 애플리케이션 부하 분산기 구성요소를 사용하는 상호 TLS
그림 1. 전역 외부 애플리케이션 부하 분산기 구성요소를 사용하는 상호 TLS(확대하려면 클릭)

리전

다음 다이어그램은 리전별 내부 애플리케이션 부하 분산기 배포의 구성요소를 보여줍니다. 이 아키텍처는 리전 구성요소를 사용하는 외부 애플리케이션 부하 분산기인 리전 외부 애플리케이션 부하 분산기에도 적용됩니다.

리전 내부 애플리케이션 부하 분산기 구성요소를 사용하는 상호 TLS
그림 1. 리전 내부 애플리케이션 부하 분산기 구성요소를 사용하는 상호 TLS (확대하려면 클릭)

애플리케이션 부하 분산기 배포의 구성요소에 대한 자세한 내용은 다음 섹션을 참조하세요.

기능

부하 분산기용 mTLS에서 지원하는 기능을 통해 다음을 수행할 수 있습니다.

  • 클라이언트가 제공하는 인증서의 비공개 키에 대한 소유 증명을 확인합니다.

  • 다음 두 가지 모드 중 하나로 클라이언트 인증서를 검증합니다.

    • 트러스트 저장소에 대한 클라이언트 인증서 체인을 검증할 수 없으면 요청을 거부합니다.
    • 클라이언트 인증서를 제공하지 않는 경우에도 모든 요청을 백엔드에 전달합니다.
  • 업로드된 PKI 앵커에 대해 클라이언트 인증서 검증을 수행합니다. 이전 PKI에서 새 PKI로 다운타임 없이 마이그레이션할 수 있도록 여러 PKI 앵커를 뵬도로 추가할 수 있도록 지원합니다.

  • 지정된 PKI 앵커에 대한 검증 경로 빌드에 사용할 추가 중간 인증서를 제공합니다. 중간 인증서를 사용하면 전체 인증서 체인을 전달하지 않는 클라이언트에서 mTLS를 사용할 수 있습니다.

  • 인증서의 지문을 생성하여 커스텀 요청 헤더로 백엔드에 전달합니다.

  • 커스텀 요청 헤더를 사용하여 인증서에서 추출된 선택한 필드를 백엔드로 전달합니다.

  • 커스텀 요청 헤더를 사용하여 검증 결과와 검증 오류를 백엔드에 전달합니다.

검증 프로세스에 대한 자세한 내용은 이 페이지 뒷부분의 클라이언트 인증서 검증 단계 섹션을 참조하세요.

MTLS 클라이언트 검증 모드

클라이언트가 부하 분산기에 잘못된 인증서를 제공하거나 인증서를 제공하지 않으면 clientValidationMode는 클라이언트 연결이 처리되는 방법을 지정합니다.

clientValidationMode 값은 다음과 같습니다.

  • ALLOW_INVALID_OR_MISSING_CLIENT_CERT는 클라이언트 인증서의 인증서 체인 검증이 실패했거나 클라이언트 인증서가 제공되지 않은 경우에도 클라이언트의 연결을 허용합니다. 클라이언트 인증서 제공 시 비공개 키의 소유 증명은 항상 점검됩니다.

    이 모드에서 커스텀 헤더 변수를 사용하여 클라이언트가 인증서를 제공했는지, 인증서 검증이 성공했는지 여부 및 인증서에서 추출된 기타 정보를 백엔드에 나타낼 수 있습니다.

  • 클라이언트가 인증서를 제공하지 않거나 인증서 검증에 실패하면 REJECT_INVALID는 연결을 거부합니다.

백엔드 서비스에 로깅이 사용 설정되면 mTLS 클라이언트 인증서 검증에 대한 로그를 확인할 수 있습니다.

백엔드에 전달된 커스텀 헤더 값

다음 표는 항상 백엔드로 전달되는 모든 상호 TLS 커스텀 헤더 변수 값을 보여줍니다(요청 유형 '백엔드로 요청 전달'). clientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERT로 설정되거나 클라이언트 인증서가 인증서 검증을 통과하면 커스텀 헤더가 백엔드로 전달됩니다.

클라이언트 인증서 상태 clientValidationMode 맞춤 헤더

클라이언트 인증서 체인이 너무 깁니다(클라이언트 인증서에 포함된 중간 인증서 10개 초과).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_exceeded_limit

client_cert_sha256_fingerprint: <cert hash>

클라이언트 또는 중간 인증서에 잘못된 RSA 키 크기가 있습니다.

유효성 검사가 수행되지 않습니다.

RSA 키는 2,048~4,096비트일 수 있습니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_invalid_rsa_key_size

client_cert_sha256_fingerprint: <cert hash>

클라이언트 또는 중간 인증서는 지원되지 않는 타원 곡선을 사용하고 있습니다.

유효성 검사가 수행되지 않습니다.

유효한 타원 곡선은 P-256과 P-384입니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_elliptic_curve_key

client_cert_sha256_fingerprint: <cert hash>

클라이언트 또는 중간 인증서가 RSA가 아니거나 ECDSA가 아닌 알고리즘을 사용합니다.

유효성 검사가 수행되지 않습니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_unsupported_key_algorithm

client_cert_sha256_fingerprint: <cert hash>

검증에 사용되는 PKI에는 동일한 제목 및 제목 공개 키 정보를 공유하는 중간 인증서가 10개 이상 있습니다.

유효성 검사가 수행되지 않습니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_pki_too_large

client_cert_sha256_fingerprint: <cert hash>

검증을 위해 제공된 중간 인증서에 이름 제약조건이 10개를 초과합니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_max_name_constraints_exceeded

client_cert_sha256_fingerprint: <cert hash>

클라이언트 인증서에 clientAuth를 포함하는 Extended Key Usage (EKU)가 없습니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_chain_invalid_eku

client_cert_sha256_fingerprint: <cert hash>

인증서 체인을 검증하는 동안 시간이 초과되었습니다. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_timed_out

client_cert_sha256_fingerprint: <cert hash>

인증서 체인을 검증하는 동안 깊이 또는 반복 한도에 도달합니다.

루트 및 클라이언트 인증서를 포함하여 인증서 체인의 최대 깊이는 10입니다. 최대 반복 횟수는 100입니다(클라이언트 인증서 체인 검증을 위해 확인된 인증서).

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_search_limit_exceeded

client_cert_sha256_fingerprint: <cert hash>

TrustConfig 리소스를 설정하지 않고 mTLS를 구성했습니다.

검증을 수행할 수 없지만 인증서 해시가 백엔드로 전달됩니다.

ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_not_performed

client_cert_sha256_fingerprint: <cert hash>

클라이언트 인증서가 없습니다. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: false

client_cert_chain_verified: false

client_cert_error: client_cert_not_provided

client_cert_sha256_fingerprint: <empty>

클라이언트 인증서가 TrustConfig 리소스에 대한 검증에 실패합니다. ALLOW_INVALID_OR_MISSING_CLIENT_CERT

client_cert_present: true

client_cert_chain_verified: false

client_cert_error: client_cert_validation_failed

client_cert_sha256_fingerprint: <cert hash>

클라이언트 인증서는 인증서 확인자 검증을 통과합니다. 해당 없음

client_cert_present: true

client_cert_chain_verified: true

client_cert_error: <empty>

client_cert_sha256_fingerprint: <cert hash>

client_cert_serial_number: <serial_number>

client_cert_valid_not_before: <date>

client_cert_valid_not_after: <date>

client_cert_uri_sans: <list>

client_cert_dnsname_sans: <list>

client_cert_issuer_dn: <issuer>

client_cert_subject_dn: <subject>

client_cert_leaf: <certificate>

client_cert_chain: <list>

종료된 연결에서 로깅된 오류

clientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERT 또는 REJECT_INVALID로 설정되면 다음 오류로 인해 클라이언트 연결이 닫힙니다. 자세한 내용은 리전 외부 애플리케이션 부하 분산기 로깅 및 모니터링내부 애플리케이션 부하 분산기 로깅 및 모니터링을 참조하세요. 이러한 오류는 Cloud Logging에 로깅되며 다음 표에 설명되어 있습니다.

클라이언트 인증서 상태 요청 로깅된 오류
클라이언트 인증서가 핸드셰이크 중에 서명 일치에 실패합니다. SSL 핸드셰이크 종료 없음
서비스가 인증서 체인 검증을 수행할 수 없습니다. 연결 종료 client_cert_validation_unavailable
인증서 체인을 검증하는 중에 내부 오류가 발생했습니다. 연결 종료 client_cert_validation_internal_error
일치하는 TrustConfig를 찾을 수 없습니다. 연결 종료 client_cert_trust_config_not_found
클라이언트 인증서 페이로드(중간 인증서 포함)가 너무 큽니다(16KB 초과). 연결 종료 client_cert_exceeded_size_limit

REJECT_INVALID 검증으로 로깅된 오류

clientValidationModeREJECT_INVALID로 설정되면 다음 오류로 인해 연결이 종료됩니다(요청 유형 '연결 종료'). 자세한 내용은 리전 외부 애플리케이션 부하 분산기 로깅 및 모니터링내부 애플리케이션 부하 분산기 로깅 및 모니터링을 참조하세요. 이러한 오류는 Cloud Logging에 로깅되며 다음 표에 설명되어 있습니다.

클라이언트 인증서 상태 로깅된 오류
클라이언트 인증서 체인이 너무 깁니다(클라이언트 인증서에 포함된 중간 인증서 10개 초과). client_cert_chain_exceeded_limit

클라이언트 또는 중간 인증서에 잘못된 RSA 키 크기가 있습니다.

유효성 검사가 수행되지 않습니다.

RSA 키는 2,048~4,096비트일 수 있습니다.

client_cert_invalid_rsa_key_size

클라이언트 또는 중간 인증서는 지원되지 않는 타원 곡선을 사용하고 있습니다.

유효성 검사가 수행되지 않습니다.

유효한 곡선은 P-256과 P-384입니다.

client_cert_unsupported_elliptic_curve_key

클라이언트 또는 중간 인증서가 RSA가 아니거나 ECDSA가 아닌 알고리즘을 사용합니다.

유효성 검사가 수행되지 않습니다.

client_cert_unsupported_key_algorithm

검증에 사용되는 PKI에는 동일한 제목 및 제목 공개 키 정보를 공유하는 중간 인증서가 10개 이상 있습니다.

유효성 검사가 수행되지 않습니다.

client_cert_pki_too_large

검증을 위해 제공된 중간 인증서에 이름 제약조건이 10개를 초과합니다.

client_cert_chain_max_name_constraints_exceeded

클라이언트 인증서에 clientAuth를 포함하는 Extended Key Usage (EKU) 확장 프로그램이 없습니다.

client_cert_chain_invalid_eku

인증서 체인을 검증하는 동안 시간이 초과되었습니다. client_cert_validation_timed_out

인증서 체인을 검증하는 동안 깊이 또는 반복 한도에 도달합니다.

루트 및 클라이언트 인증서를 포함하여 인증서 체인의 최대 깊이는 10입니다. 최대 반복 횟수는 100입니다(클라이언트 인증서 체인 검증을 위해 확인된 인증서)

client_cert_validation_search_limit_exceeded
TrustConfig 리소스를 설정하지 않고 mTLS를 구성했습니다. client_cert_validation_not_performed
클라이언트가 핸드셰이크 중에 요청된 인증서를 제공하지 않았습니다. client_cert_not_provided
클라이언트 인증서가 TrustConfig 리소스를 사용한 검증에 실패합니다. client_cert_validation_failed

클라이언트 인증서 검증 단계

클라이언트 인증서를 검증할 때 부하 분산기는 다음 단계를 수행합니다.

  1. 부하 분산기는 클라이언트의 서명을 확인하여 클라이언트가 클라이언트 인증서의 비공개 키를 보유하고 있음을 증명합니다. 이 단계가 실패하면 구성에서 클라이언트 인증서가 잘못되었거나 누락되어 있고 전역 외부 애플리케이션 부하 분산기에 대한 정보가 로깅되지 않더라도 부하 분산기는 항상 TLS 핸드셰이크에 실패하며, 리전 외부 애플리케이션 부하 분산기 및 내부 애플리케이션 부하 분산기의 proxyStatus 필드에 TLS 오류가 로깅됩니다.
  2. 구성에 TrustAnchor가 포함된 경우 부하 분산기는 클라이언트 인증서와 구성된 TrustAnchor 간의 신뢰 체인을 확인합니다. 특히 부하 분산기는 다음을 확인합니다.
    • 클라이언트, 중간 인증서, 루트 인증서는 인증서 요구사항을 준수합니다.
    • 상위 인증서의 제목 필드는 하위 인증서의 문제 필드와 일치합니다.
    • 상위 인증서의 주체 키 식별자(SKID)는 하위 인증서의 권한 키 식별자(AKID)와 일치합니다.
    • 하위 인증서의 SAN은 상위 인증서의 NameConstraints 필드를 위반하지 않습니다.
  3. 신뢰 체인을 인증하는 데 성공하면 엔드포인트에 대해 구성된 모든 mTLS 커스텀 헤더를 사용하여 요청이 백엔드로 전달됩니다.
  4. 신뢰 체인 인증이 실패하면 다음을 수행합니다.
    • ClientValidationModeREJECT_INVALID로 설정된 경우 부하 분산기는 연결을 종료하고 그 이유를 Cloud Logging에 로깅합니다.
    • ClientValidationModeALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE로 설정된 경우 부하 분산기는 요청을 백엔드에 전달합니다. 커스텀 요청 헤더를 사용하여 검증이 실패한 이유와 실패 이유를 백엔드에 나타낼 수 있습니다. 리전 간 내부 애플리케이션 부하 분산기, 리전 외부 애플리케이션 부하 분산기 또는 리전 내부 애플리케이션 부하 분산기의 경우 커스텀 요청 헤더 외에도 mTLS 선택적 필드를 구성하여 장애 원인을 확인할 수 있습니다.

인증서 요구사항

  • 인증서는 RSA 또는 ECDSA 암호를 사용해야 합니다.
  • 클라이언트(리프) 인증서의 경우:
    • 기본 제약조건 확장 프로그램에는 CA=true가 포함되지 않아야 합니다.
    • 확장 키 사용 확장 프로그램에는 clientAuth가 포함되어야 합니다.
    • 확장 키 사용 확장 프로그램에는 codeSigning, timeStamping 또는 OCSPSigning 필드가 포함되지 않아야 합니다.
    • 이 인증서는 만료되지 않은 상태여야 합니다.
    • 클라이언트 인증서는 자체 서명 인증서일 수 없습니다.
  • 루트 및 중간 인증서의 경우:
    • 기본 제약조건 확장 프로그램에는 CA=true가 포함되어야 합니다.
    • 키 사용 확장 프로그램은 keyCertSign으로 설정해야 합니다.
    • 확장 키 사용 확장 프로그램에는 clientAuth 필드가 포함되어야 합니다.
    • 이 인증서는 만료되지 않은 상태여야 합니다.

제한사항

  • 부하 분산기는 클라이언트 인증서에 대한 취소 확인을 수행하지 않습니다.

  • 애플리케이션 부하 분산기를 사용하면 신뢰 앵커 최대 100개, 중간 인증서 100개, 허용 목록에 추가된 인증서 500개가 포함된 단일 트러스트 저장소가 있는 트러스트 구성을 업로드할 수 있습니다. 모든 중간 인증서에는 동일한 주제 및 주제 공개 키 정보를 공유하는 인증서가 3개를 초과하면 안 됩니다. 자세한 내용은 할당량 및 한도를 참조하세요.

  • 루트 및 클라이언트 인증서를 포함하여 인증서 체인의 최대 깊이는 10입니다. 신뢰 체인을 구축하려고 시도할 때 중간 인증서를 평가할 수 있는 최대 시도 횟수는 100입니다. 자세한 내용은 할당량 및 제한을 참조하세요.

  • 클라이언트에서 업로드 및 전달된 인증서의 키는 다음으로 제한됩니다.

    • RSA 키는 2,048~4,096비트일 수 있습니다. 자세한 내용은 할당량 및 제한을 참조하세요.
    • ECDSA 키는 P-256 또는 P-384 곡선을 사용할 수 있습니다.
  • 클라이언트에서 수신된 허용되는 인증서 체인은 최대 16KB 및 10개의 인증서로 제한됩니다. 자세한 내용은 할당량 및 한도를 참조하세요.

  • 검증에 사용되는 루트 인증서는 10개를 초과하는 이름 제약조건을 포함할 수 없습니다. 자세한 내용은 할당량 및 한도를 참조하세요.

  • 자체 서명 클라이언트 인증서는 항상 부하 분산기에서 잘못된 것으로 간주됩니다.

다음 단계