Skip to content

Module 7: Network Policies - Implementing Zero Trust

💀 The Default Danger

"By default, Kubernetes is a flat network. Any Pod can talk to Any Pod." Trong một cluster mặc định, nếu Hacker kiểm soát được Pod Frontend (ví dụ qua lỗi RCE), họ có thể scan và kết nối trực tiếp đến Database, Redis, hoặc Internal Payment Service ở bất kỳ Namespace nào. 👉 Đây là cơn ác mộng của Security.

1. The Concept: Internal Firewall

NetworkPolicy chính là Firewall nội bộ của Kubernetes (Internal Layer 3/4 Firewall). Nó định nghĩa Ai được phép nói chuyện với Ai.

⚠️ CNI Requirement (CRITICAL)

CHỈ hoạt động nếu bạn sử dụng CNI Plugin hỗ trợ NetworkPolicy:

  • Support: Calico, Cilium, Weave Net, Antrea.
  • NO Support: Flannel (Standard).

Nếu bạn apply YAML NetworkPolicy trên Flannel, Kubernetes API vẫn nhận, nhưng KHÔNG CÓ GÌ XẢY RA. Cửa vẫn mở toang hoang.


2. The "Default Deny" Pattern (Zero Trust)

Bước đầu tiên và quan trọng nhất của Zero Trust: Cấm tất cả mọi thứ trước. Sau đó mới mở từng cái cần thiết.

The Great Wall Strategy

Hãy tưởng tượng bạn xây một bức tường bao quanh Namespace của bạn. Không ai được vào, không ai được ra nếu không có giấy phép.

yaml
# 00-default-deny-all.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-all
  namespace: backend-prod
spec:
  podSelector: {} # Chọn tất cả Pods trong namespace
  policyTypes:
  - Ingress # Cấm chiều vào
  - Egress  # Cấm chiều ra (Paranoid Mode)

🚧 Warning

Khi apply policy này, toàn bộ Pods trong namespace sẽ mất kết nối mạng ngay lập tức (kể cả DNS lookup). Hãy cẩn thận trong môi trường Production!


3. Whitelisting: Selectors in Action

Sau khi đã cấm tất cả, chúng ta bắt đầu "khoan lỗ" trên tường cho những kết nối hợp lệ.

Scenario: Chỉ cho phép Pod có nhãn app: frontend kết nối đến app: database qua cổng 5432.

The YAML Implementation

yaml
# 01-allow-db-access.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-allow-frontend
  namespace: backend-prod
spec:
  podSelector:
    matchLabels:
      app: database # Luật này áp dụng cho Database
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend # Chỉ nhận traffic từ Frontend
    ports:
    - protocol: TCP
      port: 5432

4. Advanced: Egress & DNS

Nếu dùng "Default Deny Egress", Pod của bạn sẽ không thể phân giải tên miền (DNS) vì không gọi được đến CoreDNS (port 53).

Rule: Allow DNS Lookup

Bắt buộc phải có rule này nếu chặn Egress:

yaml
# 02-allow-dns.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-dns-egress
  namespace: backend-prod
spec:
  podSelector: {}
  policyTypes:
  - Egress
  egress:
  - to:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
      podSelector:
        matchLabels:
          k8s-app: kube-dns
    ports:
    - protocol: UDP
      port: 53
    - protocol: TCP
      port: 53

5. Security Checklist (HPN Standard)

  1. Check CNI: Xác nhận cluster không dùng Flannel thuần.
  2. Namespace Isolation: Luôn apply default-deny-ingress cho mọi Namespace mới.
  3. Labeling Strategy: Quản lý Labels (app, role, tier) thật chặt chẽ, vì NetworkPolicy dựa hoàn toàn vào Labels.
  4. Regular Audit: Dùng các tool như karydia hoặc cilium editor để visualize traffic thực tế.

"Paranoid is Good"

Trong bảo mật mạng, người hoang tưởng là người sống sót cuối cùng. Đừng tin tưởng bất kỳ Pod nào. Zero Trust.