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
특정 경로에 대한 외부 인가 동작 재정의
이 섹션에서는 게이트웨이 전체 기본값을 변경하거나 개별 경로에만 외부 인가를 활성화하는 방법을 설명합니다. 이를 위해 다음 단계를 완료하세요.
Gateway리소스의consul.hashicorp.com/ext-authz어노테이션을disabled로 설정하여 API 게이트웨이에 대한 외부 인가를 비활성화합니다. 이렇게 하면 모든 경로에서 외부 인가가 옵트인(opt-in)이 됩니다.RouteAuthFilter구성 항목 또는HTTPRoute리소스의 어노테이션을 사용해 특정 경로에 대한 외부 인가를 활성화합니다.
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 게이트웨이가 일치하는 요청을 업스트림 서비스로 전달하기 전에 외부 인가 서비스를 호출합니다.