[CKS] Pod to Pod Encryption (Cilium)

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

개요

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

Pod - Pod 암호화

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

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

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

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

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 기반으로 암호화 및 기타 보안 작업을 실행 오버헤드가 최소입니다.

Cilium Architecture

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

Cilium Effective Encryption Policies

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간 암호화된 트래픽 검증

kubectl exec -it <pod-name> -- /bin/bash
apt-get update && apt-get install -y tcpdump
tcpdump -i eth0 -nn

정리

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

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.