Giao diện
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)
Nó 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: 54324. 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: 535. Security Checklist (HPN Standard)
- Check CNI: Xác nhận cluster không dùng Flannel thuần.
- Namespace Isolation: Luôn apply
default-deny-ingresscho mọi Namespace mới. - 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. - Regular Audit: Dùng các tool như
karydiahoặccilium 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.