1. Thiết lập mTLS giữa OpenTelemetry Collector và Backend
1.1. Tạo chứng chỉ tự ký (Self-signed CA) cho hạ tầng
Tạo bộ chứng chỉ gốc (CA) để ký cho các chứng chỉ server và client. Đây là bước nền tảng để thiết lập tin cậy giữa các thành phần trong cụm Hybrid Cloud.
Sử dụng OpenSSL để tạo Private Key và Certificate cho CA. Thực hiện lệnh này trong thư mục làm việc của bạn.
mkdir -p /etc/observability/certs && cd /etc/observability/certs
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=Observability-CA/O=DevOps-Team"
Kết quả mong đợi: Tạo ra hai file ca.key và ca.crt trong thư mục /etc/observability/certs. File ca.crt sẽ được dùng làm trust anchor cho tất cả các thành phần.
1.2. Tạo chứng chỉ cho Backend (Prometheus/Loki)
Tạo chứng chỉ server cho Prometheus và Loki. Chứng chỉ này sẽ được backend dùng để xác minh danh tính với OpenTelemetry Collector và trình duyệt.
Đảm bảo Common Name (CN) và Subject Alternative Names (SAN) khớp với hostname hoặc FQDN mà các client sẽ kết nối tới.
cd /etc/observability/certs
# Tạo CSR và Key cho Prometheus
openssl req -new -keyout prometheus.key -out prometheus.csr -subj "/CN=prometheus.observability.svc.cluster.local/O=DevOps-Team"
openssl x509 -req -in prometheus.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out prometheus.crt -days 365 -sha256 -extfile
Kết quả mong đợi: Có thêm các cặp file prometheus.key, prometheus.crt và loki.key, loki.crt. Các chứng chỉ này đã được ký bởi CA vừa tạo.
1.3. Tạo chứng chỉ cho OpenTelemetry Collector (Client)
Tạo chứng chỉ client cho OpenTelemetry Collector. Collector đóng vai trò client khi gửi dữ liệu vào Prometheus/Loki qua mTLS.
Công việc này giúp đảm bảo chỉ có Collector hợp lệ mới được phép gửi dữ liệu vào backend.
cd /etc/observability/certs
# Tạo CSR và Key cho OTLP Collector
openssl req -new -keyout collector.key -out collector.csr -subj "/CN=otel-collector/O=DevOps-Team"
openssl x509 -req -in collector.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out collector.crt -days 365 -sha256 -extfile collector.pem
Kết quả mong đợi: File collector.pem chứa cả chứng chỉ và key riêng, sẵn sàng để mount vào container Collector.
1.4. Cấu hình OpenTelemetry Collector để sử dụng mTLS
Cấu hình file otel-collector-config.yaml để bật TLS cho exporter gửi dữ liệu đến Prometheus và Loki.
Trong phần tls của exporter, chỉ định đường dẫn đến file CA (để verify server), file certificate (để xác thực client) và file key.
mkdir -p /etc/otel-collector
cat > /etc/otel-collector/otel-collector-config.yaml
Kết quả mong đợi: File cấu hình được tạo thành công. Khi Collector khởi động, nó sẽ từ chối kết nối nếu không có chứng chỉ hợp lệ từ server.
1.5. Verify kết quả mTLS
Khởi động Prometheus và Loki với chứng chỉ server tương ứng, sau đó khởi động Collector với cấu hình trên.
Quan sát log của Collector. Nếu mTLS thành công, bạn sẽ thấy thông báo kết nối thành công. Nếu thất bại, log sẽ hiện lỗi x509: certificate signed by unknown authority hoặc tls: failed to verify certificate.
docker logs otel-collector-container | grep -i "tls\|connection"
Để kiểm tra sâu hơn, chạy lệnh curl từ container Collector để thử kết nối HTTPS đến backend:
curl -v --cacert /etc/certs/ca.crt --cert /etc/certs/collector.crt --key /etc/certs/collector.key https://prometheus.observability.svc.cluster.local:9090
Kết quả mong đợi: Thu được HTTP 200 hoặc nội dung API của Prometheus. Nếu thấy lỗi TLS handshake, kiểm tra lại đường dẫn file và nội dung SAN trong chứng chỉ.
2. Quản lý chứng chỉ và Secret trong Kubernetes
2.1. Tạo Kubernetes Secret chứa chứng chỉ
Chuyển đổi các file chứng chỉ đã tạo ở phần 1 thành Kubernetes Secret để mount vào Pod một cách an toàn.
Sử dụng kubectl create secret generic để tạo secret cho từng thành phần. Tuyệt đối không hardcode nội dung key vào file YAML.
kubectl create secret generic prometheus-tls --from-file=ca.crt=/etc/observability/certs/ca.crt --from-file=tls.crt=/etc/observability/certs/prometheus.crt --from-file=tls.key=/etc/observability/certs/prometheus.key --namespace=observability
kubectl create secret generic loki-tls --from-file=ca.crt=/etc/observability/certs/ca.crt --from-file=tls.crt=/etc/observability/certs/loki.crt --from-file=tls.key=/etc/observability/certs/loki.key --namespace=observability
kubectl create secret generic otel-collector-tls --from-file=ca.crt=/etc/observability/certs/ca.crt --from-file=tls.crt=/etc/observability/certs/collector.crt --from-file=tls.key=/etc/observability/certs/collector.key --namespace=observability
Kết quả mong đợi: Tạo thành công 3 Secret trong namespace observability với tên prometheus-tls, loki-tls và otel-collector-tls.
2.2. Mount Secret vào Prometheus Deployment
Cấu hình Deployment của Prometheus để mount Secret vào container và cập nhật file prometheus.yml để bật TLS.
Chỉnh sửa global hoặc scrape_configs để chỉ định đường dẫn chứng chỉ. Prometheus cần key và cert để lắng nghe HTTPS, và CA để verify client (nếu cần).
cat > /etc/prometheus/prometheus.yml k8s-prometheus-deployment.yaml k8s-prometheus-deployment.yaml
Kết quả mong đợi: Prometheus khởi động lại và lắng nghe cổng 9090 qua HTTPS. Các request HTTP thường sẽ bị từ chối.
2.3. Mount Secret vào Loki Deployment
Tương tự như Prometheus, cấu hình Loki để sử dụng chứng chỉ từ Secret.
Loki cần cấu hình trong file loki-config.yaml phần server để bật HTTPS.
cat > /etc/loki/loki-config.yaml k8s-loki-deployment.yaml k8s-loki-deployment.yaml
Kết quả mong đợi: Loki lắng nghe HTTPS trên cổng 3100 và yêu cầu client (Collector) phải có chứng chỉ hợp lệ để push log.
2.4. Mount Secret vào OpenTelemetry Collector
Cấu hình Deployment của Collector để mount Secret chứa chứng chỉ client vào container.
Đảm bảo đường dẫn trong otel-collector-config.yaml khớp với đường dẫn mount trong Kubernetes.
# Cập nhật Deployment.yaml của Collector
cat >> k8s-otel-collector-deployment.yaml k8s-otel-collector-deployment.yaml
Kết quả mong đợi: Collector có thể đọc được chứng chỉ và key để thiết lập kết nối mTLS với Prometheus và Loki.
2.5. Verify kết quả Secret trong K8s
Kiểm tra xem Secret đã được tạo đúng và Pod đã mount volume thành công.
kubectl get secret -n observability | grep tls
kubectl describe pod otel-collector -n observability | grep -A 5 "Mounts:"
Kết quả mong đợi: Thấy các secret trong danh sách và thông tin volume mount trong describe pod.
3. Áp dụng RBAC trong Grafana và Prometheus
3.1. Cấu hình Role-Based Access Control (RBAC) trong Prometheus
Prometheus không có hệ thống RBAC phức tạp như Kubernetes, nhưng ta có thể giới hạn truy cập vào API scraping và query thông qua prometheus.yml và cơ chế Authentication.
Tuy nhiên, để bảo vệ endpoint scraping khỏi truy cập trái phép, ta dùng basic_auth hoặc bearer_token trong remote_write và scrape_configs.
cat > /etc/prometheus/prometheus-rbac.yml
Kết quả mong đợi: Prometheus chỉ scrape được các target có username/password hoặc token đúng. Các request không hợp lệ sẽ bị từ chối ở tầng scrape.
3.2. Thiết lập RBAC trong Grafana
Cấu hình file grafana.ini để bật Auth và định nghĩa Role. Grafana hỗ trợ 3 role mặc định: Viewer, Editor, Admin.
Ta sẽ cấu hình để hạn chế người dùng bình thường chỉ được xem Dashboard, không được phép tạo Alert hoặc xóa DataSource.
mkdir -p /etc/grafana
cat > /etc/grafana/grafana.ini
Kết quả mong đợi: Khi đăng nhập, user mới (nếu cho phép sign up) sẽ mặc định là Viewer. Admin có toàn quyền.
3.3. Provisioning Role và Permission trong Grafana
Sử dụng grafana/provisioning để định nghĩa Role và Permission một cách tự động, thay vì cấu hình thủ công qua UI.
Tạo file roles.yaml để gán permission cụ thể cho từng role, ví dụ: chỉ cho phép xem Dashboard, không cho phép edit.
mkdir -p /etc/grafana/provisioning/roles
cat > /etc/grafana/provisioning/roles/roles.yaml
Kết quả mong đợi: Khi khởi động Grafana, các Role và Team sẽ được tự động tạo. User thuộc DevOps-Team sẽ có quyền chỉnh sửa Dashboard.
3.4. Verify kết quả RBAC
Đăng nhập vào Grafana với tài khoản khác nhau và thử thực hiện các hành động.
Thử tạo Dashboard mới với user có role Read-Only Analyst. Hệ thống phải hiện lỗi Permission denied hoặc Access denied.
curl -u "analyst:password" -X POST http://grafana:3000/api/dashboards -H "Content-Type: application/json" -d '{"dashboard": {"title": "Test"}}'
Kết quả mong đợi: Trả về HTTP 403 Forbidden. Nếu trả về 200 OK, cấu hình RBAC chưa đúng.
4. Bảo vệ endpoint scraping và log ingestion
4.1. Bảo vệ Prometheus Endpoint từ truy cập mạng
Hạn chế truy cập vào cổng 9090 của Prometheus chỉ từ các IP nội bộ hoặc từ OpenTelemetry Collector.
Sử dụng NetworkPolicy trong Kubernetes để chặn tất cả traffic incoming trừ traffic từ namespace chứa Collector.
cat > /etc/k8s/prometheus-networkpolicy.yaml
Kết quả mong đợi: Các Pod khác trong cluster (không phải Collector) không thể truy cập Prometheus qua cổng 9090.
4.2. Bảo vệ Loki Ingestion Endpoint
Loki cần được bảo vệ tương tự, đặc biệt là endpoint /loki/api/v1/push.
Cấu hình NetworkPolicy cho Loki và bật auth_enabled trong Loki config (nếu dùng Loki v2.8+) hoặc dùng Middleware Proxy (như Envoy/Istio) để enforce mTLS.
cat > /etc/k8s/loki-networkpolicy.yaml
Kết quả mong đợi: Chỉ có OpenTelemetry Collector mới có thể push log vào Loki. Các service khác cố gắng push log sẽ bị drop tại tầng mạng.
4.3. Giới hạn tốc độ (Rate Limiting) cho Ingestion
Chống tấn công DDoS hoặc lỗi ứng dụng spam log bằng cách giới hạn số lượng request trên giây.
Trong Loki, cấu hình ingester để giới hạn kích thước batch hoặc số lượng series. Trong Prometheus, dùng remote_write với retry logic hợp lý.
cat >> /etc/loki/loki-config.yaml
Kết quả mong đợi: Nếu có lượng log quá lớn (trên 10MB/s), Loki sẽ từ chối ghi log (HTTP 429) để bảo vệ hệ thống không bị treo.
4.4. Verify kết quả bảo vệ Endpoint
Thử truy cập endpoint Prometheus và Loki từ một Pod giả lập (không phải Collector) trong cùng namespace.
# Tạo pod test
kubectl run test-pod --image=alpine:latest --rm -it --restart=Never -- nsenter --net=/var/run/netns/default curl -v http://prometheus.observability.svc.cluster.local:9090
# Hoặc từ bên ngoài cluster (nếu expose Service)
curl -v http://:30009
Kết quả mong đợi: Kết nối bị từ chối (Connection refused) hoặc timeout do NetworkPolicy chặn. Nếu mTLS được bật, sẽ thấy lỗi TLS handshake.
Điều hướng series:
Mục lục: Series: Series: Xây dựng hệ thống observability toàn diện (Logging, Metrics, Tracing) cho môi trường Hybrid Cloud với Prometheus, Grafana và OpenTelemetry
« Phần 6: Cấu hình Alerting: Thiết lập hệ thống cảnh báo thông minh
Phần 8: Tối ưu hiệu năng và quản lý chi phí cho môi trường Hybrid »