API 게이트웨이 인증을 외부 서비스로 위임하기
API 게이트웨이 인증을 외부 서비스로 위임하기 (External Authorization on VMs)
이 문서는 가상 머신(VM)에서 Consul API 게이트웨이의 요청에 대한 인증을 외부 서비스로 위임하는 방법을 설명해요. builtin/ext-authz Envoy 확장을 적용해 게이트웨이 수준 기본값과 라우트별 재정의로 외부 인증을 제어하는 방법을 다룰게요. 이 기능은 Consul Enterprise에서 사용할 수 있어요.
출처: 문서
본문
Enterprise
이 기능은 Consul Enterprise가 필요합니다. 추가 정보는 enterprise 기능 매트릭스를 참조하세요.
이 문서는 가상 머신(VM)에서 Consul API 게이트웨이에 대한 요청의 인증을 외부 서비스로 위임하는 방법을 설명합니다. 서비스가 Kubernetes 오케스트레이션 컨테이너에 배포된 경우 Kubernetes에서 API 게이트웨이 인증을 외부 서비스로 위임을 참조하세요.
개요 (Overview)
외부 인증 Envoy 확장 (builtin/ext-authz)은 Envoy가 요청을 업스트림으로 전달하기 전에 외부 인증 서비스를 호출하도록 지시합니다.
Consul은 확장의 ProxyType 필드를 사용해 인증을 적용할 위치를 결정합니다:
ProxyType이connect-proxy로 설정되면 인증이 서비스의 사이드카 프록시 수준에서 적용됩니다. 이는 이스트-웨스트(east-west) 트래픽에 사용됩니다.ProxyType이api-gateway로 설정되면 확장이 API 게이트웨이 자체에 적용되고 외부 인증이 API 게이트웨이가 받는 요청에 적용됩니다. 이는 노스-사우스(north-south) 트래픽에 사용됩니다.
이 문서는 api-gateway의 경우를 설명합니다.
외부 인증의 선행 조건은 확장을 게이트웨이의 service defaults 구성 항목에 적용하는 것입니다. 적용되면 해당 게이트웨이에 연결된 모든 경로에 대해 외부 인증이 기본적으로 활성화됩니다.
확장을 적용한 후 두 수준에서 외부 인증을 제어할 수 있습니다:
- 게이트웨이 전체 기본값: API 게이트웨이 구성 항목의
ExtAuthz블록은 게이트웨이에 연결된 모든 경로의 기본 인증 동작을 설정합니다. 확장이 적용되었지만ExtAuthz블록이 없으면 모든 경로에 대해 외부 인증이 활성화됩니다. - 경로별 재정의: HTTP route 구성 항목의
ExtAuthz필터는 일치하는 경로에 대해 게이트웨이 전체 기본값을 재정의합니다.
요구 사항 (Requirements)
- Consul Enterprise 2.0.2 이상
- 하나 이상의 메시 서비스로 라우팅하도록 배포·구성된 API 게이트웨이
- Envoy 외부 인증 gRPC 또는 HTTP API를 구현하는 외부 인증 서비스
외부 인증 활성화 (Enable external authorization)
API 게이트웨이에 대한 service defaults 구성 항목에 외부 인증 확장을 추가하고 ProxyType을 api-gateway로 설정합니다.
api-gateway ProxyType을 사용하면 원격 호스트의 인증 서비스를 가리키도록 Target.URI를 구성할 수 있습니다.
gateway-service-defaults.hcl:
Kind = "service-defaults"
Name = "api-gateway"
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
}
]
}
}
}
]
요청·응답 헤더 제어를 포함한 구성 가능한 전체 필드 목록은 외부 인증 확장 구성 참조를 참조하세요.
구성 항목을 Consul에 작성합니다:
$ consul config write gateway-service-defaults.hcl
특정 경로에 대한 외부 인증 동작 재정의 (Override external authorization behavior for specific routes)
이 섹션은 게이트웨이 전체 기본값을 변경하거나 개별 경로에 대해서만 외부 인증을 활성화하는 방법을 설명합니다. 이렇게 하려면 다음 단계를 완료합니다:
- API 게이트웨이 구성 항목에서
ExtAuthz.Enabled를false로 설정해 API 게이트웨이에 대한 외부 인증 비활성화를 수행합니다. 이렇게 하면 모든 경로에 대해 외부 인증이 opt-in(사용자가 선택) 방식이 됩니다. - HTTP route 구성 항목의
ExtAuthz필터를 사용해 특정 경로에 대한 외부 인증 활성화.
API 게이트웨이에 대한 외부 인증 비활성화 (Disable external authorization for the API gateway)
외부 인증은 게이트웨이에 연결된 모든 경로에 대해 기본적으로 활성화됩니다. 이 단계는 선택 사항이며 라우트 수준에서 외부 인증을 opt-in으로 만들려는 경우에만 필요합니다.
API 게이트웨이 구성 항목의 ExtAuthz 블록을 사용해 ExtAuthz.Enabled를 false로 설정합니다.
api-gateway.hcl:
Kind = "api-gateway"
Name = "api-gateway"
ExtAuthz = {
Enabled = false
}
Listeners = [
{
Name = "http-listener"
Port = 8443
Protocol = "http"
}
]
구성 항목을 Consul에 작성합니다:
$ consul config write api-gateway.hcl
HTTP route ExtAuthz 필터 사용 (Use the HTTP route ExtAuthz filter)
규칙이 일치하는 경로에 대해 외부 인증을 강제로 켜거나 끄려면 HTTP route 구성 항목의 ExtAuthz 필터를 사용합니다. 라우트 수준 설정이 게이트웨이 전체 기본값보다 우선합니다.
다음 예제에서 게이트웨이 전체 기본값이 opt-in인 경우에도 /admin 요청에 대해 외부 인증이 활성화됩니다:
http-route.hcl:
Kind = "http-route"
Name = "admin-route"
Parents = [
{
Kind = "api-gateway"
Name = "api-gateway"
}
]
Rules = [
{
Matches = [
{
Path = {
Match = "prefix"
Value = "/admin"
}
}
]
Filters = {
ExtAuthz = {
Enabled = true
}
}
Services = [
{
Name = "admin"
}
]
}
]
구성 항목을 Consul에 작성합니다:
$ consul config write http-route.hcl
Consul이 구성을 적용하면 API 게이트웨이는 구성한 인증 동작에 따라 일치하는 요청을 업스트림 서비스로 전달하기 전에 외부 인증 서비스를 호출합니다.