기본 연결을 위한 정책 만들기
호스트 엔드포인트에 보안 정책이 없으면 Calico는 기본적으로 그 엔드포인트와 주고받는 트래픽을 거부해요. 이 문서에서는 실수로 정책을 잘못 구성해도 호스트가 끊기지 않도록 실패 안전(failsafe) 정책을 직접 만드는 방법을 소개합니다. 관리 SSH, etcd, DHCP 같은 필수 연결을 확보하는 예제 정책을 함께 살펴봐요.
출처: 문서
본문
호스트 엔드포인트가 추가될 때 그 엔드포인트에 대한 보안 정책이 없다면, Calico는 failsafe 규칙이 허용하는 트래픽을 제외하고 해당 엔드포인트와 주고받는 트래픽을 기본적으로 거부해요.
failsafe 규칙은 호스트로의 모든 연결이 끊어지는 사고를 막아주지만:
- 어떤 인터페이스로든 인바운드 SSH를 허용하고, 어떤 인터페이스로든 etcd 포트로의 아웃바운드 트래픽을 허용하기 때문에 지나치게 광범위해요.
- 사용하는 네트워크에 따라 필요한 포트를 전부 커버하지 못할 수도 있어요. 예를 들어 ICMP나 DHCP 허용에 의존하는 네트워크일 수 있습니다.
따라서 환경에 맞게 조정한 failsafe Calico 보안 정책을 직접 만드는 것을 권장해요. 아래 예제 명령은 그런 방법의 한 예를 보여주는데, calicoctl을 사용해 하나의 정책 리소스를 만들며 이 정책은 다음을 수행해요:
- 알려진 모든 엔드포인트에 적용됩니다.
- 정의된 "management" 서브넷에서 오는 인바운드 ssh 접근을 허용해요.
- 특정 IP의 etcd로 나가는 연결을 허용합니다. etcd 서버가 여러 대라면 목적지마다 규칙을 복제해야 해요.
- 인바운드 ICMP를 허용해요.
- DHCP를 위해 67번 포트로 나가는 UDP를 허용합니다.
이 명령을 실행할 때는 꺾쇠 괄호 안의 자리표시자를 배포 환경에 맞는 값으로 바꾸세요.
cat <<EOF | calicoctl create -f -
- apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: failsafe
spec:
selector: "all()"
order: 0
ingress:
- action: Allow
protocol: TCP
source:
nets:
- "<your management CIDR>"
destination:
ports: [22]
- action: Allow
protocol: ICMP
egress:
- action: Allow
protocol: TCP
destination:
nets: [<your etcd IP>/32]
ports: [<your etcd ports>]
- action: Allow
protocol: TCP
destination:
nets: [<your Kubernetes API server IP]
ports: [<your Kubernetes API server IP ports>]
- action: Allow
protocol: UDP
destination:
ports: [67]
EOF
이런 정책을 갖추고 나면 failsafe 규칙을 비활성화하고 싶어질 수 있어요.
참고: 규칙 목록의 끝에 도달한 패킷은 다음 정책(
order필드로 정렬)으로 넘어갑니다. 정책의 셀렉터인all()은 워크로드 엔드포인트를 포함해 모든 엔드포인트와 매칭돼요. 워크로드 엔드포인트와 호스트 엔드포인트를 모두 사용한다면 더 제한적인 셀렉터를 쓰고 싶을 수 있습니다. 예를 들어 관리 인터페이스에endpoint_type = management라벨을 붙이고 셀렉터로endpoint_type == "management"를 사용할 수 있어요. Calico로 워크로드 네트워킹을 한다면 BGP를 허용하는 인바운드/아웃바운드 규칙을 추가해야 합니다. 목적지 포트 179로 가는 TCP 트래픽을 허용하는 ingress와 egress 규칙을 추가하세요.
더 알아보기 (Learn more)
failsafe 규칙은 안전망이지 정답이 아니에요. 환경에 맞는 정책을 만들고 나면 규칙을 꺼서 보안 범위를 좁히는 게 좋습니다. hostendpoints 리소스 문서와 failsafe 규칙 문서를 함께 참고하세요.