Tại sao bạn không nên để Dashboard “lộ thiên”?
Anh em làm DevOps thường xuyên triển khai các công cụ như Prometheus, Grafana hay dashboard nội bộ. Oái oăm ở chỗ, phần lớn các công cụ này hoặc không có tính năng đăng nhập, hoặc cơ chế phân quyền (RBAC) cực kỳ lỏng lẻo.
Nói thật, mình từng nếm trái đắng vì chủ quan. Mình từng nghĩ chỉ cần chạy dashboard ở port lạ (như 8081, 9090) là an toàn. Kết quả? Một buổi sáng check log, mình phát hiện hơn 5.000 request brute-force SSH và hàng loạt scan từ các IP lạ. Bài học nhớ đời là: Cứ cái gì thò mặt ra Internet thì phải có lớp xác thực tử tế.
Thay vì tốn công code thêm module Login cho từng app, OAuth2 Proxy là giải pháp cứu cánh cực nhanh. Nó đóng vai trò một lớp bảo vệ (Reverse Proxy) đứng chặn trước ứng dụng. Người dùng muốn xem biểu đồ Grafana? Họ bắt buộc phải qua bước đăng nhập Google hoặc GitHub của công ty. Chỉ khi xác thực thành công, OAuth2 Proxy mới mở cửa cho phép truy cập vào bên trong.
Cài đặt OAuth2 Proxy thực tế
Có nhiều cách cài đặt, nhưng mình ưu tiên dùng Docker Compose. Cách này giúp bạn quản lý cấu hình tập trung và dễ dàng triển khai lên các môi trường khác nhau.
1. Đăng ký OAuth Provider với Google
Đầu tiên, bạn cần một bộ chìa khóa từ Google Cloud Console để kích thực tính năng đăng nhập:
- Truy cập Google Cloud Console và tạo một Project.
- Vào mục APIs & Services > Credentials.
- Tạo OAuth client ID loại Web application.
- Tại ô Authorized redirect URIs, điền đúng địa chỉ:
https://dashboard.cua-ban.com/oauth2/callback.
2. Triển khai nhanh bằng Docker Compose
Dưới đây là file docker-compose.yml mình hay dùng. Giả sử ứng dụng nội bộ của bạn đang chạy tại port 8080.
version: '3'
services:
oauth2-proxy:
image: quay.io/oauth2-proxy/oauth2-proxy:latest
ports:
- "4180:4180"
environment:
OAUTH2_PROXY_PROVIDER: "google"
OAUTH2_PROXY_CLIENT_ID: "your-id.apps.googleusercontent.com"
OAUTH2_PROXY_CLIENT_SECRET: "your-secret"
# Tạo secret bằng: python3 -c 'import os,base64; print(base64.urlsafe_b64encode(os.urandom(16)).decode())'
OAUTH2_PROXY_COOKIE_SECRET: "dGhpcy1pcy1hLXNlY3JldC1rZXk="
OAUTH2_PROXY_EMAIL_DOMAINS: "yourcompany.com"
OAUTH2_PROXY_UPSTREAMS: "http://your-app:8080"
OAUTH2_PROXY_HTTP_ADDRESS: "0.0.0.0:4180"
OAUTH2_PROXY_REDIRECT_URL: "https://dashboard.cua-ban.com/oauth2/callback"
Chiến thuật tích hợp Nginx chuyên nghiệp
Trong thực tế, chúng ta hiếm khi để OAuth2 Proxy tiếp nhận traffic trực tiếp. Phương án tối ưu là dùng Nginx làm entry point để xử lý SSL và điều phối request.
Tận dụng module auth_request
Mẹo này cực kỳ đáng tiền: Sử dụng directive auth_request. Khi có request, Nginx sẽ hỏi OAuth2 Proxy xem user này đã login chưa. Nếu rồi thì cho qua, nếu chưa thì đá sang trang Login của Google ngay lập tức.
Cấu hình Nginx mẫu cho anh em:
server {
listen 443 ssl;
server_name dashboard.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
location /oauth2/ {
proxy_pass http://127.0.0.1:4180;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Auth-Request-Redirect $request_uri;
}
location / {
auth_request /oauth2/auth;
error_page 401 = /oauth2/start?rd=$scheme://$host$request_uri;
# Truyền thông tin user vào header cho app backend xử lý nếu cần
auth_request_set $email $upstream_http_x_auth_request_email;
proxy_set_header X-Email $email;
proxy_pass http://127.0.0.1:8080;
}
}
Lưu ý các thông số “sống còn”
- Cookie Secret: Đây là chuỗi mã hóa phiên đăng nhập trên trình duyệt. Tuyệt đối không dùng chuỗi mặc định để tránh bị giả mạo session.
- Email Domains: Nếu setup cho công ty, hãy điền domain cụ thể (ví dụ:
vinadata.vn). Để dấu*nghĩa là bất kỳ ai có Gmail cũng vào được, rất rủi ro. - auth_request: Cơ chế này giúp kiểm tra session ngầm, không làm gián đoạn trải nghiệm người dùng.
Kiểm tra và xử lý lỗi
Sau khi khởi động lại service, hãy thử truy cập domain. Nếu màn hình Google Login hiện ra thay vì Dashboard, chúc mừng bạn đã thành công.
Mẹo Debug nhanh
Lỗi phổ biến nhất là Invalid Redirect URI do khai báo sai URL trên Google Console. Bạn hãy check log container để bắt bệnh chính xác:
docker logs -f oauth2-proxy-container-id
Một dòng log “đẹp” khi đăng nhập thành công sẽ có dạng:
[2023/10/27 10:00:01] [auth.go:12] authenticated user: "[email protected]"
3 kinh nghiệm thực chiến bổ sung
- Giới hạn theo GitHub Team: Nếu dùng GitHub, bạn có thể chỉ cho phép team
SREhoặcLead-Devtruy cập bằng flag--github-team. - Tự động Refresh Token: Cấu hình
--cookie-refreshkhoảng 1 giờ để đảm bảo session luôn tươi mới mà không bắt user login lại liên tục. - Gia cố Header: Luôn thêm
X-Frame-Options: DENYvào Nginx để chặn đứng các cuộc tấn công clickjacking vào trang quản trị.
Triển khai OAuth2 Proxy chỉ mất khoảng 15-30 phút nhưng hiệu quả bảo mật mang lại là cực lớn. Bạn sẽ không còn phải lo quản lý hàng chục mật khẩu lẻ tẻ hay lộ port dashboard nữa. Chúc anh em setup mượt mà và ngủ ngon giấc hơn!

