Triển khai Prometheus và Grafana để giám sát hiệu năng và bảo mật
Chúng ta sẽ triển khai Prometheus để thu thập metric từ Kubernetes, Falco và OPA, sau đó dùng Grafana để hiển thị. Đây là nền tảng để phát hiện sự cố hiệu năng và các chỉ số bảo mật bất thường.
Triển khai Prometheus qua Helm
Thay vì cài đặt thủ công, ta dùng Helm chart của Prometheus Community để đảm bảo tính tương thích và dễ bảo trì. Cấu hình này sẽ kéo metric từ các Pod của Falco và OPA Gatekeeper.
Đầu tiên, tạo namespace riêng cho monitoring stack:
kubectl create namespace monitoring
Tạo file cấu hình values.yaml để mở rộng scraping targets cho Falco và OPA:
cat > /tmp/prometheus-values.yaml
Triển khai Prometheus vào namespace monitoring:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/prometheus -n monitoring -f /tmp/prometheus-values.yaml --create-namespace
Kết quả mong đợi: Prometheus pod đang chạy trạng thái Running và đã tạo Service.
Triển khai Grafana và cấu hình Dashboard
Chúng ta cần Grafana để trực quan hóa dữ liệu. Cấu hình này sẽ tự động kết nối với Prometheus vừa cài đặt.
Triển khai Grafana qua Helm với tính năng auto-provisioning:
cat > /tmp/grafana-values.yaml
Kết quả mong đợi: Grafana đang chạy và có thể truy cập qua LoadBalancer hoặc port-forward.
Verify kết quả
Port-forward để truy cập Grafana UI và kiểm tra kết nối với Prometheus:
kubectl port-forward svc/grafana 3000:80 -n monitoring
Mở trình duyệt truy cập http://localhost:3000, đăng nhập với user: admin, password: SecurePass123. Vào menu Configuration -> Data Sources, đảm bảo Prometheus hiển thị trạng thái "Health: OK".
Cấu hình Audit Log của Kubernetes và Iceberg
Audit log là bằng pháp lý quan trọng nhất để tra cứu ai đã làm gì. Chúng ta sẽ bật audit log của K8s API Server và cấu hình log cho Apache Iceberg (thông qua Spark hoặc Trino engine).
Bật Audit Log cho Kubernetes API Server
Thay đổi cấu hình kube-apiserver để ghi log chi tiết vào file hoặc gửi ra stdout (dùng file cho audit log dài hạn).
Chỉnh sửa manifest của kube-apiserver (trên master node hoặc file config kubelet nếu dùng kubeadm):
cat > /etc/kubernetes/manifests/kube-apiserver.yaml
Tạo ConfigMap chứa chính sách audit (Audit Policy) để ghi lại mọi hành động của tenant:
cat > /tmp/audit-policy.yaml
Kết quả mong đợi: Kube-apiserver tự động restart, file /var/log/kubernetes/audit.log được tạo và bắt đầu ghi log.
Cấu hình Audit Log cho Apache Iceberg
Apache Iceberg tự thân không có audit log riêng biệt, nó dựa vào catalog engine (Spark/Trino). Chúng ta sẽ cấu hình Spark để ghi lại thao tác với catalog vào file log riêng biệt.
Giả sử bạn đang chạy Iceberg trên Spark, chỉnh sửa spark-defaults.conf hoặc spark-submit options:
cat > /opt/spark/conf/spark-defaults.conf
Tạo thư mục lưu log và set quyền đúng (chỉ cho spark user ghi được):
mkdir -p /var/log/iceberg
chown spark:spark /var/log/iceberg
Kết quả mong đợi: Khi chạy job Spark thao tác với Iceberg table, file /var/log/iceberg/audit.log sẽ xuất hiện các dòng JSON ghi lại thao tác (INSERT, UPDATE, DELETE).
Verify kết quả
Thực hiện một thao tác đơn giản để kích hoạt audit log:
kubectl create secret generic test-secret -n tenant-a --from-literal=password=secret123
kubectl get pods -n kube-system -l component=kube-apiserver -o jsonpath='{.spec.containers[0].volumeMounts}' | grep audit
tail -f /var/log/kubernetes/audit.log
Kiểm tra log Iceberg (nếu có job chạy):
tail -f /var/log/iceberg/audit.log
Trong terminal, bạn sẽ thấy dòng log JSON xuất hiện ngay lập tức khi thao tác trên Secret hoặc Iceberg table, chứa trường "user", "verb", "uri".
Xây dựng Dashboard tổng hợp sự kiện bảo mật từ OPA và Falco
Chúng ta sẽ tạo dashboard Grafana chuyên biệt để tập trung hiển thị các cảnh báo từ OPA (vi phạm chính sách) và Falco (xâm nhập hành vi). Dashboard này sẽ dùng PromQL để query metric từ Prometheus.
Cấu hình Alerting Rules cho OPA và Falco
Để dashboard hiển thị được, trước hết Prometheus cần scrape metric từ OPA và Falco. Ta sẽ tạo Alertmanager config để định nghĩa cảnh báo.
Tạo file alerting rules trong ConfigMap Prometheus (hoặc file riêng nếu dùng separate config):
cat > /tmp/security-alerts-rules.yaml 0
for: 1m
labels:
severity: critical
category: runtime
annotations:
summary: "Phát hiện hành vi bất thường từ Falco"
description: "Pod {{ \$labels.pod_name }} trong namespace {{ \$labels.namespace }} thực hiện hành động nguy hiểm: {{ \$labels.rule }}."
EOF
kubectl create configmap security-alerts-rules -n monitoring --from-file=alerting-rules.yaml=/tmp/security-alerts-rules.yaml
Cập nhật Prometheus config để load rules này (chỉnh sửa values.yaml hoặc configmap):
helm upgrade prometheus prometheus-community/prometheus -n monitoring --set-file alerting.rules.security-alerts-rules=/tmp/security-alerts-rules.yaml
Tạo Dashboard JSON cho Security Overview
Thay vì vẽ thủ công, ta sẽ import một dashboard JSON có sẵn các panel cho OPA và Falco, sau đó tùy chỉnh biến (variables) để lọc theo Tenant.
Tạo file dashboard.json và import vào Grafana qua API hoặc UI:
cat > /tmp/security-dashboard.json
Import dashboard vào Grafana (dùng API hoặc UI -> Import -> Upload file):
curl -X POST http://localhost:3000/api/dashboards/import \
-H "Content-Type: application/json" \
-H "Authorization: Basic \$(echo -n 'admin:SecurePass123' | base64)" \
-d @/tmp/security-dashboard.json
Kết quả mong đợi: Dashboard "Multi-Tenant Security & Compliance Overview" xuất hiện trong Grafana, hiển thị biểu đồ OPA violations và Falco events.
Verify kết quả
Tạo một sự kiện vi phạm để kiểm tra dashboard:
kubectl apply -f -
Quan sát dashboard Grafana: Panel "OPA Violations" sẽ tăng lên nếu có constraint cấm runAsNonRoot, và panel "Falco Events" có thể tăng nếu có rule phát hiện container chạy với root.
Tự động hóa báo cáo tuân thủ (Compliance Report) theo định kỳ
Chúng ta sẽ xây dựng một Job Cron để tự động thu thập dữ liệu từ Audit Log, Prometheus, và Dashboard, sau đó tổng hợp thành báo cáo PDF/JSON gửi email cho từng tenant hoặc quản trị viên.
Chạy Cron Job để thu thập dữ liệu
Sử dụng CronJob Kubernetes để chạy một container (có cài đặt tools như `curl`, `jq`, `wkhtmltopdf` hoặc script Python) vào mỗi sáng thứ Hai.
Tạo CronJob để thu thập metric và log:
cat > /tmp/compliance-cronjob.yaml
Tạo PersistentVolumeClaim để lưu báo cáo (nếu chưa có):
kubectl apply -f -
Tự động gửi báo cáo qua Email hoặc Slack
Để báo cáo được gửi đi, ta sẽ mở rộng CronJob trên bằng cách thêm bước gửi email hoặc webhook Slack sau khi tạo file JSON.
Cập nhật script Python trong CronJob để gửi webhook Slack:
cat > /tmp/slack-webhook-script.py
Chỉnh sửa CronJob để chạy script này sau khi tạo báo cáo (dùng multiple commands hoặc chain script).
Verify kết quả
Để test ngay lập tức mà không đợi đến thứ Hai, ta tạo một Job một lần chạy script:
kubectl create job test-compliance-run --from=cronjob/compliance-report-generator -n monitoring
kubectl logs -f job/test-compliance-run -n monitoring
Kiểm tra file báo cáo đã được tạo:
kubectl exec -it deployment/grafana -n monitoring -- ls /app/reports/ 2>/dev/null || kubectl get pvc -n monitoring
Kiểm tra log của Job xem có thông báo "Report generated successfully" hay không. Nếu cấu hình Slack, bạn sẽ nhận được tin nhắn trên kênh Slack.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Secure Multi-Tenant Data Platform với Kubernetes, Falco, OPA và Apache Iceberg để bảo vệ dữ liệu doanh nghiệp trong môi trường chia sẻ tài nguyên
« Phần 7: Tự động hóa quy trình onboarding và offboarding cho tenant mới
Phần 9: Xử lý sự cố, tối ưu hiệu năng và các kỹ thuật nâng cao »