Cài đặt và Cấu hình Oauth2-Proxy trên Máy chủ Ứng dụng
Chúng ta sẽ triển khai Oauth2-Proxy như một reverse proxy đứng trước ứng dụng đích (backend). Proxy này sẽ chặn mọi truy cập trực tiếp và yêu cầu xác thực qua IdP (Authelia/Keycloak) đã cấu hình ở Phần 2.
1. Cài đặt Binary Oauth2-Proxy
Tải binary mới nhất từ kho GitHub chính thức. Giả sử chúng ta đang làm việc trên máy chủ ứng dụng (Application Server) chạy Ubuntu/Debian.
Tại sao: Sử dụng binary trực tiếp đảm bảo phiên bản mới nhất với các tính năng bảo mật và ít phụ thuộc vào package manager có thể bị lỗi thời.
Kết quả mong đợi: File binary `oauth2-proxy` được tải về và có quyền thực thi.
curl -L https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v7.5.1/oauth2-proxy_linux_amd64 -o /usr/local/bin/oauth2-proxy
chmod +x /usr/local/bin/oauth2-proxy
2. Tạo người dùng và nhóm hệ thống
Tạo người dùng chuyên biệt để chạy dịch vụ proxy, giảm thiểu rủi ro nếu bị khai thác (principle of least privilege).
Tại sao: Chạy service với root là nguy hiểm. Chúng ta cần một user riêng để sở hữu config file và logs.
Kết quả mong đợi: User và group `oauth2proxy` được tạo ra.
useradd -r -m -d /etc/oauth2-proxy -s /bin/bash oauth2proxy
3. Cấu hình file Oauth2-Proxy
Tạo file cấu hình chính tại `/etc/oauth2-proxy/oauth2-proxy.cfg`. Nội dung này giả định bạn đã có Client ID và Client Secret từ IdP (Authelia hoặc Keycloak) ở Phần 2.
Tại sao: File cấu hình tập trung giúp quản lý các thông số kết nối đến IdP, upstream backend, và cookie secrets.
Kết quả mong đợi: File cấu hình được tạo với các tham số đúng chuẩn để proxy có thể handshake với IdP.
cat > /etc/oauth2-proxy/oauth2-proxy.cfg
Sau khi tạo file, cần đổi quyền sở hữu cho user đã tạo ở bước 2.
chown -R oauth2proxy:oauth2proxy /etc/oauth2-proxy
4. Tạo Systemd Service
Tạo file unit để khởi động Oauth2-Proxy cùng hệ thống.
Tại sao: Đảm bảo dịch vụ tự động start khi reboot và có thể quản lý qua systemctl.
Kết quả mong đợi: Service `oauth2-proxy.service` được enable và active.
cat > /etc/systemd/system/oauth2-proxy.service
5. Kiểm tra trạng thái Oauth2-Proxy
Verify service đang chạy và log không có lỗi.
systemctl status oauth2-proxy
journalctl -u oauth2-proxy -f
Kết quả mong đợi: Status hiện `active (running)` và log hiển thị dòng `Listening on 127.0.0.1:4180`.
Tích hợp OpenZiti Tunnel và Cấu hình Proxy
Bây giờ chúng ta chuyển sang phần quan trọng nhất: buộc Oauth2-Proxy chỉ chấp nhận lưu lượng từ OpenZiti Network thông qua Ziti Tunnel.
1. Cài đặt Ziti Tunnel Client
Cài đặt client `ziti-tunnel` trên cùng máy chủ ứng dụng. Giả sử bạn đã có file `ziti-tunnel-linux-amd64` từ máy chủ OpenZiti Edge.
Tại sao: Ziti Tunnel đóng vai trò là một local proxy (loopback) trên máy chủ ứng dụng, tạo ra một tunnel mã hóa từ OpenZiti Edge Router đến local port của máy chủ.
Kết quả mong đợi: Binary `ziti-tunnel` được đặt vào `/usr/local/bin`.
mv ziti-tunnel-linux-amd64 /usr/local/bin/ziti-tunnel
chmod +x /usr/local/bin/ziti-tunnel
2. Cấu hình Ziti Tunnel (tunneler.yaml)
Tạo file cấu hình tunnel để lắng nghe trên `127.0.0.1:4180` (port mà Oauth2-Proxy đang chạy) và chuyển tiếp traffic qua OpenZiti.
Tại sao: Oauth2-Proxy đang listen ở `127.0.0.1:4180`. Chúng ta cần Ziti Tunnel bắt traffic từ OpenZiti Network (địa chỉ ảo) và forward vào port này. Điều này đảm bảo chỉ traffic đi qua OpenZiti mới đến được Oauth2-Proxy.
Kết quả mong đợi: File config `tunneler.yaml` được tạo với cấu trúc đúng.
cat > /etc/oauth2-proxy/tunneler.yaml
Chú ý: `identity` là tên của identity đã tạo trong OpenZiti Controller (Phần 3) dành riêng cho máy chủ này. `bindAddress` và `bindPort` là nơi Oauth2-Proxy đang listen.
3. Chuẩn bị File Identity (PEM)
Copy file identity `.pem` từ OpenZiti Controller vào thư mục cấu hình.
Tại sao: Ziti Tunnel cần file này để xác thực với OpenZiti Network khi thiết lập tunnel.
Kết quả mong đợi: File `your-ziti-app-identity.pem` nằm trong `/etc/oauth2-proxy/`.
cp /path/to/downloaded/your-ziti-app-identity.pem /etc/oauth2-proxy/
chown oauth2proxy:oauth2proxy /etc/oauth2-proxy/your-ziti-app-identity.pem
4. Tạo Systemd Service cho Ziti Tunnel
Tạo service để chạy ziti-tunnel, đảm bảo nó khởi động trước hoặc cùng lúc với Oauth2-Proxy.
Tại sao: Nếu Ziti Tunnel chưa chạy, Oauth2-Proxy sẽ không thể nhận traffic từ bên ngoài (vì Oauth2-Proxy chỉ listen localhost).
Kết quả mong đợi: Service `ziti-tunnel.service` chạy ổn định.
cat > /etc/systemd/system/ziti-tunnel.service
5. Cấu hình Proxy Backend trong Oauth2-Proxy
Cập nhật lại config của Oauth2-Proxy để upstream trỏ vào địa chỉ mà Ziti Tunnel đang bind, hoặc giữ nguyên `127.0.0.1:8080` nếu backend chạy trực tiếp trên localhost. Tuy nhiên, trong mô hình Zero-Trust này, luồng traffic sẽ là: Ziti -> Oauth2-Proxy -> Backend.
Tại sao: Oauth2-Proxy hiện tại đang listen ở `127.0.0.1:4180`. Ziti Tunnel đang bind ở `127.0.0.1:4180`. Điều này có nghĩa là bất kỳ traffic nào từ OpenZiti sẽ vào Ziti Tunnel, sau đó Ziti Tunnel forward vào Oauth2-Proxy. Oauth2-Proxy sẽ xác thực, rồi forward vào Backend (`127.0.0.1:8080`).
Không cần thay đổi config Oauth2-Proxy nếu backend vẫn chạy ở `127.0.0.1:8080`. Điểm mấu chốt là Oauth2-Proxy chỉ listen trên localhost (`127.0.0.1:4180`), do đó nó không thể bị truy cập trực tiếp từ mạng LAN hay Internet trừ khi qua Ziti Tunnel.
Thiết lập Luồng Truy cập và Kiểm thử
Bây giờ chúng ta sẽ kiểm tra toàn bộ luồng: Client -> OpenZiti -> Ziti Tunnel -> Oauth2-Proxy -> Backend.
1. Kiểm tra trạng thái Tunnel
Verify Ziti Tunnel đã kết nối thành công với OpenZiti Network.
ziti-tunnel status --config=/etc/oauth2-proxy/tunneler.yaml
Kết quả mong đợi: Status hiển thị `connected` và tunnel `app-backend` đang lắng nghe ở `0.0.0.0:4180` (hoặc địa chỉ bind đã cấu hình).
2. Cấu hình Backend giả lập (Test)
Nếu chưa có backend thật, tạo một service đơn giản chạy trên port 8080 để test.
echo "Hello from Zero-Trust Backend" > /var/www/html/index.html
cd /var/www/html
python3 -m http.server 8080 &
Tại sao: Cần một điểm đích để Oauth2-Proxy forward traffic vào.
3. Truy cập từ Client Zero-Trust
Trên máy Client đã cài đặt Ziti Edge Client (từ Phần 6 sắp tới), thực hiện kết nối.
Tại sao: Client sẽ tạo tunnel qua OpenZiti, đi đến máy chủ ứng dụng, vào Ziti Tunnel, vào Oauth2-Proxy, và cuối cùng là Backend.
Thực hiện lệnh trên Client (giả sử DNS của OpenZiti trỏ về địa chỉ này):
curl https://your-app-domain.your-domain.com/
Kết quả mong đợi:
- Trước khi xác thực: Browser hiển thị trang login của IdP (Authelia/Keycloak).
- Sau khi đăng nhập thành công: Browser hiển thị nội dung `Hello from Zero-Trust Backend`.
4. Kiểm tra từ bên ngoài (Phải bị chặn)
Thử truy cập trực tiếp vào địa chỉ IP công cộng của máy chủ ứng dụng (bỏ qua OpenZiti).
curl http://:4180/
Tại sao: Oauth2-Proxy được cấu hình `http_address = 127.0.0.1:4180`. Nó không listen trên interface công cộng. Do đó, kết nối trực tiếp sẽ bị từ chối.
Kết quả mong đợi: Kết nối bị từ chối (`Connection refused`) hoặc timeout, chứng tỏ traffic không đi qua Ziti Tunnel sẽ không đến được Oauth2-Proxy.
5. Xem Log truy cập
Xem log để xác nhận luồng đi qua Oauth2-Proxy.
journalctl -u oauth2-proxy -f | grep "200 OK"
Kết quả mong đợi: Log hiển thị các request HTTP 200 OK đi kèm với thông tin user đã xác thực.
Đ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 4: Cấu hình Cloudflare Access để bảo vệ điểm cuối
Phần 6: Thiết lập Client Zero-Trust và trải nghiệm người dùng »