LabHub
배우기 러닝패스 코스

CCA — Cilium Certified Associate

Building Up From Default Deny to L7

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

표준 NetworkPolicy 로 기본 거부와 셀렉터 기반 허용을 실제로 적용해 보고, CiliumNetworkPolicy 로만 가능한 L7·FQDN·명시적 거부를 매니페스트로 작성합니다.

왜 중요한가

네트워크 정책은 apply 가 성공했다고 해서 의도대로 동작한다는 보장이 없습니다. 특히 세 가지가 조용히 사람을 속입니다.

첫째, 방향별 독립입니다. ingress 정책만 걸어 두고 "격리했다"고 생각하면 egress 는 여전히 인터넷 전체로 열려 있습니다. 데이터 유출 경로는 대부분 egress 쪽입니다.

둘째, 셀렉터 오타는 에러가 아니라 "아무것도 선택하지 않음"으로 조용히 실패합니다. 적용 후 실제로 몇 개의 엔드포인트가 강제 상태인지 확인해야 합니다.

셋째, toFQDNs 는 DNS 규칙 없이는 영원히 매칭되지 않습니다. 이것이 Cilium 정책에서 가장 흔한 설정 실수이고, 시험에도 반복해서 나옵니다.

표준 NetworkPolicy 는 실제로 apply 하고, CiliumNetworkPolicy 는 /root/cca-policy/ 아래 파일로 작성합니다. 실습 클러스터에 Cilium CRD 가 설치돼 있지 않기 때문이며, 시험에서 요구하는 능력 역시 매니페스트를 정확히 쓰는 것입니다.

단계

  1. 네임스페이스 cca-shopcca-mon 을 만들고, cca-mon 에는 라벨 tier=monitoring 을 붙이세요.
  2. 네임스페이스 cca-shop 에 디플로이먼트 frontendbackend 를 각각 1 레플리카로 배포하세요. 파드 라벨은 각각 app=frontend, app=backend 이고 이미지는 nginx:1.27-alpine 입니다. 그리고 서비스 backend 를 포트 8080 으로 만드세요.
  3. 네임스페이스 cca-shop 에 NetworkPolicy default-deny 를 만드세요. podSelector 는 비어 있고, policyTypes 에는 IngressEgress 를 모두 적으며, 허용 규칙은 하나도 두지 않습니다.
  4. 같은 네임스페이스에 NetworkPolicy allow-frontend-to-backend 를 만드세요. podSelectorapp=backend, policyTypesIngress 하나, ingress 규칙은 podSelectorapp=frontend 인 출발지에서 포트 8080 / 프로토콜 TCP 로만 허용합니다.
  5. 같은 네임스페이스에 NetworkPolicy allow-monitoring 을 만드세요. podSelectorapp=backend 이고, ingress 규칙의 from 항목은 namespaceSelectortier=monitoring 인 네임스페이스 하나만 두며 포트는 9090 입니다.
  6. /root/cca-policy/cnp-l7.yaml 에 CiliumNetworkPolicy 를 작성하세요. apiVersioncilium.io/v2, metadata.namespacecca-shop, endpointSelectorapp: backend 입니다. ingress 규칙은 fromEndpointsapp: frontend 이고 toPorts 의 포트 8080/TCP 아래 rules.http 에 두 항목을 둡니다. 첫째는 method GET / path /api/v1/orders, 둘째는 method POST / path /api/v1/orders 입니다.
  7. /root/cca-policy/cnp-fqdn.yaml 에 CiliumNetworkPolicy 를 작성하세요. endpointSelectorapp: frontend 이고 egress 규칙은 정확히 두 개입니다. 첫째는 toEndpointsk8s-app: kube-dns 인 대상에 포트 53/UDP 를 열고 rules.dnsmatchPattern: "*" 를 둡니다. 둘째는 toFQDNsmatchNameapi.pgprovider.example 이고 포트 443/TCP 를 엽니다.
  8. /root/cca-policy/cnp-deny.yaml 에 이름이 block-metadata 인 CiliumNetworkPolicy 를 작성하세요. endpointSelector 는 비어 있고, egress 규칙에 toCIDRSet 으로 cidr: 0.0.0.0/0 을 허용하되 except169.254.169.254/32 를 두며, 추가로 egressDenytoCIDR 에도 169.254.169.254/32 를 명시하세요.

참고

애플리케이션과 모니터링 네임스페이스 만들기

네임스페이스 cca-shopcca-mon 을 만들고, cca-mon 에는 라벨 tier=monitoring 을 붙이세요.

