원격 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 워크로드: RequestAuthenticationAuthorizationPolicy 리소스는 selector를 사용하여 특정 워크로드를 타겟팅합니다. 정책에서 일치시킬 수 있는 라벨이 있는 클러스터에서 실행되는 Kubernetes 배포와 같은 워크로드가 있어야 합니다. 예를 들어 httpbin 샘플은 app: httpbin 라벨로 실행되도록 구성됩니다. Istio JWT 토큰 가이드에서 httpbincurl을 사용하여 설정을 자유롭게 사용하세요.

JWKS 가져오기를 사용 설정하는 방법

Envoy 프록시가 외부 jwksUri에서 JWKS 키를 가져올 수 있도록 Cloud Service Mesh를 구성하는 기본 방법에는 두 가지가 있습니다.

이는 대부분의 프로덕션 시나리오에 권장되는 방법이며 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.modeSIMPLE로 설정된 DestinationRule를 만들어 표준 서버 측 TLS 유효성 검사를 사용 설정합니다.
  • 클라이언트 인증서 (mTLS)가 필요한 제공업체의 경우 tls.modeMUTUAL로 설정하고 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를 사용하고 있습니다.
  • jwksUrihttps 스키마를 사용합니다.
  • jwksUri는 클러스터 로컬이 아닌 외부 서비스를 가리킵니다.
  • RequestAuthentication 정책의 네임스페이스와 ServiceEntryexportTo 필드를 고려할 때 표시되는 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 승인 작업을 참고하세요.

다음 단계