Data Engineering/s3 minio

📘 [MinIO & Cilium 기반 오브젝트 스토리지 연동 시리즈 #4] Cilium L3/L4 정책으로 MinIO 접근 제한 실습

ygtoken 2025. 3. 26. 17:48
728x90

목표: Cilium의 L3/L4 NetworkPolicy를 사용하여 MinIO 서비스에 접근할 수 있는 Pod를 제한하고,
네트워크 정책이 실제로 작동하는지 검증하는 실습을 진행합니다.


🔎 이번 글에서 수행할 작업 요약

  1. MinIO에 자유롭게 접근할 수 있는 테스트 클라이언트 파드 생성
  2. Cilium L3/L4 네트워크 정책을 적용하여 접근 제어 구성
  3. 접근 가능/불가능한 사례 비교 테스트
  4. 네트워크 정책 동작 여부 검증

🧱 1단계: 테스트 클라이언트 파드 생성

이 단계의 목적: MinIO에 curl 등을 통해 접근할 수 있는 일반적인 테스트 파드를 생성하고,
네트워크 정책 적용 전의 기본 동작을 확인합니다.

# test-client.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-client
  namespace: etl                         # 테스트를 위한 별도 네임스페이스
  labels:
    role: client                         # 이후 네트워크 정책에서 활용할 라벨
spec:
  containers:
  - name: curl
    image: curlimages/curl               # 가볍게 테스트 가능한 curl 전용 이미지
    command: ["sleep", "3600"]           # 파드를 1시간 동안 유지
kubectl apply -f test-client.yaml
# MinIO 접근 테스트
kubectl exec -it test-client -n etl -- \
  curl -s -o /dev/null -w "%{http_code}" http://minio.minio.svc.cluster.local:9000

✅ 기본적으로 모든 파드는 네트워크 제한 없이 MinIO에 접근 가능함


🔒 2단계: Cilium L3/L4 네트워크 정책 작성 및 적용

이 단계의 목적: 특정 네임스페이스와 라벨을 기반으로
MinIO 서비스로의 접근을 제한하는 정책을 정의하고 적용합니다.

# minio-deny-all.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: deny-all
  namespace: minio
spec:
  endpointSelector: {}                             # MinIO 전체 Pod 대상으로 설정
  ingress: []                                      # ingress 비워서 모든 수신 차단
# minio-allow-etl-client.yaml
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: allow-etl-client
  namespace: minio
spec:
  endpointSelector:
    matchLabels:
      app.kubernetes.io/name: minio                 # MinIO 서비스 대상
  ingress:
  - fromEndpoints:
    - matchLabels:
        role: client                                # etl 네임스페이스 test-client의 라벨 기반 허용
      matchExpressions:
      - key: "k8s:io.kubernetes.pod.namespace"
        operator: In
        values:
        - etl                                       # etl 네임스페이스에서만 허용
    toPorts:
    - ports:
      - port: "9000"
        protocol: TCP
# 네트워크 정책 적용
kubectl apply -f minio-deny-all.yaml
kubectl apply -f minio-allow-etl-client.yaml

🔍 3단계: 접근 테스트 및 검증

이 단계의 목적: 정책 적용 후 접근이 정상적으로 제한되는지, 허용된 Pod만 접근 가능한지를 테스트합니다.

# 허용된 etl 네임스페이스의 test-client → 접근 가능
kubectl exec -it test-client -n etl -- \
  curl -s -o /dev/null -w "%{http_code}" http://minio.minio.svc.cluster.local:9000

 

예상 결과:

403

🔍 MinIO 자체 인증이 걸려 있으므로 403이 뜨는 건 접근에는 성공한 것

# 다른 네임스페이스에서 테스트 (예: default)
kubectl run other-client -n default --rm -it --image=curlimages/curl -- \
  curl -s -o /dev/null -w "%{http_code}" http://minio.minio.svc.cluster.local:9000

 

예상 결과:

Connection timed out 또는 000

✅ 접근이 완전히 차단되었음을 의미


📎 요약 및 핵심 정리

  • Cilium의 L3/L4 정책을 사용하여 네트워크 레이어에서 MinIO에 대한 접근을 세분화해 제어할 수 있음
  • 기본적으로 모든 Pod가 MinIO에 접근 가능한 상태에서 시작하여, deny-all 정책으로 모든 요청을 차단
  • 이후 특정 네임스페이스 및 라벨을 가진 Pod만 포트 9000으로 접근 가능하도록 허용
  • 실질적인 네트워크 보안을 서비스 단위로 구성할 수 있는 구조를 학습함

 

728x90