Mặc định, Kubernetes sử dụng mô hình mạng phẳng (flat network). Mọi pod đều có thể giao tiếp trực tiếp với bất kỳ pod nào khác giữa các namespace mà không gặp rào cản nào. Nếu kẻ tấn công xâm nhập thành công vào một container công khai, không có gì ngăn cản họ thăm dò bộ nhớ đệm Redis nội bộ, cơ sở dữ liệu thanh toán hay các endpoint Kubelet của bạn.
Các CNI plugin truyền thống áp dụng các quy tắc NetworkPolicy tiêu chuẩn thông qua iptables hoặc IPVS. Khi cụm phát triển vượt mốc 1.000 pod cùng hàng chục nghìn quy tắc bảo mật, Linux kernel buộc phải duyệt qua các bộ lọc gói tin tuần tự theo cách tuyến tính.
Điều này gây ra độ trễ kết nối rõ rệt—thời gian thiết lập kết nối thường tăng từ dưới 1 mili-giây lên 5–15ms khi có lưu lượng kết nối dồn dập. Cilium giải quyết triệt để vấn đề này bằng cách thay thế các bộ lọc gói tin cũ bằng eBPF (Extended Berkeley Packet Filter), chạy trực tiếp các chương trình bảo mật đã biên dịch bên trong các hook mạng của kernel.
Bắt đầu nhanh: Cài đặt Cilium và thiết lập Default-Deny
Bạn có thể thiết lập nền tảng zero-trust vững chắc chỉ trong năm phút bằng Cilium CLI.
Bước 1: Cài đặt Cilium CLI và triển khai Datapath
# Tải xuống và cài đặt Cilium CLI phiên bản mới nhất
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all "https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz"
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz
# Triển khai Cilium vào cluster
cilium install --version 1.15.4
# Chờ các pod agent và eBPF map khởi tạo hoàn tất
cilium status --wait
Bước 2: Triển khai Workload thử nghiệm
Tạo hai pod đơn giản trong một namespace kiểm thử riêng biệt: một web server frontend và một bộ nhớ đệm Redis backend.
kubectl create namespace demo-secure
# Triển khai frontend
kubectl run frontend --namespace=demo-secure \
--image=nginx:alpine --labels="app=frontend,tier=public"
# Triển khai backend cache
kubectl run backend --namespace=demo-secure \
--image=redis:7-alpine --labels="app=backend,tier=secure"
Bước 3: Áp dụng chính sách Default-Deny
Khóa chặt hoàn toàn namespace. Việc áp dụng một endpoint selector rỗng mà không có quy tắc ingress hoặc egress nào sẽ ngay lập tức cô lập tất cả các pod trong demo-secure khỏi lưu lượng ngoài ý muốn.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: default-deny-all
namespace: demo-secure
spec:
endpointSelector:
matchLabels: {}
Áp dụng manifest cô lập:
kubectl apply -f default-deny.yaml
Bất kỳ bắt tay TCP mới nào giữa frontend và backend giờ đây sẽ bị hủy ngay tại tầng socket trước khi tiêu tốn tài nguyên của network stack.
Phân tích chuyên sâu: Cách eBPF tái định hình Microsegmentation
Cơ chế lọc truyền thống của Linux định tuyến mọi gói tin qua các chuỗi netfilter (PREROUTING, FORWARD, POSTROUTING). Khi một cụm duy trì 20.000 quy tắc iptables, việc đánh giá từng quy tắc một sẽ ngốn đáng kể chu kỳ CPU và gây ra hiện tượng giật (jitter) trong xử lý gói tin.
Cilium bỏ qua hoàn toàn netfilter bằng cách gắn các chương trình bytecode eBPF vào các hook cấp thấp như Traffic Control (tc), XDP và cgroup/sock_ops. Kiến trúc này mang lại ba lợi thế cốt lõi:
- Bảo mật dựa trên danh tính (Identity-based security): Thay vì phải theo dõi địa chỉ IP thay đổi liên tục của pod, Cilium gán một Định danh Bảo mật dạng số (ví dụ:
ID: 4120) được tạo từ tập hợp nhãn (labels) của Kubernetes. - Tra cứu Map O(1): Khi một gói tin đến, eBPF truy vấn BPF hash map trong kernel với thời gian không đổi (constant time). Quá trình tra cứu chỉ mất khoảng 50 nano-giây, bất kể bạn có 10 quy tắc hay 50.000 quy tắc.
- Bỏ qua cấp socket (sockmap): Đối với các pod giao tiếp trên cùng một worker node, Cilium truyền dữ liệu trực tiếp giữa các Unix socket, giảm 15–20% độ trễ khứ hồi (RTT) nhờ bỏ qua hoàn toàn quá trình tuần tự hóa TCP/IP.
Dưới đây là cách tạo một CiliumNetworkPolicy (CNP) chính xác chỉ cho phép pod frontend truy vấn Redis trên cổng 6379:
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: demo-secure
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "6379"
protocol: TCP
Kiểm tra kết nối từ container frontend:
# Kiểm tra kết nối (sẽ trả về trạng thái mở thành công)
BACKEND_IP=$(kubectl get pod backend -n demo-secure -o jsonpath='{.status.podIP}')
kubectl exec -n demo-secure frontend -- nc -zv -w 2 $BACKEND_IP 6379
Lọc nâng cao: Đường dẫn HTTP Layer 7 và Egress nhận biết DNS
Các chính sách L3/L4 tiêu chuẩn chỉ quản lý địa chỉ IP và cổng. Tuy nhiên, các kiến trúc microservices hiện đại đòi hỏi khả năng kiểm soát Layer 7 chi tiết hơn. Cilium tích hợp sẵn một instance proxy Envoy trực tiếp vào local agent, kiểm tra các HTTP method và header mà không cần chèn sidecar vào ứng dụng pod.
Tình huống 1: Giới hạn HTTP Method và REST Endpoint
Xét trường hợp một service thu thập phân tích chỉ cần gọi GET /metrics từ một billing service. Bạn có thể chặn rõ ràng các thao tác nguy hiểm như POST /charge hoặc DELETE /accounts ngay tại tầng CNI.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: restrict-billing-api
namespace: demo-secure
spec:
endpointSelector:
matchLabels:
app: billing-service
ingress:
- fromEndpoints:
- matchLabels:
app: analytics-collector
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: "GET"
path: "/metrics"
Tình huống 2: Khóa chặn Egress nhận biết DNS
Kẻ tấn công khi xâm nhập được vào container thường tải mã độc hoặc trích xuất thông tin đăng nhập về các máy chủ bên ngoài tùy ý. Cilium kiểm tra các truy vấn DNS gửi đi và chỉ mở cổng kết nối egress một cách linh hoạt cho các FQDN đã được phê duyệt.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: lock-egress-to-stripe
namespace: demo-secure
spec:
endpointSelector:
matchLabels:
app: frontend
egress:
# Cho phép tra cứu CoreDNS
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
# Chỉ cho phép kết nối HTTPS ra ngoài tới Stripe API
- toFQDNs:
- matchName: "api.stripe.com"
toPorts:
- ports:
- port: "443"
protocol: TCP
Kinh nghiệm tối ưu bảo mật và khắc phục sự cố trong Production
Việc triển khai microsegmentation trên các cụm đang hoạt động đòi hỏi chiến lược triển khai cẩn trọng để tránh sự cố gián đoạn không mong muốn.
- Kiểm toán trước khi thực thi (Audit before enforcing): Thêm annotation
io.cilium.audit-mode: "true"vào các chính sách của bạn. Thao tác này sẽ ghi nhật ký các rule khớp vào Hubble mà không drop gói tin, giúp bạn phát hiện các quy tắc còn thiếu trước khi bật chế độ chặn cứng. - Theo dõi các gói tin bị drop theo thời gian thực với Hubble: Sử dụng công cụ quan sát của Cilium để theo dõi các gói tin bị drop ngay khi chúng xảy ra:
# Theo dõi luồng mạng bị drop theo thời gian thực hubble observe --namespace demo-secure --verdict DROPPED --follow - Chặn toàn cục các metadata endpoint của đám mây: Triển khai
CiliumClusterwideNetworkPolicy(CCNP) để chặn các pod trên mọi namespace tiếp cận dịch vụ metadata của cloud instance (169.254.169.254/32), phòng ngừa các cuộc tấn công SSRF. - Áp dụng thông tin xác thực quản trị mạnh: Bảo mật tầng mạng mới chỉ là một nửa chặng đường; quyền truy cập quản trị vào các node và bastion host của cluster cũng cần được chú trọng tương đương. Để tạo mật khẩu vận hành ngẫu nhiên an toàn, công cụ tạo mật khẩu trực tiếp trên trình duyệt tại toolcraft.app/vi/tools/security/password-generator cung cấp tiện ích nhanh chóng, không lưu trữ hay gửi dữ liệu qua mạng.
Chuyển đổi từ các bộ lọc gói tin truyền thống sang eBPF mang lại khả năng thực thi chính sách chính xác từ Layer 3 đến Layer 7 với hiệu năng O(1) ổn định. Giải pháp này biến mạng zero-trust trong Kubernetes từ một điểm nghẽn vận hành thành nền tảng bảo mật có khả năng mở rộng vượt trội.

