본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Calico Prometheus 엔드포인트 보안

원문 보기 위키 갱신

Prometheus 메트릭이 활성화된 Calico에서는 네트워크 정책으로 메트릭 엔드포인트 접근을 제한하는 것이 좋아요. 이 문서는 deny-list 방식과 allow-list 방식 두 가지 예제 워크플로를 보여 줘요. calico/node, Typha, kube-controllers 각각에 대한 정책 예제도 함께 다뤄요.

출처: 문서

본문

Calico 메트릭 엔드포인트 접근 보안에 대해

Prometheus 메트릭을 활성화해서 Calico를 사용할 때는 네트워크 정책으로 Calico 메트릭 엔드포인트 접근을 제한하기를 권장해요.

사전 요구 사항

방식 선택

이 가이드는 Calico Prometheus 메트릭 접근을 제한하는 네트워크 정책을 만드는 예제 워크플로 두 가지를 제공해요. 방식 선택은 요구 사항에 따라 달라져요.

  • deny-list 방식 사용

    이 방식은 기본적으로 호스트로 오가는 모든 트래픽을 허용하되, Calico 정책으로 특정 포트 접근을 제한할 수 있게 해 줘요. 특정 포트 접근만 제한하고 다른 호스트 트래픽은 그대로 둘 수 있어요.

  • allow-list 방식 사용

    이 방식은 기본적으로 호스트로 오가는 트래픽을 거부하고, 원하는 통신은 모두 네트워크 정책으로 명시적으로 허용해야 해요. 명시적으로 허용된 트래픽만 통과할 수 있어서 더 안전하지만, 호스트에서 열어야 하는 모든 포트를 알고 있어야 해요.

deny-list 방식 사용

개요

기본 절차는 다음과 같아요:

  1. 호스트로 오가는 트래픽을 허용하는 기본 네트워크 정책을 만들어요.
  2. 보호하려는 각 노드에 호스트 엔드포인트를 만들어요.
  3. Calico 메트릭 엔드포인트로의 원치 않는 트래픽을 거부하는 네트워크 정책을 만들어요.
  4. Prometheus 메트릭 접근을 허용할 레이블을 적용해요.

calico/node 예제

