API 게이트웨이 요청 인증 위임

API 게이트웨이 요청 인증 위임 (ext-authz, K8s)

이 주제에서는 Kubernetes 오케스트레이션 네트워크에서 Consul API 게이트웨이에 대한 요청의 권한 부여를 외부 서비스에 위임하는 방법을 설명해요. 외부 인가 Envoy 확장(builtin/ext-authz)을 사용하며, 이 기능은 Consul Enterprise가 필요해요.

출처: 문서

본문

Enterprise

이 기능은 Consul Enterprise가 필요합니다. 추가 정보는 enterprise feature matrix를 참조하세요.

이 주제에서는 Kubernetes 오케스트레이션 네트워크에서 Consul API 게이트웨이에 대한 요청의 권한 부여를 외부 서비스에 위임하는 방법을 설명합니다. 서비스가 가상 머신에 배포된 경우 Delegate API gateway authorization to an external service on virtual machines을 참조하세요.

개요 (Overview)

외부 인가 Envoy 확장(builtin/ext-authz)은 Envoy가 요청을 업스트림으로 전달하기 전에 외부 인가 서비스를 호출하도록 지시합니다.

Consul은 확장의 ProxyType 필드를 사용해 인가를 어디에서 시행할지 결정합니다.

  • ProxyType이 connect-proxy로 설정되면 인가는 서비스의 사이드카 프록시 수준에서 시행됩니다. 이는 east-west 트래픽에 사용됩니다.
  • ProxyType이 api-gateway로 설정되면 확장이 API 게이트웨이 자체에 적용되고, API 게이트웨이가 수신한 요청에 외부 인가가 적용됩니다. 이는 north-south 트래픽에 사용됩니다.

이 주제에서는 api-gateway 사례를 설명합니다.

확장을 게이트웨이의 ServiceDefaults 리소스에 적용하는 것은 외부 인가의 사전 요구 사항입니다. 적용되면 해당 게이트웨이에 연결된 모든 경로에 대해 외부 인가가 기본적으로 활성화됩니다.

확장을 적용한 후에는 두 수준에서 외부 인가를 제어할 수 있습니다.

  • 게이트웨이 전체 기본값: Gateway 리소스의 consul.hashicorp.com/ext-authz 어노테이션은 해당 게이트웨이에 연결된 모든 경로에 대한 기본 인가 동작을 설정합니다. 확장이 적용되었지만 어노테이션이 없으면 모든 경로에 대해 외부 인가가 활성화됩니다.
  • 경로별 재정의: RouteAuthFilter 리소스 또는 HTTPRoute의 consul.hashicorp.com/ext-authz 어노테이션이 정의하는 경로에 대해 게이트웨이 전체 기본값을 재정의합니다.

요구 사항 (Requirements)

  • Consul Enterprise 2.0.2 이상
  • 하나 이상의 메시 서비스로 라우팅하도록 배포되고 구성된 API 게이트웨이
  • Envoy 외부 인가 gRPC 또는 HTTP API를 구현하는 외부 인가 서비스

외부 인가 활성화

API 게이트웨이의 ServiceDefaults 리소스에 외부 인가 확장을 추가하고 ProxyType을 api-gateway로 설정하세요.

api-gateway ProxyType은 Target.URI를 원격 호스트의 인가 서비스를 가리키도록 구성할 수 있게 해줍니다.

gateway-service-defaults.yaml

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceDefaults
metadata:
  name: api-gateway
spec:
  protocol: http
  envoyExtensions:
  - name: builtin/ext-authz
    arguments:
      ProxyType: api-gateway
      Config:
        GrpcService:
          Target:
            URI: authz.example.com:9191
        AllowedHeaders:
        - Prefix: x-
        DisallowedHeaders:
        - Exact: authorization
          IgnoreCase: true

요청 및 응답 헤더 제어를 포함한 구성 가능한 전체 필드 목록은 외부 인가 확장 구성 참조를 참조하세요.

리소스를 클러스터에 적용하세요.

$ kubectl apply -f gateway-service-defaults.yaml

특정 경로에 대한 외부 인가 동작 재정의

이 섹션에서는 게이트웨이 전체 기본값을 변경하거나 개별 경로에만 외부 인가를 활성화하는 방법을 설명합니다. 이를 위해 다음 단계를 완료하세요.

API 게이트웨이에 대한 외부 인가 비활성화

Gateway 리소스에 연결된 모든 경로에 대해 외부 인가는 기본적으로 활성화됩니다. 이 단계는 선택 사항이며 경로 수준에서 외부 인가를 옵트인으로 만들고 싶을 때만 필요합니다.

Gateway 리소스에 consul.hashicorp.com/ext-authz 어노테이션을 추가하고 disabled로 설정하세요.

gateway.yaml

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: api-gateway
  annotations:
    consul.hashicorp.com/ext-authz: disabled
spec:
  gatewayClassName: consul
  listeners:
  - name: http-listener
    port: 8443
    protocol: HTTP

리소스를 클러스터에 적용하세요.

$ kubectl apply -f gateway.yaml

RouteAuthFilter 구성 항목 사용

외부 인증을 사용하는 RouteAuthFilter를 정의하세요. 필터의 spec.extAuthz.enabled 값은 게이트웨이 전체 기본값보다 우선합니다.

route-auth-filter.yaml

apiVersion: consul.hashicorp.com/v1alpha1
kind: RouteAuthFilter
metadata:
  name: admin-ext-authz
  namespace: default
spec:
  extAuthz:
    enabled: true

extensionRef 필터가 있는 HTTPRoute에서 필터를 참조하세요.

http-route.yaml

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: admin-route
spec:
  parentRefs:
  - name: api-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /admin
    filters:
    - type: ExtensionRef
      extensionRef:
        group: consul.hashicorp.com
        kind: RouteAuthFilter
        name: admin-ext-authz
    backendRefs:
    - name: admin
      port: 8080

리소스를 클러스터에 적용하세요.

$ kubectl apply -f route-auth-filter.yaml
$ kubectl apply -f http-route.yaml

HTTPRoute 구성 항목에서 어노테이션 사용

또는 정의하는 경로의 인가 동작을 재정의하려면 consul.hashicorp.com/ext-authz 어노테이션을 HTTPRoute에 직접 추가할 수 있습니다. 값을 enabled 또는 disabled로 설정하세요. 이는 게이트웨이의 consul.hashicorp.com/ext-authz 어노테이션보다 높은 우선순위를 갖습니다.

http-route-annotation.yaml

apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: admin-route
  annotations:
    consul.hashicorp.com/ext-authz: enabled
spec:
  parentRefs:
  - name: api-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /admin
    backendRefs:
    - name: admin
      port: 8080

리소스를 클러스터에 적용하세요.

$ kubectl apply -f http-route-annotation.yaml

Consul이 리소스를 조정한 후에는 구성한 인가 동작에 따라 API 게이트웨이가 일치하는 요청을 업스트림 서비스로 전달하기 전에 외부 인가 서비스를 호출합니다.

더 알아보기 (Learn more)