Calico Prometheus 엔드포인트 보안
Prometheus 메트릭이 활성화된 Calico에서는 네트워크 정책으로 메트릭 엔드포인트 접근을 제한하는 것이 좋아요. 이 문서는 deny-list 방식과 allow-list 방식 두 가지 예제 워크플로를 보여 줘요. calico/node, Typha, kube-controllers 각각에 대한 정책 예제도 함께 다뤄요.
출처: 문서
본문
Calico 메트릭 엔드포인트 접근 보안에 대해
Prometheus 메트릭을 활성화해서 Calico를 사용할 때는 네트워크 정책으로 Calico 메트릭 엔드포인트 접근을 제한하기를 권장해요.
사전 요구 사항
- Calico가 Prometheus 메트릭 보고를 활성화한 상태로 설치되어 있어요.
calicoctl이 PATH에 설치되어 데이터스토어에 접근하도록 구성되어 있어요.
방식 선택
이 가이드는 Calico Prometheus 메트릭 접근을 제한하는 네트워크 정책을 만드는 예제 워크플로 두 가지를 제공해요. 방식 선택은 요구 사항에 따라 달라져요.
-
이 방식은 기본적으로 호스트로 오가는 모든 트래픽을 허용하되, Calico 정책으로 특정 포트 접근을 제한할 수 있게 해 줘요. 특정 포트 접근만 제한하고 다른 호스트 트래픽은 그대로 둘 수 있어요.
-
이 방식은 기본적으로 호스트로 오가는 트래픽을 거부하고, 원하는 통신은 모두 네트워크 정책으로 명시적으로 허용해야 해요. 명시적으로 허용된 트래픽만 통과할 수 있어서 더 안전하지만, 호스트에서 열어야 하는 모든 포트를 알고 있어야 해요.
deny-list 방식 사용
개요
기본 절차는 다음과 같아요:
- 호스트로 오가는 트래픽을 허용하는 기본 네트워크 정책을 만들어요.
- 보호하려는 각 노드에 호스트 엔드포인트를 만들어요.
- Calico 메트릭 엔드포인트로의 원치 않는 트래픽을 거부하는 네트워크 정책을 만들어요.
- Prometheus 메트릭 접근을 허용할 레이블을 적용해요.
calico/node 예제
이 예제는 calico/node Prometheus 메트릭 엔드포인트 접근을 제한하는 방법을 보여 줘요.
-
호스트 트래픽을 허용하는 기본 네트워크 정책 만들기
먼저 기본 허용(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 -
다음 명령으로 Calico가 실행 중인 노드를 나열해요.
calicoctl get nodes이 예제에서는 클러스터에 노드가 두 개 있어요.
NAME kubeadm-master kubeadm-node-0 -
각 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 -
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 -
메트릭에 접근해야 하는 엔드포인트에 레이블 적용하기
이 시점에서
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 방식 사용
개요
기본 절차는 다음과 같아요:
- 보호하려는 각 노드에 호스트 엔드포인트를 만들어요.
- Calico 메트릭 엔드포인트로의 원하는 트래픽을 허용하는 네트워크 정책을 만들어요.
- Prometheus 메트릭 접근을 허용할 레이블을 적용해요.
calico/node 예제
-
다음 명령으로 Calico가 실행 중인 노드를 나열해요.
calicoctl get nodes이 예제에서는 클러스터에 노드가 두 개 있어요.
NAME kubeadm-master kubeadm-node-0 -
각 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.yamlSECONDARY: 이 정책을 적용한 뒤에도 Calico는 안전 장치로 일부 트래픽을 허용해요. 이 동작은 FelixConfiguration 리소스의
failsafeInboundHostPorts와failsafeOutboundHostPorts옵션으로 조정할 수 있어요. -
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 -
메트릭에 접근해야 하는 엔드포인트에 레이블 적용하기
이 시점에서
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)와 레이블 셀렉터가 이 구성의 핵심이에요.