이 예제는 calico/node Prometheus 메트릭 엔드포인트 접근을 제한하는 방법을 보여 줘요.

  1. 호스트 트래픽을 허용하는 기본 네트워크 정책 만들기

    먼저 기본 허용(default-allow) 정책을 만들어요. 나중에 호스트 엔드포인트를 추가할 때 연결이 끊기는 것을 막으려고 이걸 먼저 해야 해요. 정책이 없는 호스트 엔드포인트는 기본적으로 거부되거든요.

    이렇게 하려면 다음 내용으로 default-host-policy.yaml 파일을 만드세요.

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: default-host
    spec:
      # Select all Calico nodes.
      selector: running-calico == "true"
      order: 5000
      ingress:
        - action: Allow
      egress:
        - action: Allow
    

    그다음 calicoctl로 이 정책을 적용해요.

    calicoctl apply -f default-host-policy.yaml
    
  2. 다음 명령으로 Calico가 실행 중인 노드를 나열해요.

    calicoctl get nodes
    

    이 예제에서는 클러스터에 노드가 두 개 있어요.

    NAME
    kubeadm-master
    kubeadm-node-0
    
  3. 각 Calico 노드에 호스트 엔드포인트 만들기

    위에서 나열한 각 노드에 대한 호스트 엔드포인트가 담긴 host-endpoints.yaml 파일을 만드세요. 이 예제에서는 내용이 다음과 같아요.

    apiVersion: projectcalico.org/v3
    kind: HostEndpoint
    metadata:
      name: kubeadm-master.eth0
      labels:
        running-calico: 'true'
    spec:
      node: kubeadm-master
      interfaceName: eth0
      expectedIPs:
        - 10.100.0.15
    ---
    apiVersion: projectcalico.org/v3
    kind: HostEndpoint
    metadata:
      name: kubeadm-node-0.eth0
      labels:
        running-calico: 'true'
    spec:
      node: kubeadm-node-0
      interfaceName: eth0
      expectedIPs:
        - 10.100.0.16
    

    이 파일에서 eth0을 각 노드에서 원하는 인터페이스 이름으로 바꾸고, expectedIPs 부분에 그 인터페이스의 IP 주소를 채워 넣으세요.

    이 호스트 엔드포인트가 Calico를 실행 중임을 나타내는 레이블이 쓰인 점에 주목하세요. 이 레이블은 1단계에서 만든 네트워크 정책의 셀렉터와 일치해요.

    그다음 calicoctl로 다음 명령을 사용해 호스트 엔드포인트를 적용해요.

    calicoctl apply -f host-endpoints.yaml
    
  4. calico/node Prometheus 메트릭 포트 접근을 제한하는 네트워크 정책 만들기

    이제 Prometheus 메트릭 포트 접근을 제한하는 네트워크 정책을 만들어 볼게요. calico-prometheus-access: true 레이블이 있는 엔드포인트만 메트릭에 접근할 수 있도록 하는 거죠.

    이렇게 하려면 다음 내용으로 calico-prometheus-policy.yaml 파일을 만드세요.

    # Allow traffic to Prometheus only from sources that are
    # labeled as such, but don't impact any other traffic.
    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: restrict-calico-node-prometheus
    spec:
      # Select all Calico nodes.
      selector: running-calico == "true"
      order: 500
      types:
        - Ingress
      ingress:
        # Deny anything that tries to access the Prometheus port
        # but that doesn't match the necessary selector.
        - action: Deny
          protocol: TCP
          source:
            notSelector: calico-prometheus-access == "true"
          destination:
            ports:
              - 9091
    

    이 정책은 running-calico: true 레이블이 있는 모든 엔드포인트를 선택하고, ingress 거부 규칙 하나를 적용해요. 이 ingress 규칙은 트래픽 소스에 calico-prometheus-access: true 레이블이 없는 한 포트 9091로의 트래픽을 거부해요. 즉, 레이블이 없는 모든 Calico 워크로드 엔드포인트, 호스트 엔드포인트, 글로벌 네트워크 셋과 Calico가 모르는 다른 네트워크 엔드포인트가 모두 거부 대상이에요.

    그다음 calicoctl로 이 정책을 적용해요.

    calicoctl apply -f calico-prometheus-policy.yaml
    
  5. 메트릭에 접근해야 하는 엔드포인트에 레이블 적용하기

    이 시점에서 calico-prometheus-access: true 레이블이 있는 엔드포인트만 각 노드의 Calico Prometheus 메트릭 엔드포인트에 도달할 수 있어요. 접근을 허용하려면 원하는 엔드포인트에 이 레이블을 추가하기만 하면 돼요.

    예를 들어 쿠버네티스 pod에 접근을 허용하려면 다음 명령을 실행해요.

    kubectl label pod my-prometheus-pod calico-prometheus-access=true
    

    특정 IP 네트워크에 접근을 허용하고 싶다면 calicoctl로 글로벌 네트워크 셋을 만들면 돼요.

    예를 들어 관리 서브넷에 접근을 허용하고 싶을 수 있어요.

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkSet
    metadata:
      name: calico-prometheus-set
      labels:
        calico-prometheus-access: 'true'
    spec:
      nets:
        - 172.15.0.0/24
        - 172.101.0.0/24
    

Typha 배포를 위한 추가 단계

Calico 설치가 쿠버네티스 API 데이터스토어를 사용하고 노드가 50개를 넘는다면 Typha를 설치했을 가능성이 높아요. 이 섹션에서는 추가 네트워크 정책으로 Typha Prometheus 엔드포인트를 보호하는 방법을 보여 줘요.

위 단계를 마친 뒤 다음 내용으로 typha-prometheus-policy.yaml 파일을 만드세요.

# Allow traffic to Prometheus only from sources that are
# labeled as such, but don't impact any other traffic.
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: restrict-calico-node-prometheus
spec:
  # Select all Calico nodes.
  selector: running-calico == "true"
  order: 500
  types:
    - Ingress
  ingress:
    # Deny anything that tries to access the Prometheus port
    # but that doesn't match the necessary selector.
    - action: Deny
      protocol: TCP
      source:
        notSelector: calico-prometheus-access == "true"
      destination:
        ports:
          - 9093

이 정책은 running-calico: true 레이블이 있는 모든 엔드포인트를 선택하고, ingress 거부 규칙 하나를 적용해요. 이 ingress 규칙은 트래픽 소스에 calico-prometheus-access: true 레이블이 없는 한 포트 9093으로의 트래픽을 거부해요. 즉, 레이블이 없는 모든 Calico 워크로드 엔드포인트, 호스트 엔드포인트, 글로벌 네트워크 셋과 Calico가 모르는 다른 네트워크 엔드포인트가 모두 거부 대상이에요.

