본문 바로가기
클라우드/Cilium

🚨 당신의 쿠버네티스 방화벽, 사실은 전부 열려있을지도 모릅니다! Cilium 보안 모드 3가지 전격 해부

by gasbugs 2025. 12. 5.

안녕하세요! 쿠버네티스 환경에서 네트워크 보안을 고민하고 계신가요? 🤔 많은 분들이 eBPF 기반의 강력한 네트워킹/보안 솔루션인 Cilium을 사용하고 계실 텐데요. CiliumNetworkPolicy를 열심히 만들어서 적용했는데, "어라? 왜 정책이 적용되지 않지?" 혹은 "아무것도 안 했는데 왜 통신이 전부 막혔지?" 하는 경험, 혹시 없으신가요?

오늘은 많은 분들이 놓치기 쉬운, 하지만 클러스터 전체의 보안 수준을 결정하는 아주 중요한 설정! Cilium의 정책 적용 모드(Policy Enforcement Mode)에 대해 깊이 파헤쳐 보겠습니다. 이 설정 하나로 당신의 클러스터가 철옹성이 될 수도, 활짝 열린 대문이 될 수도 있답니다! 🚪


🌐 전체적인 그림: 보안의 시작점을 정하는 마스터 스위치

Cilium의 정책 적용 모드는 클러스터 전체에 적용되는 글로벌 설정입니다. 마치 건물의 모든 문에 대한 기본 규칙을 정하는 것과 같아요. "모든 문을 일단 잠글 것인가? (Default Deny)" 아니면 "모든 문을 일단 열어둘 것인가? (Default Allow)"를 결정하는 마스터 스위치인 셈이죠.

이 모드는 크게 3가지로 나뉘며, 각각의 동작 방식과 보안 수준이 완전히 다릅니다. 지금부터 하나씩 살펴보겠습니다.

1. always 모드: 🏰 철벽 방어! 제로 트러스트의 시작

가장 강력하고 안전한 모드입니다. 이름 그대로 항상 정책을 적용합니다.

  • 동작 방식: 클러스터 내의 모든 파드(Pod)에 대해 기본적으로 "모든 통신 차단 (Default Deny)" 정책을 적용합니다. 즉, 여러분이 명시적으로 CiliumNetworkPolicy를 통해 허용하지 않은 모든 트래픽은 가차없이 차단됩니다.
  • 비유: 모든 문이 굳게 잠겨있는 최첨단 보안 빌딩입니다. 굳게 닫힌 문을 열려면, 어떤 사람이 어떤 문으로 들어올 수 있는지 명시된 출입증(정책)이 반드시 필요합니다.
  • 언제 사용할까?:
    • 보안이 매우 중요한 프로덕션 환경
    • 처음부터 제로 트러스트(Zero Trust) 네트워크 모델을 구현하고 싶을 때
    • 실수로 인한 보안 허점을 원천 차단하고 싶을 때

주의! ⚠️ 이 모드를 갑자기 운영 환경에 적용하면, 명시적으로 허용된 정책이 없는 모든 서비스 간의 통신이 즉시 중단될 수 있습니다. 충분한 테스트와 정책 준비가 필수입니다!

2. never 모드: 🤠 자유로운 무법지대? 사실은 다 계획이 있다!

이름 그대로 정책 적용을 전혀 하지 않는 모드입니다.

  • 동작 방식: CiliumNetworkPolicy 리소스를 생성하더라도 Cilium은 이를 완전히 무시합니다. 모든 파드는 서로 자유롭게 통신할 수 있습니다. Cilium은 순수하게 CNI(네트워크 인터페이스)와 서비스 메시, 로드밸런싱 기능만 수행합니다.
  • 비유: 벽이나 문이 전혀 없는 거대한 오픈 스페이스 사무실입니다. 누구나 어디로든 자유롭게 이동할 수 있습니다.
  • 언제 사용할까?:
    • Cilium의 강력한 네트워크 정책 기능보다 eBPF 기반의 고성능 네트워킹이나 관찰 가능성(Observability) 기능에 집중하고 싶을 때
    • 네트워크 정책을 다른 보안 솔루션(예: Istio)으로 중앙 관리하고 있을 때
    • 정책 적용으로 인한 문제를 잠시 해결하고 원인을 파악해야 하는 디버깅 상황

이 모드는 '보안을 포기한다'는 의미가 아닙니다. 정책 적용 책임을 다른 곳에 위임하거나, 특정 목적을 위해 의도적으로 비활성화하는 전략적인 선택일 수 있습니다.

3. default 모드: 🤔 조건부 적용, 점진적 보안 강화의 열쇠

