[Cluster Setup and Hardening] Kubernetes 네트워크 정책: 데이터베이스 포드 보호하기

IMKUNYOUNG·2024년 7월 5일
0

CKS

목록 보기
23/70

쿠버네티스 네트워크 정책은 클러스터 내 포드 간 트래픽을 세밀하게 제어할 수 있게 해줍니다. 이번 글에서는 네트워크 정책을 사용하여 데이터베이스 포드를 보호하는 방법을 단계별로 살펴보겠습니다. 우리의 목표는 API 파드를 제외한 모든 파드가 데이터베이스 파드에 접근하지 못하도록 하고, 오직 3306 포트에서만 접근을 허용하는 것입니다.

Default 정책 설정

기본적으로, 쿠버네티스는 모든 파드에서 모든 목적지로의 트래픽을 허용합니다. 먼저, 데이터베이스 파드로의 모든 트래픽을 차단해보겠습니다.

1단계: 네트워크 정책 생성

먼저, 네트워크 정책을 생성하고 이를 데이터베이스 포드와 연관시켜야 합니다. 이를 위해 라벨과 선택자를 사용합니다. 아래는 DB 정책 네트워크 정책을 데이터베이스 포드에 연관시키는 예제입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress: []
  egress: []

이 정책은 현재 데이터베이스 포드에 대해 모든 인그레스와 이그레스 트래픽을 차단합니다.

2단계: 인그레스 규칙 추가

이제 API 포드가 데이터베이스 포드에 접근할 수 있도록 인그레스 규칙을 추가합니다. 다음은 API 포드에서 오는 트래픽을 허용하는 인그레스 규칙 예제입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: api
    ports:
    - protocol: TCP
      port: 3306
  egress: []

이 규칙은 role: api 라벨이 있는 포드가 데이터베이스 포드의 3306 포트에 접근할 수 있도록 허용합니다.

네임스페이스 간 트래픽 제어

클러스터 내에 동일한 라벨을 가진 여러 API 포드가 있지만, 다른 네임스페이스에 있는 경우도 고려해봅시다. 예를 들어, 개발, 스테이징 및 프로덕션 환경에 각각 동일한 라벨을 가진 API 포드가 있을 수 있습니다.

네임스페이스 선택자 사용

네임스페이스 선택자를 사용하여 특정 네임스페이스에서만 트래픽을 허용할 수 있습니다. 아래는 프로덕션 네임스페이스의 API 포드만 트래픽을 허용하는 예제입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
  namespace: prod
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: api
      namespaceSelector:
        matchLabels:
          environment: prod
    ports:
    - protocol: TCP
      port: 3306
  egress: []

이 정책은 environment: prod 라벨이 있는 네임스페이스 내의 role: api 라벨이 있는 포드만 트래픽을 허용합니다.

외부 IP에서의 접근 허용

쿠버네티스 클러스터 외부의 백업 서버가 데이터베이스 포드에 접근할 수 있도록 설정하려면 IP 블록 선택자를 사용합니다. 아래는 특정 IP 주소에서 오는 트래픽을 허용하는 예제입니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.5.10/32
    ports:
    - protocol: TCP
      port: 3306
  egress: []

이 정책은 IP 주소 192.168.5.10에서 오는 트래픽을 허용합니다.

이그레스 규칙 추가

마지막으로, 데이터베이스 포드에서 외부 백업 서버로의 트래픽을 허용하는 이그레스 규칙을 추가해봅시다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
  namespace: your-namespace
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: api
    ports:
    - protocol: TCP
      port: 3306
  egress:
  - to:
    - ipBlock:
        cidr: 192.168.5.10/32
    ports:
    - protocol: TCP
      port: 80

이 규칙은 데이터베이스 포드에서 외부 백업 서버의 80 포트로의 트래픽을 허용합니다.

마무리

이번 글에서는 쿠버네티스 네트워크 정책을 사용하여 데이터베이스 포드를 보호하는 방법을 살펴보았습니다.

0개의 댓글