[CKS] 24. Developing Network Policies

쿠버네티스 파드 통신, 기본 허용 대신 네트워크 정책으로 보안을 강화하세요. 레이블, 네임스페이스, IP 기반으로 정교한 접근 제어가 가능합니다.

[CKS] 24. Developing Network Policies
Photo by Markus Winkler / Unsplash

개요

Kubernetes는 기본적으로 모든 파드간 통신을 허용한다는 것을 알게되었습니다.

이러한 기능으로 인해 Network Policy 정책이 필요하며, 이는 각 CNI에 따라 달라질 수 있다는 내용도 확인하였습니다. 이젠, 이러한 네트워크 정책을 어떻게 설정하는지 더 자세하게 확인해보겠습니다.

Network Policy

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

데이터베이스에서 자주 사용하는 네트워크 정책으로 특정 Label을 가진 Pod만 허용하는 규칙입니다.

또한 Ingress 트래픽이 허용된다면 Egress가 제한되더라도 정상적인 응답은 가능하므로 참고해야합니다.

  • 따라서 우리는 요청이 시작되는 방향만 신경쓰면 됩니다. 응답에 대해서는 신경쓸 필요가 없습니다.

Selector 추가

대부분의 경우 세부적이고 구체적인 제한을 사용합니다.

서로 다른 네임스페이스(dev, test, prod)에 여러 개의 API Pod가 있지만 prod 네임스페이스의 API Pod만 데이터베이스 Pod에 연결하려는 경우를 가정합니다.

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

위 구성은 파드가 두 가지 조건을 모두 만족하는 경우(AND)에만 허용됩니다. 즉 api-pod는 prod라는 네임스페이스에 존재해야한다는 점입니다.

하지만 만약 OR 조건을 원하는 경우 각각의 조건을 “-”로 분류해야합니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  ingress:
  - from:

   # 2개를 하나의 규칙으로 전달 두 개 모두 일치해야합니다.


    - podSelector:
        matchLabels:
          name: api-pod
      namespaceSelector:
        matchLabels:
          name: prod
    ## 하나의 규칙으로 전달되며 위 규칙 혹은 해당 규칙만 허용되면 됩니다.


    - ipBlock:
        cidr: 192.168.5.10/32

  ports:
  - protocol: TCP
    port: 3306

위와 같이 허용되는 경우 Label이 api-pod인 경우 혹은 ip대역이 192.168.5.10/32인 경우 허용됩니다.

위에서 봤던 모든 조건들이 ingress - from 옵션에서 지원되는 세 가지의 선택기입니다.

이것은 egress - to 또한 마찬가지입니다. 이들은 개별 규칙으로 따로 전달되거나 하나의 규칙으로써 전달될 수 있으며 각각의 구성은 AND & OR 조건으로 구분됩니다.

Reference

Hands-on

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: internal-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      name: internal
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          name: payroll
    - podSelector:
        matchLabels:
          name: mysql
    ports:
    - protocol: TCP
      port: 8080
    - protocol: TCP
      port: 3306