Vừa rồi mình có nhận được yêu cầu triển khai một ứng dụng opensource (không tiện nói tên). Ứng dụng này không không authentication, ai cũng có thể truy cập vào được, do vậy việc ứng dụng triển khai thì có một số cách
-
Custom thêm hệ thống xác thực
-
Secure bằng VPN
Nhưng những cách trên thì sẽ có vài nhược điểm như triển khai lâu, phức tạp và yêu cầu người sử dụng phải có tài khoản VPN của hệ thống.
Sau một hồi suy nghĩ thì có 1 anh đồng nghiệp đưa giải pháp đó là Oauth2-Proxy [1]. Khi sử dụng proxy này thì ta có thể tích hợp được với các IdP có hỗ trợ OAuth2, ví dụ:
- Github
- Azure
- ...
- NextCloud
oAuth2-proxy
là một proxy nên hoạt động như Nginx hay Haproxy, nhưng một số ứng dụng đặc thù không thể chỉ config upstream như [2].
## the http url(s) of the upstream endpoint. If multiple, routing is based on path
# upstreams = [
# "http://127.0.0.1:8080/"
# ]
Do vậy để có thể hoạt động ổn hơn, ta sẽ kết hợp Nginx với module auth_request
vào làm proxy đứng trước oAuth2-Proxy
. Mô hình như sau
Client
|
|
|
|
|
+------+-------+
| |
| Nginx |
| |
| |
+--+------+----+
| |
| |
| +---------+------------------+
| | |
+-----------+---+ +--+--------+ +----+-----+
| | | | | |
| | | | | |
| oAuth2-Proxy | | App-1 | | App-2 |
| | | | | |
| | | | | |
+---------------+ +-----------+ +----------+
-
Với
auth_request
module, thì các request tới nginx đều được kiểm tra trên 1 endpoint khác (ở đây là oAuth2-Proxy) -
Sau khi oAuth2-Proxy kiểm tra request thì sẽ cho phép truy cập vào
App-1
hoặcApp-2
dựa trên location request
Ta có file cấu hình Nginx như sau
server {
listen 80;
server_name localhost;
location /oauth2/ {
proxy_pass http://oauth-proxy:4180;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Auth-Request-Redirect $request_uri;
}
location / {
auth_request /oauth2/auth;
error_page 401 = /oauth2/start;
auth_request_set $auth_cookie $upstream_http_set_cookie;
add_header Set-Cookie $auth_cookie;
location /app1 {
proxy_pass http://app1;
}
location /app2 {
proxy_pass http://app2;
}
}
}
Reference
[1] - https://github.com/oauth2-proxy/oauth2-proxy
[2] - https://github.com/oauth2-proxy/oauth2-proxy/blob/master/contrib/oauth2-proxy.cfg.example#L20