네트워크 정책이란?
네트워크 정책이란? (What is network policy?)
Kubernetes와 Calico는 워크로드를 보호할 수 있도록 네트워크 정책 API를 제공해요. 이 가이드는 네트워크 정책의 기본 개념, Kubernetes 정책과 Calico 정책의 차이, 실전에서 쓸 수 있는 모범 사례를 다뤄요. Calico에 국한되지 않는 교육용 자료라는 점도 알아두세요.
출처: 문서
본문
참고 (SECONDARY): 이 가이드는 Calico에 국한되지 않는 교육 자료를 제공해요.
Kubernetes와 Calico는 워크로드를 보호하는 데 도움이 되는 네트워크 정책 API를 제공해요.
이 가이드에서 배우게 될 내용은 다음과 같아요.
- 네트워크 정책이 무엇이고 왜 중요한지.
- Kubernetes 네트워크 정책과 Calico 네트워크 정책의 차이, 그리고 각각을 언제 쓰면 좋은지.
- 네트워크 정책 사용을 위한 몇 가지 모범 사례.
네트워크 정책이란?
네트워크 정책은 Kubernetes 네트워크를 보호하는 기본 도구예요. 클러스터의 네트워크 트래픽을 쉽게 제한해서 원하는 트래픽만 흐르도록 허용할 수 있어요.
네트워크 정책의 중요성을 이해하려면, 네트워크 정책 이전에 네트워크 보안이 보통 어떻게 달성됐는지 잠깐 살펴볼 필요가 있어요. 과거 엔터프라이즈 네트워크에서는 네트워크 장비(스위치, 라우터, 방화벽)의 물리적 토폴로지와 그에 딸린 구성을 설계해서 네트워크 보안을 제공했어요. 물리적 토폴로지가 네트워크의 보안 경계를 정의했죠. 가상화의 첫 번째 시기에는 같은 네트워크와 네트워크 장비 개념이 클라우드에서 가상화됐고, (가상) 네트워크 장비로 특정 네트워크 토폴로지를 만드는 동일한 기법이 네트워크 보안에 쓰였어요. 새 애플리케이션이나 서비스를 추가하려면 원하는 보안을 제공하기 위해 네트워크 토폴로지와 네트워크 장비 구성을 갱신하는 추가 네트워크 설계가 필요할 때가 많았어요.
이에 반해 Kubernetes 네트워크 모델은 모든 팟이 팟 IP 주소로 클러스터의 다른 모든 팟과 통신할 수 있는 "플랫" 네트워크를 정의해요. 이 방식은 네트워크 설계를 크게 단순화하고, 새 워크로드가 네트워크 설계에 의존 없이 클러스터 어디에서든 동적으로 스케줄될 수 있게 해 줘요.
이 모델에서는 네트워크 보안이 네트워크 토폴로지 경계가 아니라 토폴로지와 독립적인 네트워크 정책으로 정의돼요. 네트워크 정책은 IP 주소나 IP 대역 대신 라벨 셀렉터를 주요 메커니즘으로 사용해서 "어떤 워크로드가 어떤 워크로드와 통신할 수 있는지"를 정의하기 때문에 네트워크로부터 한 겹 더 추상화되어 있어요.
네트워크 정책은 왜 중요할까?
공격자가 날로 정교해지는 시대에 방어선으로서의 네트워크 보안은 그 어느 때보다 중요해요.
방화벽을 사용해(사용해야 하고) 네트워크 경계에서 트래픽을 제한할 수 있어요. 흔히 북남(north-south) 트래픽이라 불리는 트래픽이죠. 하지만 팟 스케줄링과 팟 IP 주소가 동적이다 보니, 방화벽이 Kubernetes 트래픽을 다스릴 수 있는 범위는 클러스터 전체 수준의 거친 단위에 한정되는 경우가 많고 특정 팟 그룹 단위로 세밀히 통제하기 어려워요. 게다가 대부분의 공격자는 경계 안쪽에 발판을 마련한 뒤 측면으로 이동(흔히 동서(east-west) 트래픽이라 불림)해 더 가치 있는 표적을 노리는데, 경계 기반 방화벽은 이런 공격을 막지 못해요.
반면 네트워크 정책은 IP 주소가 아니라 라벨 셀렉터로 팟 그룹을 정의하는 표준 Kubernetes 패러다임을 따르기 때문에 Kubernetes의 동적 특성에 맞게 설계됐어요. 그리고 네트워크 정책은 클러스터 내부에서 강제되기 때문에 북남 트래픽과 동서 트래픽 모두를 통제할 수 있어요.
네트워크 정책은 네트워크 보안의 중요한 진화예요. 현대 마이크로서비스의 동적인 특성을 다룰 수 있다는 점뿐 아니라, dev와 DevOps 엔지니어가 저수준 네트워킹 지식을 배우거나 방화벽 관리 전담 팀에 티켓을 올리지 않고도 스스로 네트워크 보안을 정의할 수 있게 하기 때문이에요. 네트워크 정책을 사용하면 "이 마이크로서비스만 데이터베이스에 연결할 수 있다" 같은 의도를 쉽게 정의하고, 그 의도를 코드로(보통 YAML 파일) 작성하고, 네트워크 정책 작성을 git 워크플로와 CI/CD 프로세스에 통합할 수 있어요.
참고 (SECONDARY): 참고: Calico는 경계 방화벽이 Kubernetes와 더 긴밀하게 통합되도록 돕는 기능을 제공해요. 다만 이것이 클러스터 내부의 네트워크 정책 필요성과 가치를 없애 주지는 않아요.)
Kubernetes 네트워크 정책
Kubernetes 네트워크 정책은 Kubernetes NetworkPolicy 리소스로 정의해요.
Kubernetes 네트워크 정책의 주요 특징은 다음과 같아요.
- 정책은 네임스페이스 스코프예요 (예를 들어 팟처럼 특정 네임스페이스 안에서 생성해요)
- 정책은 라벨 셀렉터를 사용해 팟에 적용돼요
- 정책 규칙은 다른 팟, 네임스페이스, CIDR과 주고받을 수 있는 트래픽을 지정할 수 있어요
- 정책 규칙은 프로토콜(TCP, UDP, SCTP), 이름이 지정된 포트, 포트 번호를 지정할 수 있어요
Kubernetes 자체는 네트워크 정책을 강제하지 않고, 강제를 네트워크 플러그인에 위임해요. 대부분의 네트워크 플러그인은 Kubernetes 네트워크 정책의 주류(mainline) 요소를 구현하지만, 스펙의 모든 기능을 구현하지는 않아요. (Calico는 모든 기능을 구현하며, Kubernetes 네트워크 정책의 최초 레퍼런스 구현체였어요.)
Kubernetes 네트워크 정책에 대해 더 알고 싶다면 Get started with Kubernetes network policy 가이드를 읽어 보세요.
Calico 네트워크 정책
Kubernetes 네트워크 정책을 강제하는 것 외에도, Calico는 자체적인 네임스페이스 스코프 NetworkPolicy 리소스와 네임스페이스 스코프가 아닌 GlobalNetworkPolicy 리소스를 지원하고, Kubernetes 네트워크 정책이 지원하는 것 이상의 추가 기능을 제공해요. 여기에는 다음이 포함돼요.
- 정책 순서/우선순위
- 규칙의 deny와 log 액션
- 정책 적용과 정책 규칙을 위한 더 유연한 매치 기준. Kubernetes ServiceAccount 매칭을 포함해요
- 정책에서 Kubernetes가 아닌 워크로드를 참조할 수 있는 능력. 정책 규칙에서 NetworkSets 매칭을 포함해요
Kubernetes 네트워크 정책은 팟에만 적용되지만, Calico 네트워크 정책은 팟, VM, 호스트 인터페이스를 포함한 여러 유형의 엔드포인트에 적용될 수 있어요.
Calico 네트워크 정책에 대해 더 알고 싶다면 Calico 네트워크 정책 가이드를 참고하세요.
네트워크 정책에 Calico를 사용하는 이점
완전한 Kubernetes 네트워크 정책 지원
다른 일부 네트워크 정책 구현체와 달리, Calico는 Kubernetes 네트워크 정책 기능 전체를 구현해요.
더 풍부한 네트워크 정책
필요하다면 Calico 네트워크 정책은 Kubernetes 네트워크 정책보다 더 풍부한 트래픽 제어를 가능하게 해요. 게다가 Calico 네트워크 정책은 GlobalNetworkPolicy 리소스를 사용해 여러 네임스페이스에 걸쳐 적용되는 정책을 만들 수 있어요.
Kubernetes와 Calico 네트워크 정책 혼합
Kubernetes 네트워크 정책과 Calico 네트워크 정책은 매끄럽게 섞어 쓸 수 있어요. 대표적인 사용 사례는 보안/클러스터 운영 팀과 개발자/서비스 팀 사이의 책임 분리예요. 예를 들어 보안/클러스터 운영 팀에게는 Calico 정책을 정의할 RBAC 권한을 주고, 개발자/서비스 팀에게는 자기 네임스페이스에서 Kubernetes 네트워크 정책을 정의할 RBAC 권한을 줄 수 있어요. Calico 정책 규칙은 Kubernetes 네트워크 정책보다 먼저 또는 나중에 강제되도록 순서를 정할 수 있고, deny와 log 같은 액션도 포함할 수 있어서, 보안/클러스터 운영 팀이 기본적이고 범용적인 상위 규칙을 정의하는 동안 개발자/서비스 팀이 자기가 담당하는 앱과 서비스에 대해 세밀한 제약을 정의하게 할 수 있어요.
두 개 이상의 팀 사이에서 더 유연한 제어와 책임 위임이 필요하다면, Calico Enterprise가 이 모델을 확장해 계층형 정책(hierarchical policy)을 제공해요.
호스트와 VM을 보호하는 능력
Calico 정책은 호스트 인터페이스에 강제할 수 있어서, Kubernetes 노드(팟만이 아니라)를 보호하는 데 쓸 수 있어요. 예를 들어 클러스터 밖에서 노드 포트로의 접근을 제한하는 식이죠. 자세한 내용은 Calico 호스트 정책 가이드를 확인하세요.
Calico로 확장
Calico Enterprise는 계층형 정책으로 각 팀이 특정 신뢰 경계를 갖게 하고, 정책 규칙에서 FQDN/도메인 이름을 사용해 특정 외부 서비스로의 접근을 제한하는 등, 더 풍부한 네트워크 정책 기능을 추가해요.
네트워크 정책 모범 사례
인그레스와 이그레스
최소한 모든 팟이 네트워크 정책 인그레스 규칙으로 보호되기를 권해요. 어디서 팟에 연결할 수 있고 어떤 포트로 연결할 수 있는지 제한하는 거죠. 모범 사례로는 팟 자신이 허용하는 아웃바운드 연결을 제한하는 네트워크 정책 이그레스 규칙도 정의하는 것이 있어요. 인그레스 규칙은 팟 바깥에서 오는 공격으로부터 팟을 보호해요. 이그레스 규칙은 팟이 침해됐을 때 팟 바깥의 모든 것을 보호하는 데 도움이 돼요. 측면 이동(동서) 공격 표면을 줄이거나, 공격자가 침해된 데이터를 클러스터 밖으로 반출(북남)하지 못하게 막아 주죠.
정책 스키마
네트워크 정책과 라벨링이 유연하다 보니, 같은 목표를 달성하는 방법이 여러 가지일 때가 많아요. 가장 흔한 접근 중 하나는 모든 팟에 적용되는 소수의 전역 정책을 두고, 그다음 각 팟 고유의 인그레스/이그레스 규칙을 정의하는 팟별 정책 하나를 두는 거예요.
예를 들면 다음과 같아요.
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: front-end
namespace: staging
spec:
podSelector:
matchLabels:
app: back-end
ingress:
- from:
- podSelector:
matchLabels:
app: front-end
ports:
- protocol: TCP
port: 443
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 27017
기본 거부 (Default deny)
이 모범 사례가 지켜지도록 하는 한 가지 방법은 기본 거부(default deny) 네트워크 정책을 정의하는 거예요. 이렇게 하면 팟과의 트래픽을 명시적으로 허용하는 다른 정책이 없다면 그 트래픽이 거부돼요. 결과적으로 팀이 새 팟을 배포할 때마다 그 팟에 대한 네트워크 정책도 정의하게 되죠. 이때 (새 네임스페이스를 만들 때마다 정책을 정의할 필요 없이) Calico GlobalNetworkPolicy를 사용하고, 기본 거부에 몇 가지 예외(예: DNS 접근 허용)를 포함하면 유용해요.
예를 들어 다음 정책을 사용하면 kube-dns/core-dns로의 DNS 쿼리를 제외한 모든 (시스템이 아닌) 팟 트래픽을 기본 거부할 수 있어요.
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: default-app-policy
spec:
namespaceSelector: has(kubernetes.io/metadata.name) && kubernetes.io/metadata.name not in {"kube-system", "calico-system", "calico-apiserver"}
types:
- Ingress
- Egress
egress:
- action: Allow
protocol: UDP
destination:
selector: k8s-app == "kube-dns"
ports:
- 53
계층형 정책
Calico Enterprise는 정책 티어(policy tiers)를 사용한 계층형 네트워크 정책을 지원해요. 각 티어에 RBAC을 정의하면 누가 각 티어와 상호작용할 수 있는지 제한할 수 있어요. 이를 활용하면 여러 팀에 걸쳐 신뢰를 위임할 수 있어요.
더 알아보기 (Learn more)
네트워크 정책은 Kubernetes 보안의 기본 도구이고, 라벨 셀렉터 기반이라 동적인 팟 환경에 잘 맞아요. Kubernetes NetworkPolicy로 부족하다면 Calico 정책이 순서 지정, deny/log 액션, GlobalNetworkPolicy 등 더 강력한 기능을 제공해요. 기본 거부(default deny) 정책부터 도입하는 것이 가장 안전한 출발점이에요.