원격 JWKS로 JWT 인증 구성
Cloud Service Mesh를 사용하면 Istio RequestAuthentication
커스텀 리소스를 사용하여 JSON 웹 토큰 (JWT)을 검증하여 서비스를 보호할 수 있습니다. 이 구성의 핵심 부분은 JSON 웹 키 세트 (JWKS) 제공업체의 URI를 지정하는 jwksUri
필드입니다. 이 JWKS에는 수신 JWT를 검증하는 데 사용되는 공개 키가 포함되어 있습니다.
중요: Cloud Service Mesh에서 데이터 영역 (Envoy 프록시)은 jwksUri
에서 직접 JWKS 키를 가져오는 역할을 합니다. Cloud Service Mesh 컨트롤 플레인 (Traffic Director에서 관리)은 이러한 키를 가져오기 위해 외부 호출을 하지 않습니다. 즉, 외부 JWKS 제공업체와의 모든 네트워크 통신은 워크로드의 Envoy 프록시에서 시작됩니다.
외부 JWKS 액세스 기본 요건
이 가이드를 따르려면 다음이 필요합니다.
인터넷 액세스 조직 정책:
jwksUri
이 외부 인터넷 엔드포인트를 가리키는 경우 조직 정책에서 워크로드의 아웃바운드 인터넷 액세스를 허용해야 합니다. Google Cloud 특히 조직 정책constraints/compute.disableInternetNetworkEndpointGroup
이 시행되지 않음인지 확인합니다. 이 정책을 사용 설정하면 외부jwksUri
에서 JWKS를 가져오지 못합니다.라벨이 지정된 Kubernetes 워크로드:
RequestAuthentication
및AuthorizationPolicy
리소스는selector
를 사용하여 특정 워크로드를 타겟팅합니다. 정책에서 일치시킬 수 있는 라벨이 있는 클러스터에서 실행되는 Kubernetes 배포와 같은 워크로드가 있어야 합니다. 예를 들어httpbin
샘플은app: httpbin
라벨로 실행되도록 구성됩니다. Istio JWT 토큰 가이드에서httpbin
및curl
을 사용하여 설정을 자유롭게 사용하세요.
JWKS 가져오기를 사용 설정하는 방법
Envoy 프록시가 외부 jwksUri
에서 JWKS 키를 가져올 수 있도록 Cloud Service Mesh를 구성하는 기본 방법에는 두 가지가 있습니다.
1. ServiceEntry
및 DestinationRule
을 사용한 수동 구성 (권장)
이는 대부분의 프로덕션 시나리오에 권장되는 방법이며 MCP를 사용하는 Cloud Service Mesh에 필요합니다. 이 메서드를 사용하면 메시가 외부 JWKS 제공자와 상호작용하는 방식을 명시적으로 제어할 수 있습니다.
ServiceEntry
으로 외부 서비스 정의
먼저 Istio ServiceEntry
를 만들어 외부 JWKS 제공업체를 메시 내에서 알려진 서비스로 만들어야 합니다. 이 리소스는 데이터 영역의 Envoy 프록시에 대한 DNS 변환과 적절한 라우팅을 지원합니다.
jwksUri: "https://your-auth-provider.com/.well-known/jwks.json"
를 사용하는 RequestAuthentication
정책의 경우 다음 ServiceEntry
를 만듭니다.
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
name: "external-jwks-provider-se"
namespace: your-namespace
spec:
hosts:
- "your-auth-provider.com" # Hostname from your jwksUri
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: TLS
resolution: DNS
DestinationRule
로 연결 설정 구성
둘째, 특히 제공업체에 특정 TLS 또는 mTLS 구성이 필요한 경우 JWKS 제공업체에 대한 연결에 클라이언트 측 TLS 설정을 지정하기 위해 DestinationRule
가 필요할 수 있습니다.
- 공개적으로 신뢰할 수 있는 인증서를 사용하는 제공업체의 경우
tls.mode
이SIMPLE
로 설정된DestinationRule
를 만들어 표준 서버 측 TLS 유효성 검사를 사용 설정합니다. - 클라이언트 인증서 (mTLS)가 필요한 제공업체의 경우
tls.mode
를MUTUAL
로 설정하고 Envoy가 제시해야 하는 인증서 및 키의 경로를 제공합니다.
이 DestinationRule
는 이전 단계에서 정의된 ServiceEntry
의 연결 정책을 구성합니다.
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
name: "external-jwks-provider-dr"
namespace: your-namespace
spec:
host: "your-auth-provider.com" # Must match a host in the ServiceEntry
trafficPolicy:
tls:
# Use SIMPLE for standard server-side TLS.
mode: SIMPLE
# If the JWKS provider uses a custom CA, provide the CA cert bundle.
# caCertificates: /path/to/provider-ca-cert.pem
# For providers requiring mTLS from Envoy, uncomment the following:
# mode: MUTUAL
# clientCertificate: /path/to/client-cert.pem
# privateKey: /path/to/client-key.pem
# caCertificates: /path/to/provider-ca-cert.pem
이러한 리소스가 있고 올바르게 구성된 경우 Envoy는 이를 사용하여 보안 연결을 설정하고 JWKS 키를 가져옵니다.
2. Cloud Service Mesh에 의한 자동 구성 (Traffic Director만 해당)
Cloud Service Mesh가 RequestAuthentication
정책에서 HTTPS jwksUri
의 호스트 이름과 포트를 포함하는 사용자 정의 ServiceEntry
를 찾지 못하면 Envoy가 JWKS 키를 가져오는 데 필요한 설정을 자동으로 구성합니다. 이 자동화는 jwksUri
(HTTPS, 표준 TLS)에 대한 기본 연결이 충분한 일반적인 시나리오의 설정을 간소화합니다.
자동 구성 조건: 다음과 같은 경우 이 자동 동작이 적용됩니다.
- Traffic Director와 함께 Cloud Service Mesh를 사용하고 있습니다.
jwksUri
은https
스키마를 사용합니다.jwksUri
는 클러스터 로컬이 아닌 외부 서비스를 가리킵니다.RequestAuthentication
정책의 네임스페이스와ServiceEntry
의exportTo
필드를 고려할 때 표시되는ServiceEntry
가 이미jwksUri
의 호스트 이름과 포트를 관리하고 있습니다.
이러한 조건을 충족하면 해당 jwksUri
에 대해 명시적 ServiceEntry
또는 DestinationRule
리소스를 만들지 않아도 Envoy 프록시가 JWKS를 가져오도록 구성됩니다.
RequestAuthentication
구성 중
JWKS 가져오기에 사용된 메서드와 관계없이 RequestAuthentication
정책을 사용하여 JWT 유효성 검사 규칙을 정의합니다.
apiVersion: security.istio.io/v1
kind: RequestAuthentication
metadata:
name: "jwt-example"
namespace: your-namespace # Replace with your application's namespace
spec:
selector:
matchLabels:
app: your-app # Replace with your application's label (e.g. httpbin)
jwtRules:
- issuer: "testing@secure.istio.io"
jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.26/security/tools/jwt/samples/jwks.json"
jwtRules
의 주요 필드 (자세한 내용은 Istio RequestAuthentication 문서 참고):
issuer
: JWT의 발급자입니다.jwksUri
: 제공업체의 공개 키 세트 (JWKS)의 HTTPS URI입니다.fromHeaders
(선택사항): JWT가 예상되는 헤더 위치를 지정합니다.fromParams
(선택사항): JWT가 예상되는 쿼리 매개변수를 지정합니다.forwardOriginalToken
(선택사항): true인 경우 원래 토큰이 업스트림 서비스로 전달됩니다.
AuthorizationPolicy
를 사용하여 JWT 인증 적용
유효한 JWT가 없는 요청을 거부하려면 RequestAuthentication
정책을 AuthorizationPolicy
와 페어링해야 합니다. 다음 정책은 지정된 발급자 및 주체로부터 유효한 JWT를 제시하는 경우에만 your-app
워크로드에 대한 요청을 허용합니다.
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: "require-jwt-for-your-app"
namespace: your-namespace # Replace with your application's namespace
spec:
selector:
matchLabels:
app: your-app # Replace with your application's label (e.g. httpbin)
action: ALLOW
rules:
- from:
- source:
# This principal is typically in the format "issuer/subject"
requestPrincipals: ["testing@secure.istio.io/sub-from-jwt"] # Replace with the expected principal
승인에 JWT 클레임을 사용하는 방법에 관한 자세한 예시와 사용 사례는 JWT 토큰용 Istio 승인 작업을 참고하세요.
다음 단계
- Istio RequestAuthentication API에 대해 자세히 알아보세요.
- 일반 Cloud Service Mesh AuthorizationPolicy 개요를 검토합니다.
- JWT용 AuthorizationPolicy의 Istio 예시를 살펴보세요.