NetworkPolicy
NetworkPolicy
Istio는 컴포넌트를 위한 Kubernetes NetworkPolicy 리소스를 선택적으로 배포할 수 있어요. 이는 보안 환경에서 흔한 요구 사항인 기본 거부(default-deny) 네트워크 정책을 적용하는 클러스터에서 유용해요.
출처: Istio 문서
본문
활성화되면 istiod, istio-cni, ztunnel, 그리고 Helm으로 설치된 게이트웨이를 위해 NetworkPolicy 리소스가 생성돼요. 각 컴포넌트가 필요로 하는 인그레스 포트를 정의하죠. 기본적으로 모든 이그레스는 허용돼요. istiod 같은 컴포넌트는 사용자가 정의한 엔드포인트(예: JWKS URL)에 연결해야 하기 때문이에요. 게이트웨이 NetworkPolicy는 게이트웨이의 Helm 값에 구성된 서비스 포트를 자동으로 포함해요.
Kubernetes Gateway API 또는 게이트웨이 인젝션으로 생성된 게이트웨이, 웨이포인트 프록시, 사이드카는 Istio의 내장 NetworkPolicy로 덮이지 않아요 — 이런 것들에 대해서는 NetworkPolicy 리소스를 직접 만들고 관리해야 해요. 이는 의도된 설계예요. 이런 프록시들의 NetworkPolicy를 자동으로 관리하려면 istiod에 클러스터 전역에서 NetworkPolicy 리소스를 생성하고 수정할 권한을 부여해야 하는데, 이는 컨트롤 플레인의 보안 상태에 부정적인 영향을 줄 것이기 때문이에요. 앰비언트 모드가 애플리케이션 파드에서 NetworkPolicy와 어떻게 상호작용하는지에 대해서는 Ambient and Kubernetes NetworkPolicy 문서를 참고해요.
NetworkPolicy 활성화 (Enabling NetworkPolicy)
NetworkPolicy를 활성화하려면 설치 중 global.networkPolicy.enabled=true를 설정해요.
istioctl로:
$ istioctl install --set values.global.networkPolicy.enabled=true
Helm으로는 각 차트에 설정을 전달해요:
$ helm install istiod istio/istiod -n istio-system --set global.networkPolicy.enabled=true
$ helm install istio-cni istio/cni -n istio-system --set global.networkPolicy.enabled=true
$ helm install ztunnel istio/ztunnel -n istio-system --set global.networkPolicy.enabled=true
$ helm install istio-ingressgateway istio/gateway -n istio-ingress --set global.networkPolicy.enabled=true
생성된 정책 검토 (Reviewing the generated policies)
각 컴포넌트의 NetworkPolicy는 해당 컴포넌트가 필요로 하는 특정 포트에 대한 인그레스를 허용하고, 모든 이그레스를 허용해요(istiod 같은 컴포넌트는 사용자 정의 엔드포인트, 예: JWKS URL에 연결해야 하기 때문).
helm template을 사용해 생성될 정확한 NetworkPolicy 리소스를 미리 볼 수 있어요:
$ helm template istiod istio/istiod -n istio-system --set global.networkPolicy.enabled=true -s templates/networkpolicy.yaml
$ helm template istio-cni istio/cni -n istio-system --set global.networkPolicy.enabled=true -s templates/networkpolicy.yaml
$ helm template ztunnel istio/ztunnel -n istio-system --set global.networkPolicy.enabled=true -s templates/networkpolicy.yaml
설치 후 정책을 검사하려면:
$ kubectl get networkpolicy -n istio-system
NetworkPolicy 커스터마이즈 (Customizing NetworkPolicy)
Istio가 생성하는 NetworkPolicy 리소스는 의도적으로 광범위해요 — 인그레스 규칙이 빈 from 선택자를 사용해서, 나열된 포트에서 어떤 소스로부터의 트래픽이든 허용되기 때문이에요. 이는 정당한 트래픽의 소스(예: kube-apiserver, Prometheus, 애플리케이션 파드)가 클러스터마다 다르기 때문이에요.
더 제한적인 정책이 필요하다면 Istio의 내장 NetworkPolicy를 비활성화하고, helm template의 출력을 출발점으로 사용해 자신만의 정책을 만들 수 있어요.
See also
플랫 네트워크에서 Istio Ambient 모드로 Kubernetes 보안 강화 — 플랫 온프레미스 네트워크를 보호하기 위해 Istio Ambient 모드를 사용하는 방법.
Istio가 ztunnel 보안 감사 결과 발표 — 훌륭하게 통과.
Istio v1 API 소개 — Istio 기능의 안정성을 반영해 네트워킹, 보안, 텔레메트리 API가 1.22에서 v1으로 승격.
Istio가 2022 보안 감사 결과 발표 — Istio 보안 검토에서 Go 표준 라이브러리의 CVE 발견.
Istio의 첫 보안 평가 결과 발표 — NCC Group의 서드파티 보안 검토 결과.
Istio 1.4 이전 알파 보안 정책을 현재 API로 마이그레이션 — 더 이상 사용되지 않는 v1alpha1 보안 정책에서 지원되는 v1beta1 버전으로 마이그레이션하는 튜토리얼.