Cài đặt OPA Gatekeeper và cấu hình Policy Server
Chúng ta sẽ triển khai OPA Gatekeeper vào Kubernetes cluster để đóng vai trò là Policy Decision Point, kiểm tra và từ chối các resource không tuân thủ chính sách trước khi được tạo.
Đầu tiên, hãy áp dụng manifest cài đặt Gatekeeper. Manifest này sẽ tạo namespace gatekeeper-system và triển khai các component cần thiết như Controller và Audit.
curl -s https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.13/deploy/gatekeeper.yaml | kubectl apply -f -
Kết quả mong đợi: Kubernetes sẽ báo namespace/gatekeeper-system created, deployment.apps/gatekeeper-controller created và các service tương ứng. Chờ khoảng 2-3 phút để các Pod chuyển sang trạng thái Running.
Để xác minh Gatekeeper đã sẵn sàng, kiểm tra trạng thái của các Pod trong namespace gatekeeper-system.
kubectl get pods -n gatekeeper-system
Kết quả mong đợi: Tất cả Pod (bao gồm gatekeeper-audit, gatekeeper-controller, gatekeeper-webhook-server) đều có trạng thái Running và READY (ví dụ: 1/1 hoặc 2/2).
Cấu hình Policy Server để hỗ trợ Rego
Mặc dù Gatekeeper chạy mặc định, chúng ta cần cấu hình Policy Server để đảm bảo nó lắng nghe các yêu cầu từ API server của Kubernetes một cách chính xác cho các policy phức tạp.
Tạo file cấu hình Config trong namespace gatekeeper-system để bật chế độ strict audit và đảm bảo policy được tải đúng cách.
cat
Kết quả mong đợi: Resource config.config.gatekeeper.sh/config created. Gatekeeper sẽ chỉ đồng bộ và kiểm tra các resource được liệt kê trong syncOnly để giảm tải cho API server.
Viết các policy Rego để kiểm soát quyền truy cập vào GPU/TPU
Trong môi trường AI Sandbox, việc cấp quyền truy cập GPU/TPU phải được kiểm soát chặt chẽ để tránh các workload độc hại chiếm dụng tài nguyên phần cứng đắt tiền.
Chúng ta sẽ tạo một ConstraintTemplate định nghĩa logic Rego để kiểm tra nếu Pod yêu cầu resource nvidia.com/gpu hoặc google.com/tpu, nó phải thuộc về một Label cụ thể (ví dụ: ai-sandbox-allowed=true).
cat 0
not input.review.object.metadata.labels["ai-sandbox-allowed"] == "true"
msg := sprintf("Pod %v requests TPU but lacks label 'ai-sandbox-allowed: true'", [input.review.object.metadata.name])
}
EOF
Kết quả mong đợi: constrainttemplate.templates.gatekeeper.sh/k8sallowedgpu created. Template này đã được đăng ký với API server.
Bây giờ, áp dụng Constraint thực tế để kích hoạt policy này trên toàn cluster.
cat
Kết quả mong đợi: constraint.constraints.gatekeeper.sh/gpu-access-policy created. Policy hiện đã active và sẽ chặn bất kỳ Pod nào không có label đúng khi yêu cầu GPU/TPU.
Verify kết quả Policy GPU
Thử nghiệm bằng cách tạo một Pod yêu cầu GPU nhưng thiếu label để xác nhận policy đã hoạt động.
cat
Kết quả mong đợi: Kubernetes sẽ trả về lỗi admission webhook "validation.gatekeeper.sh" denied the request với thông báo chi tiết về việc thiếu label ai-sandbox-allowed. Pod sẽ không được tạo.
Ngược lại, tạo một Pod có label đúng để xác nhận luồng hợp lệ.
cat
Kết quả mong đợi: Pod test-gpu-allowed được tạo thành công (pod/test-gpu-allowed created) và chuyển sang trạng thái Pending hoặc Running.
Định nghĩa quy tắc hạn chế quyền root và ngăn chặn mount volume nhạy cảm
Để bảo vệ kernel và filesystem của host, chúng ta cần cấm các Pod chạy với quyền runAsNonRoot: false (tức là chạy root) và ngăn chặn mount các volume nhạy cảm như hostPath đến các thư mục hệ thống.
Tạo ConstraintTemplate mới để kiểm tra securityContext của Pod và Container.
cat
Kết quả mong đợi: constrainttemplate.templates.gatekeeper.sh/k8sprivilegedpod created. Logic Rego đã sẵn sàng để kiểm tra runAsNonRoot và hostPath.
Áp dụng Constraint với danh sách các đường dẫn nhạy cảm cần chặn (ví dụ: /etc, /var/run, /boot, /sys).
cat
Kết quả mong đợi: constraint.constraints.gatekeeper.sh/no-root-no-sensitive-vol created. Policy này sẽ chặn các Pod vi phạm quy tắc root hoặc mount volume nhạy cảm.
Verify kết quả Policy Root và Volume
Thử nghiệm tạo một Pod chạy với quyền root (mặc định trong nhiều image cũ) để xem policy có chặn không.
cat
Kết quả mong đợi: Lỗi admission webhook "validation.gatekeeper.sh" denied the request với thông báo Pod test-root-user is not configured to run as non-root user.
Thử nghiệm tạo Pod mount volume nhạy cảm (ví dụ: mount /etc vào container).
cat
Kết quả mong đợi: Lỗi admission webhook "validation.gatekeeper.sh" denied the request với thông báo Pod test-sens-volume mounts sensitive host path /etc. Pod sẽ không được tạo.
Cuối cùng, kiểm tra trạng thái của các Constraint để đảm bảo chúng đang hoạt động và không có lỗi cấu hình.
kubectl get constraints
Kết quả mong đợi: Danh sách các constraint (như gpu-access-policy, no-root-no-sensitive-vol) đều hiển thị với trạng thái enforcing (hoặc active tùy version) và không có lỗi trong trường status.
kubectl describe constraint K8sAllowedGPU gpu-access-policy
Kết quả mong đợi: Xem chi tiết policy, số lượng violation (nếu có) và các namespace đang được áp dụng. Đây là bước cuối cùng để xác nhận Policy Engine đã tích hợp hoàn chỉnh vào Kubernetes.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Secure AI Sandbox với Kata Containers, gVisor và Policy Engine
« Phần 3: Tích hợp gVisor để chạy các thư viện AI không tin cậy
Phần 5: Kết nối Policy Engine với Kata Containers và gVisor »