Deny(거부) 정책

Deny(거부) 정책

Cilium 1.9부터 기본으로 제공되는 Deny 정책이 파드로/파드로부터의 특정 트래픽을 어떻게 명시적으로 제한하는지 설명하는 문서예요. Allow 정책보다 우선한다는 점이 핵심이에요.

출처: Deny Policies

본문

Deny 정책은 Cilium 1.9부터 기본으로 제공·활성화되며, 파드로/파드로부터의 특정 트래픽을 명시적으로 제한할 수 있게 해 줘요.

Deny 정책은 Allow 정책보다 우선해요. 그것이 Cilium Network Policy든, Clusterwide Cilium Network Policy든, 심지어 Kubernetes Network Policy든 관계없이요.

"allow" 정책과 마찬가지로, 파드는 어떤 정책 하나가 이를 선택하는 즉시 default-deny 모드로 들어가요.

같은 파드에 여러 allow/deny 정책이 적용되면 다음 표는 해당 파드에 대해 기대되는 시행 결과를 보여줘요.

서버 파드에 배포된 Ingress 정책 집합
Allow 정책
Layer 7 (HTTP) ✓ ✓ ✓ ✓
Layer 4 (80/TCP) ✓ ✓ ✓ ✓
Layer 4 (81/TCP) ✓ ✓ ✓ ✓
Layer 3 (Pod: Client) ✓ ✓ ✓ ✓
Deny 정책
Layer 4 (80/TCP) ✓ ✓ ✓
Layer 3 (Pod: Client) ✓ ✓
트래픽 연결 결과 (허용/거부)
Client → Server curl server:81 Allowed Allowed Denied Denied
curl server:80 Allowed Denied Denied Denied
ping server Allowed Allowed Denied Denied

위 표의 두 번째 열을 고른다면, 맨 아래 부분은 클라이언트와 서버 사이에서 curl 또는 ping 트래픽을 선택하는 정책의 전달 동작을 보여줘요.

  • 81 포트로의 curl은 허용돼요. 81 포트에 allow 정책이 있고 해당 포트에 deny 정책이 없기 때문이에요.
  • 80 포트로의 curl은 거부돼요. 해당 포트에 deny 정책이 있기 때문이에요.
  • 서버로의 ping은 허용돼요. Layer 3 allow 정책이 있고 deny가 없기 때문이에요.

다음 정책은 해당 클러스터에서 Cilium이 관리하는 모든 네임스페이스의 모든 파드에 "world"로부터의 ingress를 거부해요. 이 정책은 "world"를 제외한 모든 곳에서 오는 트래픽을 허용하고 있으므로, 기존의 클러스터 내부 간 정책은 여전히 허용돼요.

apiVersion: "cilium.io/v2"
kind: CiliumClusterwideNetworkPolicy
metadata:
  name: "external-lockdown"
spec:
  endpointSelector: {}
  ingressDeny:
  - fromEntities:
    - "world"
  ingress:
  - fromEntities:
    - "all"

Deny 정책이 지원하지 않는 것은 다음과 같아요. L7에서의 정책 시행, 즉 URL을 구체적으로 거부하는 것과 toFQDNs, 즉 특정 도메인 이름으로의 트래픽을 구체적으로 거부하는 것이에요.

더 알아보기 (Learn more)