가장 혼란스러울 수 있지만, 가장 유연한 모드입니다. Cilium을 설치했을 때의 기본값이기도 하죠.

  • 동작 방식: 이 모드는 조건부로 동작합니다.
    1. 어떤 CiliumNetworkPolicy의 대상(Selector)으로도 선택되지 않은 파드는 모든 트래픽을 허용합니다 (Default Allow).
    2. 하나 이상의 CiliumNetworkPolicy에 의해 선택된 파드는 그 순간부터 기본적으로 모든 트래픽이 차단(Default Deny)되고, 해당 정책에 명시된 규칙에 따라서만 통신이 허용됩니다.
  • 비유: 평소에는 모든 문이 열려있는 일반적인 빌딩입니다. 하지만 특정 사무실 문 앞에 "보안 구역"이라는 팻말(정책)을 붙이는 순간, 그 사무실은 허가된 사람만 출입할 수 있는 통제 구역으로 바뀝니다. 다른 문들은 여전히 열려있습니다.
  • 공식 명칭은 아니지만...: 이 모드의 동작 방식을 가장 잘 표현하는 단어가 바로 Conditional (조건부) 입니다. 설정 파일에 conditional이라고 쓰지는 않지만, 이 단어로 기억하면 이해하기 쉽습니다.

코드로 이해하는 default 모드

이 모드가 어떻게 동작하는지 직접 확인해볼까요? Cilium 설정은 보통 cilium-config라는 ConfigMap에서 관리됩니다.

# cilium-config ConfigMap의 일부
apiVersion: v1
kind: ConfigMap
metadata:
  name: cilium-config
  namespace: kube-system
data:
  # 여기가 바로 정책 모드를 설정하는 곳입니다!
  policy-enforcement-mode: "default" # "always", "never" 로 변경 가능

이제 시나리오를 통해 default 모드의 동작을 살펴보겠습니다. frontend, backend, database 3개의 파드가 있다고 가정해봅시다.

상황 1: 아무런 정책이 없을 때

policy-enforcement-mode가 default인 상태에서는 아무런 CiliumNetworkPolicy가 없으므로, 모든 파드는 서로 자유롭게 통신할 수 있습니다.

frontend <---> backend  (O)
frontend <---> database (O)
backend  <---> database (O)

상황 2: backend를 보호하는 정책 추가

이제 backend 파드에 대해서만 들어오는(ingress) 트래픽을 제어하는 정책을 추가해 보겠습니다. frontend 파드로부터의 접근만 허용하는 정책입니다.

# raw-data: CiliumNetworkPolicy 예시
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: backend-policy
  namespace: default
spec:
  endpointSelector:
    matchLabels:
      app: backend # 🎯 이 정책은 app=backend 파드에만 적용됩니다.
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: frontend # 🔑 app=frontend 파드로부터의 접근만 허용

이 정책이 적용되는 순간, 마법 같은 변화가 일어납니다! ✨

  • backend 파드: 정책의 endpointSelector에 선택되었으므로 "보안 모드"로 전환됩니다. 이제 오직 app: frontend 레이블을 가진 파드만 backend에 접근할 수 있습니다.
  • frontend, database 파드: 어떤 정책에도 선택되지 않았으므로 여전히 "기본 허용" 상태를 유지합니다.

결과는 다음과 같습니다.

frontend ---> backend  (O, 정책에 의해 허용)
database ---> backend  (X, 정책에 의해 차단)

# frontend와 database는 정책의 대상이 아니므로 서로 자유롭게 통신 가능
frontend <---> database (O)

이처럼 default 모드는 클러스터 전체의 통신을 중단시키지 않으면서, 중요한 애플리케이션부터 점진적으로 보안을 강화해 나갈 수 있는 아주 실용적인 방법입니다.


🧐 한눈에 비교하고 올바른 선택하기

모드 동작 방식 보안 수준 추천 사용 사례
always 모든 파드 기본 차단 (Default Deny) 🔒 최상 프로덕션, 제로 트러스트 환경
default 정책에 선택된 파드만 기본 차단 (Conditional Deny) ⚠️ 중간 점진적 보안 도입, 개발/스테이징 환경
never 모든 정책 무시, 모든 트래픽 허용 (Always Allow) 🔓 없음 디버깅, 정책을 다른 툴로 관리할 때

결론: 당신의 클러스터에 맞는 옷을 입히세요

Cilium의 정책 적용 모드는 단순한 설정값 하나가 아니라, 클러스터의 전체적인 보안 철학을 결정하는 중요한 선택입니다.

  • 최고 수준의 보안을 원한다면 always
  • 점진적으로 보안을 도입하고 싶다면 default
  • 특별한 목적(디버깅 등)이 있다면 never

지금 바로 여러분의 클러스터 설정을 확인해보세요. 과연 어떤 모드로 운영되고 있나요? 이 글을 통해 여러분의 쿠버네티스 환경에 가장 적합한 보안 전략을 세우는 데 도움이 되셨기를 바랍니다! 💪