Triển khai hạ tầng giám sát tập trung với Grafana Loki trên Proxmox
1. Chuẩn bị container Logstash hoặc Filebeat để thu thập Log
Chúng ta không cài đặt full ELK Stack nặng nề mà sử dụng Grafana Loki vì tính nhẹ và khả năng scale tốt cho môi trường Proxmox LXC.
Mục tiêu: Tạo một container LXC chạy Loki và Promtail để thu thập log từ các VM OpenZiti và Cloudflare Access.
Kết quả mong đợi: Container Loki chạy ổn định, truy cập được web UI tại port 3100.
pct create 100 --arch amd64 --cores 2 --cpulimit 50 --features nesting=1 --memory 2048 --nettype bridge --net0 vmbr0,ip=dhcp --rootfs local-lvm:vm-100-disk-0 --storage local-lvm --swap 512 --ostemplate ubuntu-22.04-standard --description "Loki & Promtail for Zero-Trust Monitoring"
pct set 100 --unprivileged 1
pct set 100 --feature nesting=1
pct set 100 --console enabled
pct start 100
Chờ container khởi động xong. Sau đó ssh vào container để cài đặt Docker và các dịch vụ cần thiết.
ssh root@100
# Cài đặt Docker Engine
apt update && apt install -y docker.io docker-compose-plugin
systemctl enable docker
systemctl start docker
2. Cấu hình Loki và Promtail trong Docker Compose
Tạo cấu hình tập trung để Loki lưu trữ log và Promtail đọc file log từ các host khác hoặc từ container.
Đường dẫn: /opt/monitoring/docker-compose.yml
Tại sao: Đây là lõi của hệ thống, Loki đóng vai trò lưu trữ, Promtail đóng vai trò agent thu thập.
mkdir -p /opt/monitoring
cat > /opt/monitoring/docker-compose.yml
3. Cấu hình file Loki.yaml để lưu trữ
Cấu hình Loki để lưu log vào disk và cho phép truy cập từ mạng nội bộ.
Đường dẫn: /opt/monitoring/loki-config/loki-config.yaml
Kết quả mong đợi: Loki chấp nhận nhận log qua port 3100 và lưu vào volume.
mkdir -p /opt/monitoring/loki-config
cat > /opt/monitoring/loki-config/loki-config.yaml
4. Cấu hình Promtail để thu thập log từ OpenZiti và Cloudflare
Cấu hình Promtail để đọc log từ các VM OpenZiti Controller, Edge Router và log của Cloudflare Access (nếu có file log local hoặc proxy log).
Đường dẫn: /opt/monitoring/promtail-config/promtail-config.yaml
Tại sao: Định dạng log thành cấu trúc JSON và gán label để dễ dàng truy vấn sau này.
mkdir -p /opt/monitoring/promtail-config
cat > /opt/monitoring/promtail-config/promtail-config.yaml
Khởi động stack giám sát.
cd /opt/monitoring
docker-compose up -d
Verify: Truy cập http://IP_PROXMOX:3000, đăng nhập admin/zerotrust_admin. Kiểm tra Data Source Loki đã được cấu hình tự động chưa.
Tích hợp và định dạng log từ OpenZiti Controller và Edge Router
1. Cấu hình OpenZiti Controller gửi log ra file
Chỉnh sửa config của OpenZiti Controller để ghi log ra file thay vì stdout, giúp Promtail dễ đọc hơn.
Đường dẫn: /etc/ziti/controller/config.yaml (trong VM Controller)
Kết quả mong đợi: Log được ghi vào /var/log/ziti/controller.log với định dạng JSON.
ssh root@VM_CONTROLLER_IP
cat > /etc/ziti/controller/config.yaml
2. Cấu hình OpenZiti Edge Router gửi log ra file
Áp dụng tương tự cho Edge Router để đảm bảo tất cả traffic log đều được thu thập.
Đường dẫn: /etc/ziti/edge/config.yaml (trong VM Edge Router)
Tại sao: Cần đồng nhất định dạng log để xây dựng dashboard chung.
ssh root@VM_EDGE_IP
cat > /etc/ziti/edge/config.yaml
3. Cấu hình Oauth2-Proxy (Identity-aware Proxy) log
Đảm bảo Oauth2-Proxy ghi log chi tiết về các request, auth status.
Đường dẫn: Config của container Oauth2-Proxy.
Kết quả mong đợi: Log chứa thông tin user, IP source, và status code.
ssh root@VM_PROXY_IP
# Giả sử chạy bằng docker, cần thêm flag --log-format=json hoặc config file
# Nếu dùng systemd service file:
cat > /etc/oauth2-proxy/oauth2-proxy.conf
Verify: Kiểm tra file log trên các VM, sau đó vào Grafana -> Explore -> chọn Loki -> gõ query `job=~"openziti-controller"` để xem log hiện lên.
Tích hợp log Cloudflare Access vào hệ thống giám sát
1. Cấu hình Cloudflare Access gửi log về Syslog
Cloudflare Access không tự động gửi log chi tiết về server local nếu không cấu hình. Cần cấu hình Custom Log Forwarding hoặc dùng Webhook.
Tuy nhiên, trong kịch bản này, chúng ta giả định Cloudflare Access đang proxy qua Oauth2-Proxy (như Phần 5). Log thực tế nằm ở Oauth2-Proxy.
Nếu cần log trực tiếp từ Cloudflare (Audit Log):
# Trên Proxmox Host hoặc Container Loki
# Cài đặt rsyslog để nhận log từ Cloudflare nếu dùng Syslog endpoint
apt install -y rsyslog
# Cấu hình /etc/rsyslog.d/cloudflare.conf
cat > /etc/rsyslog.d/cloudflare.conf
Tại sao: Để có một điểm tập trung cho log từ Cloudflare nếu họ hỗ trợ syslog forwarding trong plan Enterprise, hoặc log local từ proxy.
2. Cập nhật Promtail để đọc log Cloudflare
Cập nhật config Promtail (đã làm ở phần 1) để bao gồm đường dẫn file log Cloudflare mới.
Đường dẫn: /opt/monitoring/promtail-config/promtail-config.yaml
Kết quả mong đợi: Grafana có thể truy vấn log với label `job="cloudflare-access"`.
ssh root@100
# Thêm job mới vào file config Promtail
cat >> /opt/monitoring/promtail-config/promtail-config.yaml
Xây dựng Dashboard và Cảnh báo An ninh
1. Tạo Dashboard theo dõi truy cập Zero-Trust
Đang trong Grafana, tạo Dashboard mới để hiển thị các metric quan trọng.
Đường dẫn: Grafana UI -> Dashboards -> New -> Import
Kết quả mong đợi: Dashboard hiển thị số lượng login thành công, thất bại, và top IP bị chặn.
# Ví dụ query Loki để đếm số lần login thất bại
# Sử dụng trong panel Grafana
{job="oauth2-proxy"} | json | __error__ != ""
Tạo panel "Failed Authentication Attempts":
# Query: Đếm số lần 401 hoặc 403 trong 1h
sum(count_over_time({job="oauth2-proxy"} | json | __status__ = "401" | timeago(1h)))
Tạo panel "Top Attacker IPs":
# Query: Group by source IP
topk(10, sum(count_over_time({job="oauth2-proxy"} | json | __status__ = "401" | timeago(1h))) by (__source_ip__))
2. Cấu hình cảnh báo tự động (Alerting) cho sự kiện bất thường
Cấu hình Alert trong Grafana để gửi thông báo khi có dấu hiệu tấn công.
Tại sao: Để admin nhận biết ngay lập tức khi có Brute Force hoặc truy cập trái phép.
Kết quả mong đợi: Email hoặc Slack notification khi số lần login thất bại vượt ngưỡng.
# Trong Grafana -> Dashboard -> Add Alert Rule
# Condition: Last 5m, Avg > 10
# Query: sum(count_over_time({job="oauthziti-controller"} | json | __level__ = "error" | timeago(5m)))
# Notification Channel: Email (cần cấu hình SMTP trong Grafana Settings)
Cấu hình cụ thể cho Alert Rule "Brute Force Detection":
# Query Loki trong Alert Rule
sum(count_over_time({job="oauth2-proxy"} | json | __status__ = "401" | timeago(5m)))
# Threshold: > 50 (50 lần thất bại trong 5 phút)
# For: 1m
# Labels: severity=critical, service=zero-trust
Cấu hình Email Alert trong Grafana:
ssh root@100
# Chỉnh sửa /etc/grafana/grafana.ini trong container hoặc mount volume
# Trong /opt/monitoring/grafana-data/grafana.ini (nếu mount) hoặc vào container
docker exec -it grafana_container_id sh
cat >> /etc/grafana/grafana.ini
3. Verify toàn bộ hệ thống giám sát
Thực hiện các bước kiểm tra cuối cùng để đảm bảo luồng log hoạt động.
- Thực hiện login sai 5 lần vào ứng dụng được bảo vệ bởi Oauth2-Proxy.
- Vào Grafana -> Explore, chọn thời gian 5 phút qua.
- Chạy query: `{job="oauth2-proxy"} | json | __status__ = "401"`.
- Quan sát panel "Failed Authentication Attempts" tăng lên.
- Kiểm tra email hoặc kênh notification đã nhận được cảnh báo chưa.
# Command để test log output từ CLI (tạm thời)
curl -u user:wrongpassword http://IP_PROXY:4180
# Sau đó check log trong Grafana
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Zero-Trust Network cho doanh nghiệp với OpenZiti, Cloudflare Access và Identity-aware Proxy trên hạ tầng Proxmox
« Phần 6: Thiết lập Client Zero-Trust và trải nghiệm người dùng
Phần 8: Chiến lược Backup, High Availability và Disaster Recovery »