그다음 calicoctl로 이 정책을 적용해요.

calicoctl apply -f typha-prometheus-policy.yaml

kube-controllers 예제

Calico 설치가 kube-controllers의 메트릭을 노출한다면 다음 네트워크 정책으로 그 메트릭 접근을 제한할 수 있어요.

다음 내용으로 kube-controllers-prometheus-policy.yaml 파일을 만드세요.

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: restrict-kube-controllers-prometheus
  namespace: calico-system
spec:
  # Select kube-controllers.
  selector: k8s-app == "calico-kube-controllers"
  order: 500
  types:
    - Ingress
  ingress:
    # Deny anything that tries to access the Prometheus port
    # but that doesn't match the necessary selector.
    - action: Deny
      protocol: TCP
      source:
        notSelector: calico-prometheus-access == "true"
      destination:
        ports:
          - 9094

SECONDARY: 위 정책은 calico-system 네임스페이스에 설치돼요. 클러스터에 Calico가 kube-system 네임스페이스에 설치되어 있다면 대신 그 네임스페이스에 정책을 만들어야 해요.

그다음 calicoctl로 이 정책을 적용해요.

calicoctl apply -f kube-controllers-prometheus-policy.yaml

allow-list 방식 사용

개요

기본 절차는 다음과 같아요:

  1. 보호하려는 각 노드에 호스트 엔드포인트를 만들어요.
  2. Calico 메트릭 엔드포인트로의 원하는 트래픽을 허용하는 네트워크 정책을 만들어요.
  3. Prometheus 메트릭 접근을 허용할 레이블을 적용해요.

calico/node 예제

  1. 다음 명령으로 Calico가 실행 중인 노드를 나열해요.

    calicoctl get nodes
    

    이 예제에서는 클러스터에 노드가 두 개 있어요.

    NAME
    kubeadm-master
    kubeadm-node-0
    
  2. 각 Calico 노드에 호스트 엔드포인트 만들기

    위에서 나열한 각 노드에 대한 호스트 엔드포인트가 담긴 host-endpoints.yaml 파일을 만드세요. 이 예제에서는 내용이 다음과 같아요.

    apiVersion: projectcalico.org/v3
    kind: HostEndpoint
    metadata:
      name: kubeadm-master.eth0
      labels:
        running-calico: 'true'
    spec:
      node: kubeadm-master
      interfaceName: eth0
      expectedIPs:
        - 10.100.0.15
    ---
    apiVersion: projectcalico.org/v3
    kind: HostEndpoint
    metadata:
      name: kubeadm-node-0.eth0
      labels:
        running-calico: 'true'
    spec:
      node: kubeadm-node-0
      interfaceName: eth0
      expectedIPs:
        - 10.100.0.16
    

    이 파일에서 eth0을 각 노드에서 원하는 인터페이스 이름으로 바꾸고, expectedIPs 부분에 그 인터페이스의 IP 주소를 채워 넣으세요.

    이 호스트 엔드포인트가 Calico를 실행 중임을 나타내는 레이블이 쓰인 점에 주목하세요. 이 레이블은 1단계에서 만든 네트워크 정책의 셀렉터와 일치해요.

    그다음 calicoctl로 다음 명령을 사용해 호스트 엔드포인트를 적용해요. 이 명령을 실행하면 호스트 엔드포인트로 오가는 모든 트래픽이 차단돼요.

    calicoctl apply -f host-endpoints.yaml
    

    SECONDARY: 이 정책을 적용한 뒤에도 Calico는 안전 장치로 일부 트래픽을 허용해요. 이 동작은 FelixConfiguration 리소스의 failsafeInboundHostPorts와 failsafeOutboundHostPorts 옵션으로 조정할 수 있어요.

  3. calico/node Prometheus 메트릭 포트 접근을 허용하는 네트워크 정책 만들기

    이제 calico-prometheus-access: true 레이블이 있는 엔드포인트만 메트릭에 접근할 수 있도록, Prometheus 메트릭 포트 접근을 허용하는 네트워크 정책을 만들어 볼게요.

    이렇게 하려면 다음 내용으로 calico-prometheus-policy.yaml 파일을 만드세요.

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: restrict-calico-node-prometheus
    spec:
      # Select all Calico nodes.
      selector: running-calico == "true"
      order: 500
      types:
        - Ingress
      ingress:
        # Allow traffic from selected sources to the Prometheus port.
        - action: Allow
          protocol: TCP
          source:
            selector: calico-prometheus-access == "true"
          destination:
            ports:
              - 9091
    

    이 정책은 running-calico: true 레이블이 있는 모든 엔드포인트를 선택하고, ingress 허용 규칙 하나를 적용해요. 이 ingress 규칙은 calico-prometheus-access: true 레이블이 있는 소스에서 오는 포트 9091 트래픽을 허용해요. 즉, 레이블이 있는 모든 Calico 워크로드 엔드포인트, 호스트 엔드포인트, 글로벌 네트워크 셋이 접근을 허용받아요.

    그다음 calicoctl로 이 정책을 적용해요.

    calicoctl apply -f calico-prometheus-policy.yaml
    
  4. 메트릭에 접근해야 하는 엔드포인트에 레이블 적용하기

    이 시점에서 calico-prometheus-access: true 레이블이 있는 엔드포인트만 각 노드의 Calico Prometheus 메트릭 엔드포인트에 도달할 수 있어요. 접근을 허용하려면 원하는 엔드포인트에 이 레이블을 추가하기만 하면 돼요.

    예를 들어 쿠버네티스 pod에 접근을 허용하려면 다음 명령을 실행해요.

    kubectl label pod my-prometheus-pod calico-prometheus-access=true
    

    네트워크의 특정 IP 주소에 접근을 허용하고 싶다면 calicoctl로 글로벌 네트워크 셋을 만들면 돼요.

    예를 들어 다음 네트워크 셋을 만들면 IP가 172.15.0.101인 호스트에 접근을 허용해요.

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkSet
    metadata:
      name: calico-prometheus-set
      labels:
        calico-prometheus-access: 'true'
    spec:
      nets:
        - 172.15.0.101/32
    

