Cấu hình chính sách L7 cho HTTP Host và Path trong Cilium
Bước đầu tiên là định nghĩa các quy tắc lọc lưu lượng ở lớp ứng dụng (Layer 7) dựa trên các header HTTP cụ thể như Host và Path. Điều này cho phép bạn kiểm soát chính xác pod nào được truy cập endpoint nào, thay vì chỉ mở toàn bộ cổng.
Tạo file cấu hình `cilium-l7-http-policy.yaml` với nội dung dưới đây để áp dụng chính sách cho namespace `frontend` truy cập vào `backend` chỉ qua path `/api/v1`.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: l7-http-policy
spec:
endpointSelector:
matchLabels:
io.cilium.k8s.policy.name: frontend
ingress:
- fromEndpoints:
- matchLabels:
io.cilium.k8s.policy.name: backend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: GET
path: /api/v1
host: backend-service.default.svc.cluster.local
Áp dụng chính sách này vào cụm Kubernetes bằng lệnh `kubectl apply`.
kubectl apply -f cilium-l7-http-policy.yaml
Kết quả mong đợi: Pod `frontend` có thể gọi thành công `GET /api/v1` đến pod `backend` nhưng sẽ bị từ chối (403/503 hoặc connection refused) nếu gọi các path khác như `/admin` hoặc `/health`.
Verify kết quả HTTP Policy
Thực hiện lệnh curl từ bên trong pod `frontend` để kiểm tra cả trường hợp thành công và thất bại.
kubectl exec -it frontend-pod -- curl -v http://backend-service:8080/api/v1
kubectl exec -it frontend-pod -- curl -v http://backend-service:8080/admin
Quan sát output: Lệnh đầu tiên trả về HTTP 200 OK, lệnh thứ hai trả về HTTP 403 Forbidden hoặc kết nối bị cắt ngay lập tức do policy L7.
Áp dụng chính sách cho giao thức gRPC và Envoy proxy
Cilium có khả năng hiểu ngữ cảnh của gRPC thông qua việc phân tích header `:authority` và `:method`. Khi sử dụng Envoy proxy (thông qua tính năng `cilium-envoy-proxy` hoặc `istio` tích hợp), bạn có thể định nghĩa chính sách dựa trên tên service gRPC.
Tạo file `cilium-l7-grpc-policy.yaml` để cho phép pod `client-grpc` gọi phương thức `GetStatus` của service `OrderService`.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: l7-grpc-policy
spec:
endpointSelector:
matchLabels:
io.cilium.k8s.policy.name: client-grpc
ingress:
- fromEndpoints:
- matchLabels:
io.cilium.k8s.policy.name: order-service
toPorts:
- ports:
- port: "9090"
protocol: TCP
rules:
http:
- method: POST
path: "/api.OrderService/GetStatus"
headers:
content-type: application/grpc
Áp dụng file cấu hình vào cluster.
kubectl apply -f cilium-l7-grpc-policy.yaml
Kết quả mong đợi: Lưu lượng gRPC hợp lệ đi qua port 9090 với path `/api.OrderService/GetStatus` sẽ được chấp nhận. Các phương thức gRPC khác như `GetHistory` sẽ bị chặn.
Verify kết quả gRPC Policy
Sử dụng công cụ `grpcurl` (hoặc client gRPC custom) từ pod `client-grpc` để test.
kubectl exec -it client-grpc -- grpcurl -plaintext -d '{"id": 1}' order-service:9090 api.OrderService/GetStatus
kubectl exec -it client-grpc -- grpcurl -plaintext -d '{}' order-service:9090 api.OrderService/GetHistory
Quan sát output: Lệnh đầu tiên trả về response JSON/Protobuf, lệnh thứ hai báo lỗi `PERMISSION_DENIED` hoặc connection reset.
Thực hiện xác thực mTLS tự động giữa các Pod
Cilium tự động triển khai mTLS (mutual TLS) giữa các pod khi cấu hình đúng policy, sử dụng chứng thư số (certificate) được cấp phát động bởi `cert-manager` hoặc `certs` của Cilium. Điều này mã hóa lưu lượng nội bộ và xác thực danh tính của cả client và server.
Để kích hoạt mTLS, bạn cần đảm bảo Cilium đang chạy với `encryption: tls` và tạo policy yêu cầu mTLS. Tạo file `cilium-mtls-policy.yaml`.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: mtls-requirement
spec:
endpointSelector:
matchLabels:
io.cilium.k8s.policy.name: backend
ingress:
- fromEndpoints:
- matchLabels:
io.cilium.k8s.policy.name: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
- method: GET
path: /api
tls:
server:
hostnames:
- "backend-service.default.svc.cluster.local"
client:
subject:
- "frontend-pod"
Áp dụng policy này. Lưu ý: Nếu chưa cấu hình mTLS toàn cục, bạn cần chạy lệnh enable mTLS trước.
kubectl apply -f cilium-mtls-policy.yaml
cilium status --features | grep mTLS
Kết quả mong đợi: Cilium tự động cấp phát chứng thư số cho các pod tham gia. Lưu lượng giữa `frontend` và `backend` sẽ được mã hóa. Nếu client không có chứng thư số hợp lệ hoặc hostname không khớp, kết nối sẽ bị từ chối ngay tại handshake TLS.
Verify kết quả mTLS
Kiểm tra xem chứng thư số đã được cấp phát chưa và thử kết nối không dùng TLS.
kubectl get ciliumendpoint | grep frontend
kubectl exec -it frontend-pod -- openssl s_client -connect backend-service:8080 -servername backend-service.default.svc.cluster.local
Quan sát output: Lệnh `openssl` phải trả về `Verify return code: 0 (ok)`. Nếu cố gắng kết nối bằng HTTP thuần (không TLS) sẽ bị drop kết nối.
Giới hạn tốc độ (Rate Limiting) và chặn yêu cầu độc hại
Dựa trên khả năng phân tích L7 của Cilium (thường kết hợp với Envoy hoặc EnvoyFilter trong môi trường Istio/Cilium), bạn có thể cấu hình giới hạn số lượng request/giây để chống DDoS hoặc quá tải, đồng thời chặn các pattern độc hại như SQL Injection.
Tạo file `cilium-rate-limit-policy.yaml` để giới hạn 100 request/giây cho path `/api/login` và chặn các path chứa chuỗi độc hại.
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: l7-security-hardening
spec:
endpointSelector:
matchLabels:
io.cilium.k8s.policy.name: backend
ingress:
- fromEndpoints:
- matchLabels:
io.cilium.k8s.policy.name: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
rules:
http:
# Rate limiting logic (cần Envoy backend hỗ trợ)
- method: POST
path: /api/login
headers:
x-rate-limit: "100"
# Chặn pattern độc hại
- method: GET
path: /api/*
headers:
path:
exclude:
- "*DROP TABLE*"
- "*UNION SELECT*"
- "*; DELETE*"
host:
exclude:
- "*hacker*"
- "*evil*"
deny: true
Áp dụng chính sách bảo mật này.
kubectl apply -f cilium-rate-limit-policy.yaml
Kết quả mong đợi: Các yêu cầu vượt quá ngưỡng rate limit sẽ bị trả về HTTP 429 Too Many Requests. Các yêu cầu chứa chuỗi độc hại trong path hoặc header sẽ bị chặn ngay lập tức (HTTP 403).
Verify kết quả Rate Limiting & Security
Thực hiện test stress đơn giản và test injection.
kubectl exec -it frontend-pod -- for i in {1..110}; do curl -s -o /dev/null -w "%{http_code}\n" http://backend-service:8080/api/login; done | sort | uniq -c
kubectl exec -it frontend-pod -- curl -v "http://backend-service:8080/api/data?q=1;DROP TABLE users;"
Quan sát output: Lệnh đầu tiên sẽ thấy nhiều mã trạng thái 429 xuất hiện sau một số request nhất định. Lệnh thứ hai trả về HTTP 403 Forbidden thay vì 200 OK.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Secure Service Mesh với eBPF, Cilium và Policy Engine
« Phần 4: Cấu hình Policy Engine và tích hợp OPA (Open Policy Agent)
Phần 6: Giám sát, Tracing và Thu thập metric với eBPF »