# CKS-001 — NetworkPolicy containment under pressure Status: **Attempt 1 — awaiting learner answer** Domain: **Cluster Setup (15%)** Topic: **NetworkPolicy and metadata protection** Target time: **12 minutes** Difficulty: **Harder than CKS** ## Scenario Use context: ```bash kubectl config use-context prod-sec ``` Namespace `payments` already contains these Pods: | Pod | Labels | |---|---| | `api-0` | `app=api`, `tier=backend` | | `worker-0` | `app=worker`, `tier=backend` | | `debug-0` | `app=debug` | Namespace `gateway` has label `access=payments` and contains Pods labeled `app=ingress`. Namespace `observability` has label `team=monitoring` and contains Pods labeled `app=prometheus`. The cluster DNS Pods are in namespace `kube-system` with label `k8s-app=kube-dns`. The cloud instance-metadata endpoint is `169.254.169.254/32`. ## Required end state Create one or more NetworkPolicies in namespace `payments` so that: 1. Every Pod in `payments` is isolated for both ingress and egress. 2. Only `gateway` Pods labeled `app=ingress` may connect to TCP port `8443` on Pods labeled `app=api`. 3. Only `observability` Pods labeled `app=prometheus` may scrape TCP port `9090` on Pods labeled `tier=backend`. 4. `api` and `worker` Pods may query cluster DNS using UDP and TCP port `53`; `debug-0` must have no egress, including DNS. 5. Pods labeled `app=api` may make TCP connections to any IPv4 destination on port `443`, except `169.254.169.254/32`. 6. No other ingress or egress is permitted. 7. Do not modify Pods, namespaces, Services, or existing labels. Assume the installed CNI enforces Kubernetes `NetworkPolicy`. Do not use Cilium-specific resources. ## Deliverables Write your proposed commands/manifests and verification plan below. Do not ask the teacher to apply them. ### A. Context and pre-check commands ```bash kubectl config use-context prod-sec k get pods -n payment k get pods -n payment -o wide k get pods -n payment --show-labels k get ns --show-labels k get pods -n gateway --show-labels k get pods -n observability --show-labels k get pods -n kube-system --show-labels ``` ### B. NetworkPolicy manifest(s) ```yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy-for-gateway namespace: payments spec: podSelector: matchLabels: app: api policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: access: payments podSelector: matchLabels: app: ingress ports: - protocol: TCP port: 8443 egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 169.254.169.254/32 ports: - protocol: TCP port: 443 - to: - podSelector: matchLabels: k8s-app: kube-dns namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system ports: - protocol: TCP port: 53 - protocol: UDP port: 53 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy-for-monitoring namespace: payments spec: podSelector: matchLabels: tier: backend policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: team: monitoring podSelector: matchLabels: app: prometheus ports: - protocol: TCP port: 9090 egress: - to: - podSelector: matchLabels: k8s-app: kube-dns namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system ports: - protocol: TCP port: 53 - protocol: UDP port: 53 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: policy-for-debug namespace: payments spec: podSelector: matchLabels: app: debug policyTypes: - Ingress - Egress ``` ### C. Verification commands and expected outcomes Show at least one positive and one negative test for every distinct rule. Tests must demonstrate that metadata access is denied and that `debug-0` has no DNS egress. ```bash k apply -f np-payments.yaml k get networkpolicy -n payments POD=$(k get pod -n gateway -l app=ingress -o name) API_IP=$(k get pod api-0 -n payments -o jsonpath='{.status.podIP}') WORKER_IP=$(k get pod worker-0 -n payments -o jsonpath='{.status.podIP}') k exec -n gateway $POD -- telnet $API_IP 8443 POD=$(k get pod -n observability -l app=prometheus -o name) k exec -n observability $POD -- telnet $WORKER_IP 9090 ``` ### D. Short reasoning Explain briefly why your selectors do not accidentally allow: - every Pod in an allowed namespace; - every port from an allowed source; - metadata access over a non-443 port; - DNS access from `debug-0`. Write here: > ## Submission - [ ] I checked the context. - [ ] I validated the YAML client-side or server-side. - [ ] I covered all seven required outcomes. - [ ] I included both allowed and denied verification cases. - [ ] I am ready for grading. When ready, save this file and tell the teacher: **Grade CKS-001 attempt 1**.