[Project] Multi-Tenant K8s Cluster on ARM64 - (7) Zero-Trust Network Policy - 2

developowl·2026년 3월 8일
post-thumbnail

1. [기능 설명] Egress 제어와 DNS 화이트리스팅

1-1. 주요 설계 목표

  • Egress All Deny - 나가는 문(Egress)을 모두 잠그기
    • 쿠버네티스의 기본 설정은 모든 파드가 외부와 자유롭게 통신할 수 있는 ‘Open’ 상태임/
    • 테넌트 환경에서는 보안 사고 방지를 위해 화이트리스트 전략이 필수임
  • DNS 허용 (Essential) - 이름(DNS)을 찾는 통로만 개방
    • 인터넷을 막더라도 클러스터 내부의 서비스끼리 통신하거나, 외부 주소의 IP를 알아내기 위해서는 CoreDNS 와의 통신이 반드시 필요함
      • [왜 DNS만 허용을 하는가?]
        • 모든 트래픽을 막으면 파드 내부에서 apt-get 이나 curl 명령을 입력했을 때 도메인 해석부터 실패하여 서비스 운영이 불가능해짐
      • [최소 권한의 원칙]
        • 무조건적인 통신이 아니라, 특정 포트[UDP/TCP 53] 만 개방하는 것이 핵심
  • 특정 외부망 허용 - 신뢰할 수 있는 통로만 선별
    • 모든 인터넷을 차단하더라도, 특정 업무를 위해 반드시 필요한 외부 API나 업데이트 서버는 열어주어야 함

📌 Ingress & Egress 란?

Ingress: 안으로 들어오는 길

  • 클러스터 외부에서 내부의 서비스(파드)로 들어오는 트래픽을 의미
  • [Ingress Policy]
    • 어떤 외부 IP가 우리 서버에 접속할 수 있는지 제어
    • 특정 포트만 열어두고 나머지는 닫는 설정을 함
  • 설정 예시
    • NodePort, LoadBalancer, Ingress

Egress: 밖으로 나가는 길

  • 클러스터 내부의 파드에서 외부(다른 노드, 다른 네임스페이스, 혹은 인터넷)로 나가는 트래픽을 의미
  • [Egress Policy]
    • Zero-Trust 의 핵심: 허락 없이 외부로 데이터를 보내는 것을 막음
    • 기본적으로 모든 출구를 막고(All Deny), 꼭 필요한 통로만 열어줌
  • 설정 예시
    • NetworkPolicy (Egress rule)

Egress 의 중요 포인트

  • 공격자의 경로 차단
  • 내부 전파 방지(Lateral Movement)
  • 네트워크 비용 및 리소스 낭비 방지

2. [기능 개발] Egress 격리 정책 작성

  • tenant-alpha 내의 모든 파드가 오직 DNS 만 가능하고 나머지는 모두 차단되도록 설정

2-1. Egress 격리 정의 (tenant-egress-policy.yaml)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-and-deny-egress
  namespace: tenant-alpha
spec:
  podSelector: {} # 테넌트 내 모든 파드에 적용
  policyTypes:
  - Egress
  egress:
  # 1. 클러스터 내부 DNS(CoreDNS) 통신 허용
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

3. [검증 테스트] 차단 및 허용 확인

3-1. 정책 적용

kubectl apply -f tenant-egress-policy.yaml

3-2. 외부 인터넷 차단 확인 (Egress Deny 테스트)

시나리오: tenant-alpha 내부 파드에서 8.8.8.8 로 직접 통신을 시도

kubectl exec local-tester -n tenant-alpha -- nc -zv 8.8.8.8 53 -w 2

  • 결과 → nc: 8.8.8.8 (8.8.8.8:53): Connection timed out 출력

3-3. 내부 DNS 해석 확인 (화이트리스트 테스트)

시나리오: 외부 서버의 IP는 몰라도 DNS lookup은 성공해야 함

kubectl exec local-tester -n tenant-alpha -- nslookup google.com

  • 결과 → 구글의 IP 주소들이 정상적으로 출력
profile
Don’t get mad at the computer.

0개의 댓글