[CKS] Pod to Pod Encryption (Cilium)

Cilium은 eBPF 기술을 활용하여 쿠버네티스 Pod 간 통신을 WireGuard나 IPSec으로 암호화합니다. 최소 오버헤드로 Zero Trust 보안을 구현하며 네트워크 정책과 모니터링을 제공합니다.

[CKS] Pod to Pod Encryption (Cilium)
Photo by Growtika / Unsplash

개요

아래 강의를 듣고 정리했습니다.

Pod - Pod 암호화

Pod 간 암호화는 중요한 보안 조치 중 하나로 통신을 암호화하여 전송되는 데이터의 기밀성, 무결성을 유지합니다.

민감한 데이터가 오가는 멀티 테넌트 환경에서 매우 중요합니다.

  • MSA 구조에서는 인증, 결제 등 서버 보안에 필수적임.
  • GDPR 및 HIPAA 같은 규정 준수 표준에 필요
  • Zero Trust 보안 모델을 지원

Pod 간 암호화를 구현하는 방법

사용 환경의 특정 요구 사항에 따라 고유한 강점을 제공합니다.

  • Mutual TLS (mTLS): Istio와 Linkerd같은 서비스 메시를 통해 구현
  • Cilium 암호화: IPSec, WIreGuard Protocol
  • Calico 암호화: IPSec을 활용

Cilium 소개

Cilium을 활용하여 Pod간 강력한 암호화를 구현할 수 있습니다.

Cilium은 컨테이너화된 애플리케이션의 네트워크 연결을 보호하는 오픈 소스 솔루션으로 MSA에 맞춰 설계되었습니다. eBPF(Extended Berkeley Packet Filter)를 사용하여 고급 네트워크 보안 정책을 적용합니다.

Cilium's Approach to Pod-to-Pod Encryption

eBPF 기법을 활용하여 최소한의 오버헤드로 처리합니다. 또한 애플리케이션 코드는 변경되지 않습니다.

  • 다양한 암호화 옵션: 여러 사용 사례에 맞는 다양한 암호화 알고리즘 제공
  • 종단 간 보안: 지속적인 암호화를 통해 데이터는 네트워크 전송 과정 전반에 걸쳐 안전하게 보호
  • 정책 기반 제어: 사용자 지정 가능한 암호화 정책을 통해 클러스터 전체의 보안을 정밀하게 관리

Monitoring and Performance Benefits

Cilium은 eBPF 기반으로 암호화 및 기타 보안 작업을 실행 오버헤드가 최소입니다.

  • 암호화: 포드 간 안전한 데이터 전송
  • ID 관리: 애플리케이션 ID를 효과적으로 추적하고 제어합니다
  • 정책 시행: 클러스터 전체에 보안 정책을 간소화하여 적용합니다

Cilium Architecture

eBPF를 활용하여 여러 기능을 사용할 수 있습니다.

  • 네트워크 정책: 무단 접근을 방지하는 정책을 시행하여 포드 간 통신을 안전하게 보호
  • 서비스 및 로드 밸런싱: 트래픽을 효율적으로 라우팅하고 포드 간에 로드를 고르게 분산하여 높은 가용성 보장
  • 대역폭 관리: 네트워크 혼잡을 방지하기 위해 포드별 트래픽 소비량 조절
  • 흐름 및 정책 로깅: 네트워크 트래픽을 실시간으로 모니터링하고 클러스터 전체의 정책 시행 현황 파악
  • 보안 및 운영 지표: 클러스터의 보안 상태와 전반적인 성능에 대한 심층적인 가시성 확보

Cilium Effective Encryption Policies

Cilium 네트워크 정책은 트래픽에 대한 암호화를 적용하기 위해 필수 구성 요소입니다.

특징은 다음과 같습니다.

  • cilium.io/v2 Cilium 전용 네트워크 정책
  • CiliumNetworkPolicy 유형
  • endpointSelector Label이 지정된 파드 대상
  • Cilium 자체를 클러스터에 설치할 때 옵션을 활성화하면 트래픽을 자동으로 암호화
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-encrypted-traffic
  #   namespace: production
