정책에서 외부 IP 또는 네트워크 규칙 사용하기
Calico 네트워크 정책으로 외부의 Calico가 아닌 워크로드나 네트워크와 주고받는 트래픽을 제한하는 방법을 다뤄요. 정책 안에 IP/CIDR을 직접 쓰는 방법과, 재사용 가능한 네트워크 셋(network set)을 만들어 쓰는 방법 두 가지를 소개해요. 서드파티 API와 SaaS 연동을 안전하게 열어 주고 싶을 때 유용한 가이드예요.
출처: 문서
본문
큰 그림
Calico 네트워크 정책을 사용해 외부의 Calico가 아닌 워크로드나 네트워크와 주고받는 트래픽을 제한해요.
가치
현대적인 애플리케이션은 Kubernetes 클러스터 밖에 있는 서드파티 API와 SaaS 서비스와 연동하는 경우가 많아요. 이런 연동을 안전하게 열어 주려면, 네트워크 보안 팀이 워크로드의 egress와 ingress 트래픽 IP 대역을 제한할 수 있어야 해요. IP 목록이나 대역을 사용해 악성 행위자나 제재 대상 국가를 deny-list에 올리는 것도 포함돼요.
Calico 네트워크 정책을 사용하면 정책 안에 IP 주소/CIDR을 직접 정의해 외부 네트워크로의 트래픽을 제한할 수 있어요. 또는 Calico 네트워크 셋을 사용하면 같은 IP 집합을 여러 정책에서 재사용하며 쉽게 확장할 수 있어요.
개념
IP 주소/CIDR
IP 주소와 CIDR은 Kubernetes와 Calico 네트워크 정책 규칙 모두에 직접 지정할 수 있어요. Calico 네트워크 정책은 IPv4와 IPv6 CIDR을 지원해요.
네트워크 셋
network set 리소스는 Kubernetes 또는 Calico 네트워크 정책에서 표준 레이블 셀렉터로 매칭할 수 있는, 임의의 IP 서브넷/CIDR 집합이에요. 네임스페이스 스코프의 네트워크 정책 리소스에서 셀렉터로 IP 주소 집합을 참조할 때 유용해요. 주로 같은 IP 집합을 정책에서 재사용하거나 규모 있게 관리하고 싶을 때 써요.
global network set 리소스도 비슷하지만, Calico 글로벌 네트워크 정책에서만 선택할 수 있어요.
방법
외부 네트워크와 주고받는 트래픽 제한하기: 네트워크 정책 안의 IP
다음 예제의 Calico NetworkPolicy는 color: red 레이블을 가진 파드가 192.0.2.0/24 CIDR 블록 안의 IP 주소로 보내는 egress 트래픽을 허용해요.
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-egress-external
namespace: production
spec:
selector: color == 'red'
types:
- Egress
egress:
- action: Allow
destination:
nets:
- 192.0.2.0/24
외부 네트워크와 주고받는 트래픽 제한하기: 글로벌 네트워크 셋
이 예제에서는 Calico GlobalNetworkSet을 만들고 GlobalNetworkPolicy에서 참조해요.
다음 예제의 Calico GlobalNetworkSet은 CIDR 대역 192.0.2.55/32와 203.0.113.0/24를 deny-list에 올려요:
apiVersion: projectcalico.org/v3
kind: GlobalNetworkSet
metadata:
name: ip-protect
labels:
ip-deny-list: 'true'
spec:
nets:
- 192.0.2.55/32
- 203.0.113.0/24
다음으로 Calico GlobalNetworkPolicy 두 개를 만들어요. 첫 번째는 높은 "order"를 가진 정책으로, 두 번째 정책에 매칭되지 않는 것들에 대해 기본적으로 트래픽을 허용해요. 두 번째는 낮은 "order"를 가지고, GlobalNetworkSet의 레이블(앞 단계의 IP-deny-list)을 셀렉터로 사용해 ingress 트래픽을 거부해요. 레이블 셀렉터에는 **!has(projectcalico.org/namespace)**도 포함하는데, 이는 같은 레이블을 가진 파드나 NetworkSet까지 이 정책이 매칭하지 않도록 막는 장치예요. 포워드되는 트래픽의 거부를 패킷 수준에서 더 빠르게 강제하려면 doNotTrack과 applyOnForward 옵션을 사용하세요.
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: forward-default-allow
spec:
selector: apply-ip-protect == 'true'
order: 1000
doNotTrack: true
applyOnForward: true
types:
- Ingress
ingress:
- action: Allow
---
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: ip-protect
spec:
selector: apply-ip-protect == 'true'
order: 0
doNotTrack: true
applyOnForward: true
types:
- Ingress
ingress:
- action: Deny
source:
selector: ip-deny-list == 'true' && !has(projectcalico.org/namespace)
추가 리소스
- 글로벌 네트워크 셋으로 흔한 위협을 완화하는 방법은 DoS 공격 방어하기를 참고하세요
- Global network sets
- Global network policy
더 알아보기 (Learn more)
한 곳에서 관리하는 IP 집합을 여러 정책에서 재사용하고 싶다면 네트워크 셋이 정답이에요. deny-list처럼 포워드 트래픽에 즉시 적용해야 하는 규칙에는 doNotTrack과 applyOnForward 옵션을 잊지 마세요.