Secure các application bằng oAuth2 không cần sửa code

Secure các application bằng oAuth2 không cần sửa code

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ụ:

  • Google
  • Github
  • Azure
  • Facebook
  • ...
  • 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ặc App-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

Show Comments