spec:
  endpointSelector:
    matchLabels:
      app: myapp
  egress:
  - toEndpoints:
    - matchLabels:
        app: myapp
        # k8s:io.kubernetes.pod.namespace: backend
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP

Pod간 암호화된 트래픽 검증

  • Pod에 접근하여 tcpdumpeth0 패킷을 검증합니다.
    • 트래픽을 캡쳐했을 때 암호화가 되어있는지 확인 가능
kubectl exec -it <pod-name> -- /bin/bash
apt-get update && apt-get install -y tcpdump
tcpdump -i eth0 -nn

정리

eBPF의 동작 과정과 사례에 대해 확인 가능합니다.

  • eBPF는 Kernel Space에서 동작하며 오버헤드 최소화
    • User Space와 Kernel Space를 오가며 통신하지 않습니다.
    • iptables는 체인 방식으로 규칙 검사 → eBPF는 해시맵 기반 규칙 구성 (시간복잡도 O(1)
      • NetworkPolicy가 수백개가 되더라도 성능 저하 적음 → 정책 적용은 CNI 플러그인이 처리
      • Flannel 같은 경우 NetworkPolicy 미지원
    • 관찰 위치가 Kernel Space로 더 효율적 처리가 가능
      • 패킷 → 커널 → 복사해서 user space로 전달 → 분석 도구가 처리
      • 패킷 → 커널 (eBPF가 여기서 바로 관찰/집계) → 요약된 결과만 user space
Notion Image

Cilium Lab

Cilium 설치하기

cilium install --set encryption.enabled=true --set encryption.type=wireguard
# Add the Cilium Helm repository
helm repo add cilium https://helm.cilium.io/

# Install Cilium with encryption enabled
helm install cilium cilium/cilium --version v1.18.0-pre.0 \
  --namespace kube-system \
  --set encryption.enabled=true \
  --set encryption.type=wireguard
kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deploy.yaml
kubectl expose deployment nginx --name=nginx --port=80 --target-port=80

nginx Service로 지속적인 호출을 시도합니다.

watch kubectl exec -it curlpod -- curl -s http://nginx

cilium 파드로 접근하여 tcpdump 패킷을 캡쳐합니다.

kubectl -n kube-system exec -ti ds/cilium -- bash 
tcpdump -n -i cilium_wg0 -X

암호화가 수행되는 것을 확인

08:11:12.228088 IP 192.168.121.10.37209 > 192.168.121.50.8472: OTV, flags [I] (0x08), overlay 0, instance 14557
IP 10.0.0.174.53 > 10.0.1.173.55868: 27673*- 1/0/0 A 10.102.99.27 (96)
        0x0000:  4500 00ae c9f4 0000 4011 3cbd c0a8 790a  E.......@.<...y.
        0x0010:  c0a8 7932 9159 2118 009a 0000 0800 0000  ..y2.Y!.........
        0x0020:  0038 dd00 561f fbb2 a9d3 5e76 cf1c b244  .8..V.....^v...D
        0x0030:  0800 4500 007c ef17 4000 4011 34ff 0a00  ..E..|..@.@.4...
        0x0040:  00ae 0a00 01ad 0035 da3c 0068 16d4 6c19  .......5.<.h..l.
        0x0050:  8500 0001 0001 0000 0000 056e 6769 6e78  ...........nginx
        0x0060:  0764 6566 6175 6c74 0373 7663 0763 6c75  .default.svc.clu
        0x0070:  7374 6572 056c 6f63 616c 0000 0100 0105  ster.local......
        0x0080:  6e67 696e 7807 6465 6661 756c 7403 7376  nginx.default.sv
        0x0090:  6307 636c 7573 7465 7205 6c6f 6361 6c00  c.cluster.local.
        0x00a0:  0001 0001 0000 001e 0004 0a66 631b       ...........fc.