Kubernetes의 애플리케이션을 위한 방화벽

8567 단어 securitykubernetes
https://www.prabhujayakumar.dev에서 원래 게시됨


이 블로그에서는 클러스터에서 실행되는 애플리케이션의 보안을 개선하기 위한 kubernetes 기능을 살펴보겠습니다.

kubernetes 클러스터에서는 각 애플리케이션에 대해 여러 복제본을 사용하여 많은 애플리케이션을 실행할 수 있습니다. 기본적으로 모든 포드는 동일한 클러스터에서 실행 중인 다른 포드와 통신할 수 있습니다.



그러나 그러한 기능을 허용하지 않는 것이 좋습니다. 침입자가 포드에 액세스할 수 있는 경우 침입자는 손상된 포드 내부에서 모든 포드에 액세스할 수 있습니다. 따라서 클러스터 내에서 트래픽(수신 및 송신 모두)을 허용할지 또는 거부할지 결정할 수 있는 애플리케이션용 방화벽이 필요합니다.



kubernetes 클러스터에서 실행되는 애플리케이션을 위한 방화벽을 만드는 데 도움이 되는 구세주Network Policy가 등장합니다.

이러한 방화벽의 필요성과 몇 가지 예를 통해 네트워크 정책이 어떻게 도움이 되는지 이해해 봅시다.

방명록



다음과 같이 3개의 다른 구성 요소가 있는 응용 프로그램Guestbook을 고려하십시오.
  • guestbook-ui(프론트엔드)
  • guestbook-api(백엔드)
  • 방명록-db(db)

  • 이러한 구성 요소 간에 예상되는 통신은 ui가 api와 통신하고 api가 db와 통신하는 것과 같습니다.



    그러나 방명록 응용 프로그램의 이러한 모든 구성 요소가 kubernetes 클러스터에서 실행될 때 기술적으로 ui 구성 요소는 기본적으로 db와 통신할 수 있습니다.



    네트워크 정책을 사용하여 클러스터의 애플리케이션에 대한 방화벽 설정



    As network policy is a feature that should be implemented by the network plugin, ensure that your network plugin supports NetworkPolicy resource. Creating NetworkPolicy resource without such plugin will have no effect. Calico, Cilium, Kube-router, Romana and Weave Net are some of the network plugins that support network policy



    첫 번째 단계로 모든 네임스페이스에서 다음과 같이 네트워크 정책을 생성하여 kubernetes 클러스터에서 실행 중인 모든 포드 간의 모든 통신을 허용하는 기본 동작을 비활성화합니다.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: deny-all
    spec:
      podSelector: {}
      ingress: {}
    


    이제 어떤 포드도 kubernetes 클러스터에서 실행 중인 다른 포드와 통신할 수 없습니다. 이제 요구 사항에 따라 클러스터의 포드에 대한 수신/발신 트래픽을 허용합니다.

    방명록 애플리케이션의 경우 guestbook-api 팟으로의 수신 트래픽을 허용하고 guestbook-ui 팟에서만 수신 트래픽을 허용하려면 다음과 같이 네트워크 정책을 생성하십시오.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-ui-to-api
    spec:
      podSelector: 
        matchLabels: 
          app: guestbook-api
          tier: backend   
      ingress:
      - from:
          podSelector:
            matchLabels:
              app: guestbook-ui
              tier: frontend
    


    그리고 guestbook-db 포드로의 인그레스 트래픽을 허용하고 guestbook-api 포드에서만 허용하려면 다음과 같이 네트워크 정책을 생성합니다.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-api-to-db
    spec:
      podSelector: 
        matchLabels: 
          app: guestbook-db
          tier: db   
      ingress:
      - from:
          podSelector:
            matchLabels:
              app: guestbook-api
              tier: backend
    


    이러한 네트워크 정책을 사용한 최종 설정은 포드 간의 유효한 통신만 허용합니다.



    네트워크 정책에 대해 자세히 알아보기



    네임스페이스 선택기



    일부 시나리오에서는 네임스페이스의 모든 포드에서 수신을 허용해야 합니다. 예를 들어 모든 애플리케이션 포드는 monitoring 네임스페이스에 있는 모든 포드의 수신을 허용해야 합니다. 네임스페이스 선택기를 사용하여 다음과 같이 이 설정을 쉽게 수행할 수 있습니다.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-monitoring-namespace
    spec:
      podSelector: {} ## applies to all pods in the namespace
      ingress:
      - from:
          namespaceSelector:
            matchLabels:
              team: monitoring ## labels of the monitoring namespace
    


    IP 차단



    레이블뿐만 아니라 네트워크 정책에서도 IP 블록을 사용하여 구성할 수 있습니다. 다음 네트워크 정책은 10.72.X.X에서 수신을 허용하지만 10.72.10.X에서 트래픽을 차단합니다.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: allow-using-ip
    spec:
      podSelector: {}
      ingress:
      - from:
          ipBlock:
            cidr: 10.72.0.0/16
            except: 10.72.10.0/8
    


    결론



    k8s 클러스터의 모든 수준에서 보안을 유지하는 것이 좋습니다. kubernetes 클러스터의 애플리케이션 포드에 대한 방화벽을 추가하면 공격 표면을 줄여 보안 수준을 높일 수 있으므로 적극 권장됩니다.

    좋은 웹페이지 즐겨찾기