일반적으로 HTTPS 커뮤니케이션에서 인증은 클라이언트가 서버의 ID를 확인하는 방식의 단방향으로만 작동합니다.
부하 분산기가 연결하는 클라이언트의 ID를 인증해야 하는 애플리케이션의 경우 상호 TLS(mTLS)를 사용합니다.
mTLS에서 부하 분산기는 부하 분산기와의 TLS 핸드셰이크 중 클라이언트가 자체 인증을 위해 인증서를 전송하도록 요청합니다. 부하 분산기가 클라이언트 인증서의 신뢰 체인을 검증하는 데 사용하는 트러스트 저장소를 구성할 수 있습니다.
다음 애플리케이션 부하 분산기는 mTLS를 지원합니다.
- 전역 외부 애플리케이션 부하 분산기
- 기본 애플리케이션 부하 분산기
- 리전 외부 애플리케이션 부하 분산기
- 리전 내부 애플리케이션 부하 분산기
- 리전 간 내부 애플리케이션 부하 분산기
아키텍처
부하 분산기가 mTLS 인증 배포를 지원하려면 다음 리소스가 필요합니다.
클라이언트 인증(ServerTLSPolicy라고도 함) 리소스. 클라이언트 인증서를 검증할 때 사용할 서버 측 TLS 모드와
TrustConfig
리소스를 지정할 수 있습니다. 서버 TLS 정책에서 모든 mTLS 인증 관련 매개변수를 지정할 수 있습니다. 서버 TLS 정책은 대상 HTTPS 프록시 리소스에 연결될 수 있습니다.TrustConfig
리소스. 인증서 관리자 리소스.TrustConfig
에는 클라이언트 인증서를 검증하는 데 사용되는 단일 트러스트 저장소 리소스가 포함됩니다. 자세한 내용은 트러스트 구성 관리를 참조하세요.TrustConfig
에 대한 허용 목록에 추가된 인증서를 업데이트할 수 있습니다. 허용 목록에 추가된 인증서는 인증서가 파싱 가능하고 비공개 키 소유 증명이 설정되었으며 인증서의 SAN 필드에 대한 제약조건이 충족되는 한 항상 유효하다고 간주됩니다. 만료된 인증서가 허용 목록에 있으면 유효하다고 간주됩니다.트러스트 저장소. 클라이언트 인증서 체인을 검증하는 데 사용되는 신뢰 앵커와 중간 인증 기관(CA) 인증서를 포함합니다. CA는 클라이언트에 대해 신뢰할 수 있는 인증서를 발급하는 데 사용됩니다. CA는 부하 분산기의 신뢰 앵커 루트 인증서 또는 중간 CA 인증서로 식별됩니다.
다음 유형의 클라이언트 인증서를 트러스트 저장소에 업로드할 수 있습니다.
- 원하는 서드 파티 CA에서 발급한 인증서
- 비공개 CA로 상호 TLS 설정에 설명된 대로 제어의 비공개 CA에서 발급된 인증서
- 사용자 제공 인증서로 상호 TLS 설정에 설명된 대로 서명된 인증서
다음 이미지는 mTLS 구성요소를 보여줍니다.
전역
다음 다이어그램은 외부 애플리케이션 부하 분산기 배포의 구성요소를 보여줍니다. 이 아키텍처는 전역 구성요소를 사용하는 내부 애플리케이션 부하 분산기인 리전 간 내부 애플리케이션 부하 분산기에도 적용됩니다.
리전
다음 다이어그램은 리전별 내부 애플리케이션 부하 분산기 배포의 구성요소를 보여줍니다. 이 아키텍처는 리전 구성요소를 사용하는 외부 애플리케이션 부하 분산기인 리전 외부 애플리케이션 부하 분산기에도 적용됩니다.
애플리케이션 부하 분산기 배포의 구성요소에 대한 자세한 내용은 다음 섹션을 참조하세요.
기능
부하 분산기용 mTLS에서 지원하는 기능을 통해 다음을 수행할 수 있습니다.
클라이언트가 제공하는 인증서의 비공개 키에 대한 소유 증명을 확인합니다.
다음 두 가지 모드 중 하나로 클라이언트 인증서를 검증합니다.
- 트러스트 저장소에 대한 클라이언트 인증서 체인을 검증할 수 없으면 요청을 거부합니다.
- 클라이언트 인증서를 제공하지 않는 경우에도 모든 요청을 백엔드에 전달합니다.
업로드된 PKI 앵커에 대해 클라이언트 인증서 검증을 수행합니다. 이전 PKI에서 새 PKI로 다운타임 없이 마이그레이션할 수 있도록 여러 PKI 앵커를 뵬도로 추가할 수 있도록 지원합니다.
지정된 PKI 앵커에 대한 검증 경로 빌드에 사용할 추가 중간 인증서를 제공합니다. 중간 인증서를 사용하면 전체 인증서 체인을 전달하지 않는 클라이언트에서 mTLS를 사용할 수 있습니다.
인증서의 지문을 생성하여 커스텀 요청 헤더로 백엔드에 전달합니다.
커스텀 요청 헤더를 사용하여 인증서에서 추출된 선택한 필드를 백엔드로 전달합니다.
커스텀 요청 헤더를 사용하여 검증 결과와 검증 오류를 백엔드에 전달합니다.
검증 프로세스에 대한 자세한 내용은 이 페이지 뒷부분의 클라이언트 인증서 검증 단계 섹션을 참조하세요.
MTLS 클라이언트 검증 모드
클라이언트가 부하 분산기에 잘못된 인증서를 제공하거나 인증서를 제공하지 않으면 clientValidationMode
는 클라이언트 연결이 처리되는 방법을 지정합니다.
clientValidationMode
값은 다음과 같습니다.
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
는 클라이언트 인증서의 인증서 체인 검증이 실패했거나 클라이언트 인증서가 제공되지 않은 경우에도 클라이언트의 연결을 허용합니다. 클라이언트 인증서 제공 시 비공개 키의 소유 증명은 항상 점검됩니다.이 모드에서 커스텀 헤더 변수를 사용하여 클라이언트가 인증서를 제공했는지, 인증서 검증이 성공했는지 여부 및 인증서에서 추출된 기타 정보를 백엔드에 나타낼 수 있습니다.
클라이언트가 인증서를 제공하지 않거나 인증서 검증에 실패하면
REJECT_INVALID
는 연결을 거부합니다.
백엔드 서비스에 로깅이 사용 설정되면 mTLS 클라이언트 인증서 검증에 대한 로그를 확인할 수 있습니다.
백엔드에 전달된 커스텀 헤더 값
다음 표는 항상 백엔드로 전달되는 모든 상호 TLS 커스텀 헤더 변수 값을 보여줍니다(요청 유형 '백엔드로 요청 전달'). clientValidationMode
가 ALLOW_INVALID_OR_MISSING_CLIENT_CERT
로 설정되거나 클라이언트 인증서가 인증서 검증을 통과하면 커스텀 헤더가 백엔드로 전달됩니다.
클라이언트 인증서 상태 | clientValidationMode | 맞춤 헤더 |
---|---|---|
클라이언트 인증서 체인이 너무 깁니다(클라이언트 인증서에 포함된 중간 인증서 10개 초과). |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 또는 중간 인증서에 잘못된 RSA 키 크기가 있습니다. 유효성 검사가 수행되지 않습니다. RSA 키는 2,048~4,096비트일 수 있습니다. |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 또는 중간 인증서는 지원되지 않는 타원 곡선을 사용하고 있습니다. 유효성 검사가 수행되지 않습니다. 유효한 타원 곡선은 P-256과 P-384입니다. |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 또는 중간 인증서가 RSA가 아니거나 ECDSA가 아닌 알고리즘을 사용합니다. 유효성 검사가 수행되지 않습니다. |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
검증에 사용되는 PKI에는 동일한 제목 및 제목 공개 키 정보를 공유하는 중간 인증서가 10개 이상 있습니다. 유효성 검사가 수행되지 않습니다. |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
검증을 위해 제공된 중간 인증서에 이름 제약조건이 10개를 초과합니다. |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 인증서에 |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
인증서 체인을 검증하는 동안 시간이 초과되었습니다. | ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
client_cert_sha256_fingerprint: <cert hash>
|
인증서 체인을 검증하는 동안 깊이 또는 반복 한도에 도달합니다. 루트 및 클라이언트 인증서를 포함하여 인증서 체인의 최대 깊이는 10입니다. 최대 반복 횟수는 100입니다(클라이언트 인증서 체인 검증을 위해 확인된 인증서). |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
검증을 수행할 수 없지만 인증서 해시가 백엔드로 전달됩니다. |
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 인증서가 없습니다. | ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 인증서가 TrustConfig 리소스에 대한 검증에 실패합니다.
|
ALLOW_INVALID_OR_MISSING_CLIENT_CERT
|
|
클라이언트 인증서는 인증서 확인자 검증을 통과합니다. | 해당 없음 |
client_cert_error: <empty>
|
종료된 연결에서 로깅된 오류
clientValidationMode
가 ALLOW_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
검증으로 로깅된 오류
clientValidationMode
가 REJECT_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_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
|
클라이언트 인증서 검증 단계
클라이언트 인증서를 검증할 때 부하 분산기는 다음 단계를 수행합니다.
- 부하 분산기는 클라이언트의 서명을 확인하여 클라이언트가 클라이언트 인증서의 비공개 키를 보유하고 있음을 증명합니다. 이 단계가 실패하면 구성에서 클라이언트 인증서가 잘못되었거나 누락되어 있고 전역 외부 애플리케이션 부하 분산기에 대한 정보가 로깅되지 않더라도 부하 분산기는 항상 TLS 핸드셰이크에 실패하며, 리전 외부 애플리케이션 부하 분산기 및 내부 애플리케이션 부하 분산기의
proxyStatus
필드에 TLS 오류가 로깅됩니다. - 구성에
TrustAnchor
가 포함된 경우 부하 분산기는 클라이언트 인증서와 구성된TrustAnchor
간의 신뢰 체인을 확인합니다. 특히 부하 분산기는 다음을 확인합니다.- 클라이언트, 중간 인증서, 루트 인증서는 인증서 요구사항을 준수합니다.
- 상위 인증서의 제목 필드는 하위 인증서의 문제 필드와 일치합니다.
- 상위 인증서의 주체 키 식별자(SKID)는 하위 인증서의 권한 키 식별자(AKID)와 일치합니다.
- 하위 인증서의 SAN은 상위 인증서의
NameConstraints
필드를 위반하지 않습니다.
- 신뢰 체인을 인증하는 데 성공하면 엔드포인트에 대해 구성된 모든 mTLS 커스텀 헤더를 사용하여 요청이 백엔드로 전달됩니다.
- 신뢰 체인 인증이 실패하면 다음을 수행합니다.
ClientValidationMode
가REJECT_INVALID
로 설정된 경우 부하 분산기는 연결을 종료하고 그 이유를 Cloud Logging에 로깅합니다.ClientValidationMode
가ALLOW_INVALID_OR_MISSING_CLIENT_CERTIFICATE
로 설정된 경우 부하 분산기는 요청을 백엔드에 전달합니다. 커스텀 요청 헤더를 사용하여 검증이 실패한 이유와 실패 이유를 백엔드에 나타낼 수 있습니다. 리전 간 내부 애플리케이션 부하 분산기, 리전 외부 애플리케이션 부하 분산기 또는 리전 내부 애플리케이션 부하 분산기의 경우 커스텀 요청 헤더 외에도 mTLS 선택적 필드를 구성하여 장애 원인을 확인할 수 있습니다.
인증서 요구사항
- 인증서는 RSA 또는 ECDSA 암호를 사용해야 합니다.
- 클라이언트(리프) 인증서의 경우:
- 루트 및 중간 인증서의 경우:
제한사항
부하 분산기는 클라이언트 인증서에 대한 취소 확인을 수행하지 않습니다.
애플리케이션 부하 분산기를 사용하면 신뢰 앵커 최대 100개, 중간 인증서 100개, 허용 목록에 추가된 인증서 500개가 포함된 단일 트러스트 저장소가 있는 트러스트 구성을 업로드할 수 있습니다. 모든 중간 인증서에는 동일한 주제 및 주제 공개 키 정보를 공유하는 인증서가 3개를 초과하면 안 됩니다. 자세한 내용은 할당량 및 한도를 참조하세요.
루트 및 클라이언트 인증서를 포함하여 인증서 체인의 최대 깊이는 10입니다. 신뢰 체인을 구축하려고 시도할 때 중간 인증서를 평가할 수 있는 최대 시도 횟수는 100입니다. 자세한 내용은 할당량 및 제한을 참조하세요.
클라이언트에서 업로드 및 전달된 인증서의 키는 다음으로 제한됩니다.
- RSA 키는 2,048~4,096비트일 수 있습니다. 자세한 내용은 할당량 및 제한을 참조하세요.
- ECDSA 키는 P-256 또는 P-384 곡선을 사용할 수 있습니다.
클라이언트에서 수신된 허용되는 인증서 체인은 최대 16KB 및 10개의 인증서로 제한됩니다. 자세한 내용은 할당량 및 한도를 참조하세요.
검증에 사용되는 루트 인증서는 10개를 초과하는 이름 제약조건을 포함할 수 없습니다. 자세한 내용은 할당량 및 한도를 참조하세요.
자체 서명 클라이언트 인증서는 항상 부하 분산기에서 잘못된 것으로 간주됩니다.