Authorization Policy
Authorization Policy (인가 정책)
Linkerd의 인가 정책을 활용해 메시에 포함된 파드로 들어오는 트래픽을 제어하고, 기본 정책·CRD·오디트 모드까지 설정하는 방법을 다루는 문서예요.
본문
Linkerd의 인가 정책을 이용하면 메시에 포함된 파드(pod)에 어떤 종류의 트래픽을 허용할지 제어할 수 있어요. 예를 들어 특정 서비스(또는 서비스의 특정 HTTP 라우트)로의 통신을 특정 다른 서비스에서만 오도록 제한할 수 있고, 특정 포트에서 mTLS가 반드시 사용되도록 강제할 수도 있습니다.
Note
Linkerd는 메시에 포함된 파드, 즉 Linkerd 프록시가 주입된 파드에만 정책을 적용할 수 있어요. 정책이 엄격한 요구사항이라면, 파드가 시작될 때 프록시가 반드시 존재하도록 강제하는 HA 모드와 함께 사용하는 것을 권장합니다.
정책 개요 (Policy overview)
기본적으로 Linkerd는 모든 트래픽이 메시를 통과하도록 허용하며, 재시도와 로드 밸런싱 등 다양한 메커니즘을 활용해 요청이 성공적으로 전달되도록 보장합니다.
하지만 때로는 허용되는 트래픽의 종류를 제한하고 싶을 때가 있어요. Linkerd의 정책 기능을 이용하면 특정 조건(클라이언트의 TLS 신원 포함)이 충족되지 않는 한 리소스에 대한 접근을 거부할 수 있습니다.
Linkerd의 정책은 두 가지 메커니즘으로 구성됩니다:
- 클러스터, 네임스페이스, 워크로드, 파드 수준에서 Kubernetes annotation으로 설정할 수 있는 기본 정책(default policies) 집합
- 특정 포트, 라우트, 워크로드 등에 대해 세밀한 정책을 지정하는 CRD 집합
이 두 메커니즘은 함께 동작해요. 예를 들어 클러스터 전체 기본 정책을 deny로 설정하면 메시에 포함된 어떤 파드로의 트래픽도 막히고, 이후 CRD를 통해 명시적으로 허용해야 합니다.
기본 정책 (Default policies)
config.linkerd.io/default-inbound-policy annotation은 네임스페이스, 워크로드, 파드 수준에서 설정할 수 있으며, 해당 계층 지점에서의 기본 트래픽 정책을 결정합니다. 사용 가능한 기본 정책은 다음과 같습니다:
- all-unauthenticated: 모든 요청을 허용. 이것이 기본값입니다.
- all-authenticated: 메시에 포함된 클라이언트의 요청만 허용.
- cluster-authenticated: 같은 클러스터의 메시에 포함된 클라이언트의 요청만 허용.
- deny: 모든 요청 거부.
- audit: all-unauthenticated와 같지만, 요청이 로그와 메트릭에 표시됩니다.
이 외에도 여러 기본 정책이 더 있습니다. 자세한 내용은 Policy reference 문서를 참고하세요.
모든 클러스터에는 설치 시점에 설정되는 클러스터 전역 기본 정책(기본값은 all-unauthenticated)이 있어요. 파드 생성 시점에 워크로드 또는 네임스페이스 수준에 존재하는 annotation은 그 값을 덮어써 해당 파드의 기본 정책을 결정할 수 있습니다. (기본 정책은 프록시 초기화 시점에 고정되므로, 파드 생성 후 annotation을 바꿔도 해당 파드의 기본 정책은 변하지 않습니다.)
세밀한 정책 (Fine-grained policies)
특정 포트나 라우트 등에 적용되는 더 세밀한 정책을 위해 Linkerd는 일련의 CRD를 사용해요. 기본 정책 annotation과 달리, 이 정책 CRD는 동적으로 변경할 수 있고 정책 동작도 실시간으로 갱신됩니다.
정책의 "대상(target)"을 나타내는 세 가지 정책 CRD가 있습니다. 이것은 정책을 적용할 수 있는 트래픽의 부분집합을 뜻해요.
- Server: 네임스페이스 안의 파드 집합에 대한, 특정 포트로의 모든 트래픽
- HTTPRoute: Server에 대한 HTTP 요청의 부분집합
- GRPCRoute: Server에 대한 gRPC 요청의 부분집합
정책 규칙의 일부로 충족되어야 하는 인증 규칙을 나타내는 두 가지 정책 CRD가 있습니다:
- MeshTLSAuthentication: 보안 워크로드 신원 기반 인증
- NetworkAuthentication: IP 주소 기반 인증
마지막으로, 정책 자체, 즉 인증 규칙과 대상의 매핑을 나타내는 두 가지 정책 CRD가 있습니다:
- AuthorizationPolicy: 인증 규칙이 충족되지 않으면 하나 이상의 대상에 대한 접근을 제한하는 정책
- ServerAuthorization: Server(즉, HTTPRoute나 GRPCRoute가 아닌)에만 접근을 제한하는 정책
Linkerd의 동적·세밀한 정책의 일반적인 패턴은, 보호해야 할 트래픽 대상을 정의하고(Server와 HTTPRoute CR의 조합), 그 트래픽에 접근하기 전에 필요한 인증 유형을 정의하며(MeshTLSAuthentication과 NetworkAuthentication), 인증을 대상에 매핑하는 정책을 정의하는 것(AuthorizationPolicy)입니다.
이 리소스들이 어떻게 동작하는지에 대한 자세한 내용은 Policy reference 문서를 참고하세요.
ServerAuthorization vs AuthorizationPolicy
Linkerd 2.12에서 AuthorizationPolicy가 도입되었어요. 이것은 ServerAuthorization보다 더 유연한 대안으로, Server뿐 아니라 HTTPRoute도 대상으로 삼을 수 있습니다. AuthorizationPolicy 사용이 권장되며, ServerAuthorization는 향후 릴리스에서 deprecated될 예정입니다.
기본 인가 (Default authorizations)
모든 트래픽을 파드에 blanket 거부하면 Kubernetes의 health/readiness 프로브도 거부되어 파드가 시작되지 못할 수 있어요. 따라서 기본 거부(default-deny) 설정을 하더라도 실제로는 이런 프로브를 인가해 줘야 합니다.
default-deny 설정을 단순화하기 위해, Linkerd는 파드에 대한 프로브를 자동으로 인가해요. 이 기본 인가들은 포트에 설정된 Server가 없을 때, 또는 Server는 설정됐지만 그 Server에 HTTPRoute나 GRPCRoute가 설정되지 않았을 때만 적용됩니다. 어떤 HTTPRoute나 GRPCRoute가 Server와 매칭된다면 자동 인가가 생성되지 않으므로, health/readiness 프로브를 위해 명시적으로 만들어 줘야 해요.
정책 거부 (Policy rejections)
HTTP(HTTP/2, gRPC 포함)로 알려진 트래픽이 정책에 의해 거부되면 프록시는 HTTP 403을 반환해요. 그 외의 모든 트래픽은 TCP 수준, 즉 연결을 거부함으로써 처리됩니다.
기존 연결을 거부하도록 정책을 동적으로 변경하면 그 연결이 갑자기 종료될 수 있다는 점에 주의하세요.
오디트 모드 (Audit mode)
Server의 기본 정책은 accessPolicy 필드에 정의되며, 기본값은 deny예요. 즉 기본적으로 해당 Server에 연결된 규칙을 따르지 않는 트래픽(아직 관련 규칙이 없는 Server도 포함)은 거부됩니다. 서비스의 가능한 모든 소스/라우트를 고려하지 않은 규칙을 적용하면 이 때문에 의도치 않게 트래픽이 차단될 수 있어요.
이 때문에 인가 정책을 처음 설정할 때는, 충분히 복잡한 서비스에 대해 accessPolicy:audit를 명시적으로 설정할 것을 권장합니다. 이 모드에서는 요청이 정책 규칙을 따르지 않아도 차단되지 않지만, 프록시 로그에 INFO 레벨로 authz.name=audit 태그와 함께 유용한 정보가 기록됩니다. 마찬가지로 프록시는 request_total 같은 메트릭에 authz_name=audit 레이블을 추가합니다. 그래서 새 인가 정책을 다듬는 과정에서는 관측 스택에서 그 태그/레이블로 필터링해 정책에 걸리지 않는 요청을 모니터링할 수 있어요.
기본 정책의 오디트 모드 (Audit mode for default policies)
오디트 모드는 클러스터, 네임스페이스, 워크로드 수준에서도 지원됩니다. 클러스터 전체를 오디트 모드로 하려면 Linkerd 설치 시 proxy.defaultInboundPolicy=audit를 설정하고, 네임스페이스나 워크로드는 config.linkerd.io/default-inbound-policy:audit annotation을 사용하세요. 예를 들어 네임스페이스에 config.linkerd.io/default-inbound-policy:all_authenticated를 설정하고 Server가 선언되지 않았다면, 메시에 포함되지 않은 트래픽은 모두 거부됩니다. 대신 config.linkerd.io/default-inbound-policy:audit를 사용하면 메시에 포함되지 않은 트래픽은 허용되지만 위에서 설명한 대로 로그와 메트릭에 나타납니다.
더 알아보기 (Learn more)
- Authorization policy reference
- 라우트별 정책 구성 가이드: Guide to configuring per-route policy