Triển khai OPA Sidecar trên Kubernetes
Chúng ta sẽ triển khai OPA (Open Policy Agent) dưới dạng một container riêng biệt chạy song song với Kong Gateway trong cùng một Pod. Mô hình này gọi là Sidecar Pattern, giúp OPA truy cập vào mạng nội bộ của Pod mà không cần cấu hình phức tạp về networking giữa các dịch vụ.
Mục đích: Cung cấp điểm cuối gRPC để Kong Gateway gửi yêu cầu đánh giá policy (Policy Evaluation Request).
Kết quả mong đợi: Pod OPA chạy ổn định và lắng nghe cổng 8080 (gRPC) và 8081 (REST API) trong namespace của Kong.
Tạo file manifest Kubernetes để deploy OPA Sidecar:
cat > opa-deployment.yaml
Lưu ý: Deployment này giả định ConfigMap chứa policy sẽ được tạo ở bước tiếp theo. OPA sẽ tải policy từ volume mounted.
Triển khai manifest vừa tạo:
kubectl apply -f opa-deployment.yaml
Kiểm tra trạng thái Pod:
kubectl get pods -n kong -l app=opa
Kết quả mong đợi: Trạng thái của Pod là "Running".
Tạo Service để expose OPA cho Kong
Kong Gateway cần biết địa chỉ IP và cổng của OPA để gửi yêu cầu gRPC. Vì Kong và OPA nằm trong cùng namespace, chúng ta tạo một Kubernetes Service để định danh OPA.
Mục đích: Tạo endpoint ổn định (DNS name) để plugin OPA của Kong có thể kết nối.
Kết quả mong đợi: Service "opa-service" được tạo và trỏ đúng Pod OPA.
Tạo file service cho OPA:
cat > opa-service.yaml
Triển khai Service:
kubectl apply -f opa-service.yaml
Verify kết quả:
kubectl get svc -n kong opa-service
Kết quả mong đợi: Service được hiển thị với cổng 8080 và 8081.
Cấu hình Policy OPA với Rego
Trước khi kết nối với Kong, chúng ta cần viết chính sách bảo mật bằng ngôn ngữ Rego. Policy này sẽ kiểm tra xem user nào được phép truy cập API nào dựa trên claim trong JWT hoặc header.
Mục đích: Định nghĩa logic cho phép/ từ chối truy cập.
Kết quả mong đợi: ConfigMap chứa file `.rego` được tạo và mount vào Pod OPA.
Tạo ConfigMap chứa file policy `access_control.rego`:
cat > opa-policy.yaml
Triển khai ConfigMap:
kubectl apply -f opa-policy.yaml
Khởi động lại Pod OPA để nó tải policy mới (vì policy được mount từ ConfigMap):
kubectl rollout restart deployment opa-sidecar -n kong
Verify kết quả: Kiểm tra xem OPA đã load policy chưa bằng cách gọi REST API của OPA:
kubectl port-forward svc/opa-service 8081:8081 -n kong &
curl -s http://localhost:8081/v1/data/kong | jq
Kết quả mong đợi: Trả về `{"result": false}` (vì chưa có input) hoặc `{"result": true}` nếu input thỏa mãn rule. Quan trọng là không bị lỗi "policy not found".
Cấu hình Plugin OPA trên Kong Gateway
Bây giờ chúng ta cấu hình Kong Gateway để sử dụng plugin OPA. Plugin này sẽ đóng vai trò là client gRPC, gửi request vào OPA để hỏi "có cho phép không?".
Mục đích: Tích hợp OPA vào luồng xử lý request của Kong.
Kết quả mong đợi: Plugin OPA được gắn vào Service hoặc Route và sẵn sàng đánh giá policy.
Đảm bảo bạn đã cài đặt plugin OPA cho Kong (thường là `kong-plugin-opa` hoặc `kong-ent` đã có sẵn plugin này). Nếu dùng OSS, cần build plugin hoặc dùng Docker image có plugin này. Ở đây giả sử chúng ta dùng Kong Gateway đã được cấu hình sẵn plugin OPA (hoặc đã install plugin vào cluster).
Tạo file cấu hình plugin cho Service (ví dụ: `api-service`):
cat > opa-plugin-config.yaml
Triển khai Plugin Config:
kubectl apply -f opa-plugin-config.yaml
Verify kết quả: Xem log của Kong Gateway để đảm bảo plugin đã được load và kết nối với OPA:
kubectl logs -n kong -l app=kong --tail=50 | grep -i "opa"
Kết quả mong đợi: Không có lỗi kết nối "connection refused" hoặc "policy not found".
Kết nối và Kiểm thử luồng Policy
Bước cuối cùng là tạo một request thử nghiệm để kiểm tra xem Kong có gửi request đến OPA và OPA có trả về đúng kết quả (allow/deny) không.
Mục đích: Xác minh toàn bộ luồng: Client -> Kong -> OPA -> Kong -> Backend.
Kết quả mong đợi:
- Request từ "admin" vào bất kỳ endpoint nào -> 200 OK.
- Request từ "user" vào /api/public -> 200 OK.
- Request từ "user" vào /api/secret -> 403 Forbidden.
Trước tiên, tạo một Service giả lập backend để test (nếu chưa có):
cat > test-backend.yaml
Triển khai backend test:
kubectl apply -f test-backend.yaml
Tạo Route để kích hoạt plugin OPA:
cat > api-route.yaml
Triển khai Route:
kubectl apply -f api-route.yaml
Test Case 1: User thường truy cập /api/public (Nên cho phép):
curl -v -H "x-user-role: user" http://:8000/api/public
Kết quả mong đợi: HTTP 200 OK.
Test Case 2: User thường truy cập /api/secret (Nên từ chối):
curl -v -H "x-user-role: user" http://:8000/api/secret
Kết quả mong đợi: HTTP 403 Forbidden. Trong log OPA sẽ thấy `allow = false`.
Test Case 3: Admin truy cập /api/secret (Nên cho phép):
curl -v -H "x-user-role: admin" http://:8000/api/secret
Kết quả mong đợi: HTTP 200 OK.
Verify log OPA khi có request:
kubectl logs -n kong -l app=opa --tail=20
Kết quả mong đợi: Log hiển thị "input.headers", "input.path" và kết quả đánh giá policy tương ứng.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Secure API Gateway với Kong, OPA và mTLS trên Kubernetes
« Phần 3: Cấu hình chứng chỉ mTLS cho Gateway
Phần 5: Xây dựng luồng xử lý an toàn với mTLS và Policy »