APISIX 如何與 Hydra 整合,搭建集中認證閘道器助力企業安全

Apache_APISIX發表於2022-07-12

本文介紹了Apache APISIX 如何與 Hydra 整合實現集中式身份認證。

背景介紹

Apache APISIX

Apache APISIX 是一個開源的雲原生 API 閘道器,作為 API 閘道器,它兼具動態、實時、高效能等特點,提供了負載均衡、動態上游、灰度釋出、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。你可以使用 APISIX 來處理傳統的南北向流量,以及服務間的東西向流量,也可以當做 K8s Ingress controller 來使用。

APISIX 的 OpenID Connect 外掛支援 OpenID Connect 協議,使用者可以使用該外掛讓 APISIX 對接眾多鑑權服務提供商,作為集中式認證閘道器部署於企業中。

Hydra

Ory Hydra 是支援 OAuth 2.0 和 OpenID Connect 協議的身份提供商之一,基於 OAuth 2.0 授權框架以及 Open ID Connect Core 1.0 框架實現,兼具開源與雲原生特性。它可以與任何登入系統整合,通過 OAuth 2.0 Acces、Refresh 和 ID Tokens,使得第三方能夠輕鬆訪問你的 API,實現使用者隨時隨地與任何應用程式的互動。

Ory Hydra 採用 Go 語言編寫,為幾乎所有語言都提供了 SDK,包括 Dart、.NET、Go、Java、PHP、Python、Ruby、Rust 和 Typescript。它適用於任何登入系統,並且可以輕鬆自定義登入體驗。

簡介

OpenID 是一種集中認證模式,它是一個去中心化的身份認證系統。使用 OpenID 的好處是,使用者只需要在一個 OpenID 身份提供方的網站上註冊和登入,使用一份賬戶密碼資訊即可訪問不同應用。

通過 APISIX 支援的 openid-connect 外掛,可以與支援 OpenID Connect 協議的認證程式整合。比如 Ory Hydra。

Ory Hydra 的最大優勢之一是:它實現了 OAuth 和 OpenID Connect 標準,而不是強制你使用“Hydra 使用者管理”(登入、登出、配置檔案管理、註冊)、特定模板引擎或者預定義的前端。

它允許使用你的程式所需的身份驗證機制(基於令牌的 2FA、SMS 2FA 等),並且在你的技術堆疊中實現使用者管理和登入。當然你也可以使用現有的解決方案,例如 authboss。它為你提供 OAuth 2.0 和 OpenID Connect 的所有優勢功能,同時對業務邏輯和技術堆疊的侵入性最小。

OAuth 2.0 適用於多種環境和多用途場景。以下資訊可能會幫助你確定 OAuth 2.0 和 Hydra 是否適合某個用例:https://www.ory.sh/docs/hydra

  1. 允許第三方的合作方訪問你的 API。
  2. 成為像 Google、Facebook 或 Microsoft 這樣的身份提供者。
  3. 使瀏覽器、移動裝置或可穿戴應用程式能夠訪問你的 API:執行 OAuth2 提供程式可以很好地實現這一點。你不必在裝置上儲存密碼,並且可以隨時撤銷訪問令牌。
  4. 想限制後端服務可以相互讀取的資訊型別。例如,只允許評論服務獲取使用者配置檔案更新,但不能讀取使用者密碼。

如何操作

接下來,將使用真實示例為你展示 APISIX 如何與 Hydra 整合。在該示例中將使用 Docker 執行所需的環境,請在執行本操作前安裝完成 Docker。

步驟一:建立並執行資料庫

為了快速部署測試環境,我們將使用 Docker 執行 PostgreSQL 作為 Hydra 的資料庫。建議不要在生產環境使用 Docker 執行資料庫。

docker network create hydraguide && \
docker run \
  --network hydraguide \
  --name ory-hydra-example--postgres \
  -e POSTGRES_USER=hydra \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=hydra \
  -d postgres:9.6

上述命令將建立一個名稱為 hydraguide 的網路,並且啟動一個名稱為 ory-hydra-example--postgres 的 Postgres 例項,該例項建立了資料庫hydra,使用者hydra和使用者密碼secret

步驟二:部署 Hydra

該步驟中會分別將 44444445 對映到 54445445 埠,請確保這些埠未被佔用。

  1. 系統金鑰只能針對新資料庫設定,不支援金鑰輪換。 此金鑰用於加密資料庫,每次程式(重新)啟動時都需要設定為相同的值。 你可以使用 /dev/urandom 生成金鑰。但請確保在你定義它的時候,該金鑰都必須相同。 例如,你可以將值儲存在某處:
export SECRETS_SYSTEM=$(export LC_CTYPE=C; cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)

通過配置環境變數,設定 Hydra 的資料庫 URL 指向 Postgres 例項。

export DSN=postgres://hydra:secret@ory-hydra-example--postgres:5432/hydra?sslmode=disable
  1. Ory Hydra 沒有自動遷移 SQL,因此你需要手動執行遷移資料庫的操作。
docker pull oryd/hydra:v1.10.6 && \
docker run -it --rm \
  --network hydraguide \
  oryd/hydra:v1.10.6 \
  migrate sql --yes $DSN
  1. 通過以下命令執行 Hydra 伺服器。更多資訊,請參考 deploy-ory-hydra
docker run -d \
  --name ory-hydra-example--hydra \
  --network hydraguide \
  -p 5444:4444 \
  -p 5445:4445 \
  -e SECRETS_SYSTEM=$SECRETS_SYSTEM \
  -e DSN=$DSN \
  -e URLS_SELF_ISSUER=https://localhost:5444/ \
  -e URLS_CONSENT=http://localhost:9020/consent \
  -e URLS_LOGIN=http://localhost:9020/login \
  oryd/hydra:v1.10.6 serve all 

