Infra

[Istio] External Authorization

KMSEOP 2024. 8. 4. 15:58
728x90

Istio Serive Mesh

Istio는 쿠버네티스 클러스터 내에서 서비스 간의 통신을 제어하고 관리하는 서비스 메쉬로 트래픽 관리, 보안, 정책 적용 및 모니터링을 제공하여 마이크로서비스의 복잡성을 관리하는 데 도움을 줍니다.

External Authorization

External Authorization은 Istio의 보안 기능중에 하나로 인증 서비스와 연동하여 요청에 대한 엑세스 제어를 할 수 있도록 중앙에서 관리 해줍니다.
External Authorization은 Istio 데이터 플레인에서 트래픽을 처리하는 프록시인 Envoy Filter를 사용하여 구현됩니다. Envoy는 요청을 인증 서비스로 경유시키도록 하고 인증 서비스에 의해서 액세스 가능 여부를 결정하게 됩니다.

https://istio.io/v1.10/blog/2021/better-external-authz/

 

 

구성 요소

Authorization Service

인증, 인가를 수행하는 서버로 Istio와 통합되어 요청의 액세스 가능 여부를 결정하게 됩니다. Http 또는 gRPC를 통해 Envoy와 통신하게 됩니다.
Envoy 문서에서 제공하는 Proto를 구현체로 구현하여 인증, 인가를 수행합니다.

Envoy Filter

Envoy Filter는 클러스터로 들어온 요청을 인증 서비스를 거쳐가도록 경유 시킵니다.
Envoy Filter 설정 예시는 아래와 같습니다.

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: ext-authz
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
    - applyTo: HTTP_FILTER
      match:
        context: GATEWAY
        listener:
          portNumber: 80
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
              subFilter:
                name: "envoy.filters.http.router"
      patch:
        operation: INSERT_BEFORE
        value:
          name: envoy.filters.http.ext_authz
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthz
            http_service:
              server_uri:
                uri: "http://auth-server.default.svc.cluster.local:8000" # 인증 서비스 경로
                cluster: "outbound|8000||auth-server.default.svc.cluster.local"
                timeout: 5s
              authorization_request:
                allowed_headers:
                  patterns:
                    - exact: "x-request-id"
                    - prefix: "x-envoy"
                    - prefix: "x-auth"
                    - exact: "authorization"
              authorization_response:
                allowed_upstream_headers:
                  patterns:
                    - exact: "x-auth"

Istio Policy

Istio의 AuthorizationPolicy 리소스를 사용하여 특정 조건 하에서 요청이 외부 권한 부여 서비스로 전달되도록 정의합니다.
아래 설정은 example.com 도메인으로 ingress에 요청이 들어올 경우 인증 서비스를 거치도록 하는 예시입니다.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: ext-authz
  namespace: default
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  action: CUSTOM
  provider:
    name: ext-authz
  rules:
  - to:
    - operation:
      - Hosts
        example.com
728x90