[CKS] Pod to Pod Encryption (Cilium)
Cilium은 eBPF 기술을 활용하여 쿠버네티스 Pod 간 통신을 WireGuard나 IPSec으로 암호화합니다. 최소 오버헤드로 Zero Trust 보안을 구현하며 네트워크 정책과 모니터링을 제공합니다.
개요
아래 강의를 듣고 정리했습니다.
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/v2Cilium 전용 네트워크 정책CiliumNetworkPolicy유형endpointSelectorLabel이 지정된 파드 대상- 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에 접근하여
tcpdump→eth0패킷을 검증합니다.- 트래픽을 캡쳐했을 때 암호화가 되어있는지 확인 가능
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

- https://blog.aibox.today/ebpf-extended-berkeley-packet-filter-3/
- Cilium 공식 문서 (자세한 설치및 구성 지침 확인 가능)
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.