你可以使用如下命令檢視 Hydra 的日誌。如果你未指定 Hydra 的密碼,可以在日誌中查到相關資訊,否則將無法重新啟動 Hydra。

 docker logs ory-hydra-example--hydra

你也可以使用以下命令檢視 Hydra 相關介紹及操作命令。

docker run -it --rm --entrypoint hydra oryd/hydra:v1.10.6 help serve

步驟三:部署登入和驗證程式

Login Provider 和 Consent Provider 可以是兩個獨立的 Web 服務。 Hydra 提供了示例程式,它在一個應用程式中結合了這兩個功能。 接下來。我們將使用 Docker 部署該應用程式。

docker pull oryd/hydra-login-consent-node:v1.10.6 && \
docker run -d \
  --name ory-hydra-example--consent \
  -p 9020:3000 \
  --network hydraguide \
  -e HYDRA_ADMIN_URL=https://ory-hydra-example--hydra:4445 \
  -e NODE_TLS_REJECT_UNAUTHORIZED=0 \
  oryd/hydra-login-consent-node:v1.10.6

你可以使用以下命令檢查程式是否執行正常:

docker logs ory-hydra-example--consent

正常返回結果:

> hydra-login-consent-logout@0.0.0 serve /usr/src/app
> node lib/app.js

Listening on http://0.0.0.0:3000

步驟四:執行 OAuth 2.0 授權程式碼流程

Hydra 支援通過 CLI 設定 OAuth 2.0 使用者和 OAuth 2.0 回撥 URL 的功能,一般情況下,這是一個請求訪問伺服器上的使用者資源的第三方應用程式。

配置 APISIX openid-connect 外掛時需要提供這些資訊:

  • id 對應的是下述路由中外掛配置的 client_id
  • secret 對應的是下述路由中外掛配置的 client_secret
  • scope 對應的是下述路由中外掛配置的 scope
docker run --rm -it \
  -e HYDRA_ADMIN_URL=https://ory-hydra-example--hydra:4445 \
  -- network hydraguide \
  oryd/hydra:v1.10.6 \
  clients create --skip-tls-verify \
    --id facebook-photo-backup \
    --secret some-secret \
    --grant-types authorization_code,refresh_token,client_credentials,implicit \
    --response-types token,code,id_token \
    --scope openid,offline,photos.read \
    --callbacks http://127.0.0.1:9010/callback

以下示例將執行一個 OAuth 2.0 授權流程。為簡化此操作,Hydra CLI 提供了一個名為 hydra token user 的輔助命令。

 docker run --rm -it \
  --network hydraguide \
  -p 9010:9010 \
  oryd/hydra:v1.10.6 \
  token user --skip-tls-verify \
    --port 9010 \
    --auth-url https://localhost:5444/oauth2/auth \
    --token-url https://localhost:5444/oauth2/token \
    --client-id facebook-photo-backup \
    --client-secret some-secret \
    --scope openid,offline,photos.read

返回結果如下則表示配置正常:

Setting up home route on http://127.0.0.1:9010/
Setting up callback listener on http://127.0.0.1:9010/callback
Press ctrl + c on Linux / Windows or cmd + c on OSX to end the process.
If your browser doesn't open automatically, navigate to:

        http://127.0.0.1:9010/

該步驟完成後將會啟動一個使用者登入程式,我們將在下一步驟中使用該程式。

步驟五:啟動 APISIX 並配置路由

如果你還沒有安裝 APISIX,請參考:安裝 APISIX

安裝完成後,僅需建立路由並配置openid-connect外掛即可。為了更直觀地驗證效果,我們還需要啟動了一個 NGINX 服務當做上游,你也可以使用已有的上游服務。

注意:本示例中的 APISIX 是安裝在宿主機上,如果是使用 Docker 啟動的 APISIX,可能會出現網路問題。
  1. 首先使用 Docker 建立一個 NGINX 上游。
docker run -d --name test-nginx -p 8083:80 nginx
  1. 通過以下命令建立路由,並配置 openid-connect 外掛。

其中 client_idclient_secretscope 是步驟四中設定的 ID。你可以參考 Preparing for Production 獲取其他資訊。從上述頁面,我們可以看到 discovery 的地址為 https://{IP:Port}/.well-known/openid-configuration

curl http://127.0.0.1:9080/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "uri":"/*",
    "plugins":{
        "openid-connect":{
            "client_id":"facebook-photo-backup",
            "client_secret":"some-secret",
            "discovery":"https://127.0.0.1:5444/.well-known/openid-configuration",
            "scope":"openid",
            "token_endpoint_auth_method": "client_secret_basic",
            "bearer_only": false,
            "redirect_uri":"http://127.0.0.1:9080/callback"
        }
    },
    "upstream":{
        "type":"roundrobin",
        "nodes":{
            "127.0.0.1:8083":1
        }
    }
}'

步驟六:訪問 APISIX

  1. 在瀏覽器中輸入http://127.0.0.1:9080/index.html,由於已經開啟了openid-connect 外掛,所以頁面被重定向到登入頁面。輸入使用者驗證程式中預設的賬號密碼。

img

  1. 選擇認證協議,並允許訪問。

img

  1. 登入成功之後,就可以訪問到上游服務的頁面。

img

總結

本文主要介紹了 Hydra 如何與 APISIX 進行整合以及 Hydra 的應用場景。你只需要在伺服器上安裝 Hydra 相關的程式,就可以直接使用它作為你的身份認證程式。這種認證方式可以減少學習和維護成本,也為使用者提供了安全和精簡的體驗。

參考:

https://www.ory.sh/docs/hydra...

https://www.ory.sh/docs/hydra...

https://www.ory.sh/docs/hydra...

https://www.ory.sh/docs/hydra...

相關文章