Data Engineering/s3 minio

📘 [MinIO & Cilium 기반 오브젝트 스토리지 연동 시리즈 #5] Cilium L7 정책으로 HTTP 메서드 제한 실습

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

목표: Cilium의 L7(애플리케이션 레벨) 네트워크 정책을 사용해
특정 파드가 MinIO에 보낼 수 있는 HTTP 요청 메서드(GET, PUT 등) 를 제한하는 방법을 실습합니다.


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

  1. L7 레벨에서 HTTP 메서드 제한이 필요한 상황 이해
  2. Cilium L7 HTTP 정책 구성 및 적용
  3. 접근 허용/차단 결과를 테스트 파드를 통해 확인
  4. 로그 기반 검증을 통해 정책 효과 확인

📘 1단계: L7 HTTP 메서드 제한 필요성 이해

이 단계의 목적: 단순한 IP/포트 제어가 아닌, HTTP 요청의 종류(GET, PUT, DELETE 등)를
제어해야 하는 이유와 L7 정책이 필요한 상황을 이해합니다.

  • 예시 상황:
    • 분석 파드는 GET으로만 조회해야 함
    • 업로드 권한이 있는 파드는 PUT을 허용해야 함
    • 삭제 요청(DELETE)은 관리자 파드에서만 허용해야 함

☑️ 이러한 요청 유형별 제어는 L7(애플리케이션 계층) 정책을 통해 구현할 수 있습니다.


⚙️ 2단계: Cilium L7 정책 구성 및 배포

이 단계의 목적: GET 메서드만 허용하는 Cilium L7 정책을 작성하고
특정 네임스페이스 파드에 적용하여 정책 기반 접근 제어를 구성합니다.

# l7-get-only-policy.yaml
apiVersion: "cilium.io/v2"                         # Cilium Network Policy의 API 버전
kind: CiliumNetworkPolicy                          # 리소스 종류는 CiliumNetworkPolicy
metadata:
  name: allow-only-get                             # 정책 이름 (고유해야 함)
  namespace: etl                                   # 이 정책을 적용할 네임스페이스 지정
spec:
  endpointSelector: {}                             # etl 네임스페이스 내 모든 파드를 대상으로 적용
  egress:                                          # egress(외부로 나가는 요청)에 대한 제어 설정
  - toEndpoints:
    - matchLabels:
        app.kubernetes.io/name: minio              # 목적지가 MinIO 서비스인 경우만 해당
    toPorts:
    - ports:
      - port: "9000"                               # MinIO 서비스 포트
        protocol: TCP                              # TCP 프로토콜로 통신
      rules:
        http:                                      # HTTP 레벨(L7) 정책 정의
        - method: "GET"                            # GET 메서드만 허용, 다른 메서드는 차단됨
# 위 정책 파일 적용
kubectl apply -f l7-get-only-policy.yaml

🧪 3단계: 접근 테스트 (허용 및 차단 확인)

이 단계의 목적: GET 요청은 허용되고, PUT 요청은 차단되는지 실제로 테스트하여
L7 정책이 의도대로 작동하는지 검증합니다.

# ✅ GET 요청 테스트 (허용되어야 함)
kubectl exec -it test-client -n etl -- \
  curl -I http://minio.minio.svc.cluster.local:9000
# -I 옵션은 HTTP 헤더만 요청 (HEAD 요청과 유사) → 메서드 제어 확인용
# ❌ PUT 요청 테스트 (차단되어야 함)
kubectl exec -it test-client -n etl -- \
  curl -X PUT http://minio.minio.svc.cluster.local:9000/test.txt -d "test-data"
# -X PUT: PUT 메서드 사용
# -d "test-data": 업로드할 바디 데이터 포함
# 응답이 timeout, 403, 000 등의 결과일 경우 차단됨

🔍 4단계: 로그 기반 정책 효과 확인

이 단계의 목적: Hubble 또는 Cilium CLI를 사용해 L7 정책이 적용된 요청의 흐름을 추적하고,
실제로 DROP 또는 FORWARDED로 처리되는지 확인합니다.

# Cilium Monitor로 Drop된 요청 확인
cilium monitor -n etl | grep DROP
# DROP 로그가 출력되면 정책에 의해 요청이 차단된 것

# Hubble CLI를 통한 흐름 시각화
hubble observe --namespace etl --protocol http
# etl 네임스페이스에서 발생한 HTTP 요청 흐름을 실시간 확인 가능

📎 요약 및 핵심 정리

  • Cilium의 L7 정책을 사용해 HTTP 요청 메서드(GET, PUT 등)를 세밀하게 제어할 수 있음을 실습을 통해 확인함
  • endpointSelector: {}를 사용하여 네임스페이스 전체 파드를 대상으로 설정할 수 있었음
  • toEndpoints, toPorts, rules.http.method 구문을 통해 목적지와 요청 유형을 명확하게 지정함
  • 허용된 GET 요청과 차단된 PUT 요청을 비교 테스트하고, Hubble로 흐름 추적까지 수행함

 

728x90