namespaceSelector 는 네임스페이스의 라벨만 볼 수 있습니다. 이름으로는 고를 수 없으니 라벨을 미리 붙여 두세요.

프런트엔드와 백엔드 배포

네임스페이스 cca-shop 에 디플로이먼트 frontendbackend 를 각각 1 레플리카로 배포하세요. 파드 라벨은 각각 app=frontend, app=backend 이고 이미지는 nginx:1.27-alpine 입니다. 그리고 서비스 backend 를 포트 8080 으로 만드세요.

정책은 라벨로 대상을 고릅니다. 파드 템플릿의 app 라벨이 정확해야 뒤 단계가 전부 맞물립니다.

양방향 기본 거부 만들기

네임스페이스 cca-shop 에 NetworkPolicy default-deny 를 만드세요. podSelector 는 비어 있고, policyTypes 에는 IngressEgress 를 모두 적으며, 허용 규칙은 하나도 두지 않습니다.

방향은 서로 독립입니다. 한쪽만 적으면 반대 방향은 여전히 전부 열려 있습니다. 허용 규칙은 하나도 넣지 마세요.

파드 셀렉터로 한 경로만 열기

같은 네임스페이스에 NetworkPolicy allow-frontend-to-backend 를 만드세요. podSelectorapp=backend, policyTypesIngress 하나, ingress 규칙은 podSelectorapp=frontend 인 출발지에서 포트 8080 / 프로토콜 TCP 로만 허용합니다.

정책의 podSelector 는 트래픽을 받는 쪽을 고르고, from 의 podSelector 는 보내는 쪽을 고릅니다. 이 단계에서는 같은 네임스페이스 안에서만 허용하므로 namespaceSelector 를 함께 두지 마세요.

네임스페이스 셀렉터로 다른 네임스페이스 열기

같은 네임스페이스에 NetworkPolicy allow-monitoring 을 만드세요. podSelectorapp=backend 이고, ingress 규칙의 from 항목은 namespaceSelectortier=monitoring 인 네임스페이스 하나만 두며 포트는 9090 입니다.

1단계에서 붙인 네임스페이스 라벨을 씁니다. 열어야 할 포트는 애플리케이션 포트가 아니라 메트릭 포트입니다.

HTTP 메서드와 경로로 제한하기

/root/cca-policy/cnp-l7.yaml 에 CiliumNetworkPolicy 를 작성하세요. apiVersioncilium.io/v2, metadata.namespacecca-shop, endpointSelectorapp: backend 입니다. ingress 규칙은 fromEndpointsapp: frontend 이고 toPorts 의 포트 8080/TCP 아래 rules.http 에 두 항목을 둡니다. 첫째는 method GET / path /api/v1/orders, 둘째는 method POST / path /api/v1/orders 입니다.

표준 NetworkPolicy 로는 불가능한 영역입니다. toPorts 아래에 rules.http 를 두고 메서드와 경로를 나열하세요. 매칭되지 않는 요청은 차단이 아니라 403 으로 돌아옵니다.

도메인 이름으로 외부 API 허용하기

/root/cca-policy/cnp-fqdn.yaml 에 CiliumNetworkPolicy 를 작성하세요. endpointSelectorapp: frontend 이고 egress 규칙은 정확히 두 개입니다. 첫째는 toEndpointsk8s-app: kube-dns 인 대상에 포트 53/UDP 를 열고 rules.dnsmatchPattern: "*" 를 둡니다. 둘째는 toFQDNsmatchNameapi.pgprovider.example 이고 포트 443/TCP 를 엽니다.

toFQDNs 만 쓰면 절대 동작하지 않습니다. DNS 프록시가 응답을 학습해야 IP 가 등록되므로, DNS 질의를 허용하고 관찰 대상으로 만드는 규칙이 반드시 짝으로 있어야 합니다.

메타데이터 엔드포인트 봉인하기

/root/cca-policy/cnp-deny.yaml 에 이름이 block-metadata 인 CiliumNetworkPolicy 를 작성하세요. endpointSelector 는 비어 있고, egress 규칙에 toCIDRSet 으로 cidr: 0.0.0.0/0 을 허용하되 except169.254.169.254/32 를 두며, 추가로 egressDenytoCIDR 에도 169.254.169.254/32 를 명시하세요.

허용 규칙에 예외를 파는 방법과, 명시적 거부를 한 겹 더 까는 방법을 모두 씁니다. deny 는 allow 를 이기므로 두 겹이 서로 모순되지 않습니다.