Typha 배포를 위한 추가 단계

Calico 설치가 쿠버네티스 API 데이터스토어를 사용하고 노드가 50개를 넘는다면 Typha를 설치했을 가능성이 높아요. 이 섹션에서는 추가 네트워크 정책으로 Typha Prometheus 엔드포인트를 보호하는 방법을 보여 줘요.

위 단계를 마친 뒤 다음 내용으로 typha-prometheus-policy.yaml 파일을 만드세요.

apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: restrict-typha-prometheus
spec:
  # Select all Calico nodes.
  selector: running-calico == "true"
  order: 500
  types:
    - Ingress
  ingress:
    - action: Allow
      protocol: TCP
      source:
        selector: calico-prometheus-access == "true"
      destination:
        ports:
          - 9093

이 정책은 running-calico: true 레이블이 있는 모든 엔드포인트를 선택하고, ingress 허용 규칙 하나를 적용해요. 이 ingress 규칙은 calico-prometheus-access: true 레이블이 있는 소스에서 오는 포트 9093 트래픽을 허용해요. 즉, 레이블이 있는 모든 Calico 워크로드 엔드포인트, 호스트 엔드포인트, 글로벌 네트워크 셋이 접근을 허용받아요.

그다음 calicoctl로 이 정책을 적용해요.

calicoctl apply -f typha-prometheus-policy.yaml

kube-controllers 예제

Calico 설치가 kube-controllers의 메트릭을 노출한다면 다음 네트워크 정책으로 그 메트릭 접근을 제한할 수 있어요.

다음 내용으로 kube-controllers-prometheus-policy.yaml 파일을 만드세요.

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: restrict-kube-controllers-prometheus
  namespace: calico-system
spec:
  selector: k8s-app == "calico-kube-controllers"
  order: 500
  types:
    - Ingress
  ingress:
    - action: Allow
      protocol: TCP
      source:
        selector: calico-prometheus-access == "true"
      destination:
        ports:
          - 9094

그다음 calicoctl로 이 정책을 적용해요.

calicoctl apply -f kube-controllers-prometheus-policy.yaml

더 알아보기 (Learn more)

deny-list 방식은 기본 허용 후 특정 포트만 거부하고, allow-list 방식은 기본 거부 후 필요한 통신만 허용해요. 노드가 50개를 넘으면 Typha의 9093 포트도 같은 패턴으로 보호하세요. 정책 적용 순서(order)와 레이블 셀렉터가 이 구성의 핵심이에요.