
使用Python語言調用零一萬物API實戰指南
OPA 提供了一種名為 Rego 的聲明性語言,用于在整個系統中創建和實施策略。當向 OPA 請求策略決策時,它會根據文件中提供的規則和數據來評估查詢并生成響應。查詢結果作為策略決策返回。OPA 將所有必要的策略和數據存儲在內存緩存中,因此能夠快速返回結果。以下是一個簡單的 OPA Rego 文件示例:
package example
default allow = false
allow {
input.method == "GET"
input.path == "/api/resource"
input.user.role == "admin"
}
在這個示例中,定義了一個名為 example
的包,其中包含一個名為 allow
的規則。allow
規則指定,如果輸入的方法是 GET
,請求路徑是 /api/resource
,并且用戶角色是 admin
,則允許該請求。如果這些條件滿足,allow
規則將評估為 true
,請求將被允許。
API Gateway 提供了一個集中管理 API 和其使用者的位置,避免了每個服務內部實現獨立的身份驗證邏輯,從而簡化了身份驗證管理。OPA 則在此基礎上增加了授權層,將策略與代碼分離,提供了更靈活的策略定義和管理方式。通過結合 API Gateway 和 OPA,可以有效地為 API 資源分配角色權限。用戶可以與一個或多個角色關聯,每個角色定義了一組對 RBAC 資源(由 URI 路徑定義)的權限(如 GET、PUT、DELETE)。接下來,將詳細講解如何使用這兩個工具實現 RBAC。
在 Apache APISIX 中,通過配置路由和插件可以定義 API 的行為。利用 APISIX 的 OPA 插件,可以將請求轉發給 OPA 以執行 RBAC 策略,從而根據用戶的角色和權限實時做出授權決策。
例如,假設有一個 Conference API,用于檢索和編輯活動會話、主題和演講者信息。演講者只能查看自己的會話和主題,而管理員則可以添加或編輯更多會話和主題。同時,與會者可以通過 POST 請求提交對演講者會話的反饋,而演講者只能通過 GET 請求查看這些反饋。以下圖示展示了這一場景:/speaker/speakerId/session/feedback
API 使用者通過 API Gateway 提供憑證(如授權標頭中的 JWT 令牌)來請求路由。 API Gateway 將帶有 JWT 標頭的使用者數據發送到 OPA 引擎。 OPA 根據 .rego 文件中定義的策略(角色和權限)評估使用者是否有權訪問資源。 如果 OPA 決定允許訪問,請求將被轉發到上游的 Conference 服務。 接下來,需要在 OPA 中安裝和配置 APISIX,并定義相應的策略。
curl -sL https://run.api7.ai/apisix/quickstart | sh
可以通過以下 quickstart 腳本輕松安裝和啟動 APISIX:
curl -sL https://run.api7.ai/apisix/quickstart | sh
要將請求路由到會議 API 的后端服務,需要通過 Admin API 在 Apache APISIX 中添加上游服務器。可以使用以下命令進行配置:
curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -X PUT -d '
{
"name": "Conferences API upstream",
"desc": "Register Conferences API as the upstream",
"type": "roundrobin",
"scheme": "https",
"nodes": {
"conferenceapi.azurewebsites.net:443": 1
}
}'
接下來,在 Apache APISIX 中創建一個新的 API 使用者(例如用戶名為 jack
)。為該使用者配置 jwt-auth
插件,以便使用 JSON Web 令牌(JWT)進行身份驗證。可以使用以下命令:
curl http://127.0.0.1:9180/apisix/admin/consumers -X PUT -d '
{
"username": "jack",
"plugins": {
"jwt-auth": {
"key": "user-key",
"secret": "my-secret-key"
}
}
}'
接下來,需要設置一個新的路由,以便使用 public-api
插件生成和簽署 JWT 令牌。在這種情況下,API Gateway 充當身份提供商服務器,使用配置的密鑰來創建和驗證令牌。身份提供商也可以是其他第三方服務,如 Google、Okta、Keycloak 或 Ory Hydra。
使用以下命令創建該路由:
curl http://127.0.0.1:9180/apisix/admin/routes/jas -X PUT -d '
{
"uri": "/apisix/plugin/jwt/sign",
"plugins": {
"public-api": {}
}
}'
現在,可以通過創建的公共終端節點,從 API Gateway 獲取揚聲器 Jack 的新 JWT 令牌。以下 curl
命令使用 Jack 的憑證生成一個新的令牌,并在有效負載中分配 role
和 permission
。
curl -G --data-urlencode 'payload={"role":"speaker","permission":"read"}' http://127.0.0.1:9080/apisix/plugin/jwt/sign?key=user-key -i
執行此命令后,將收到一個令牌作為響應。請保存此令牌,以便稍后用于訪問新的 API Gateway 終端節點。
這一步涉及在 Apache APISIX 中配置三個插件:proxy-rewrite
、jwt-auth
和 opa
插件。
使用以下 curl
命令配置插件:
curl "http://127.0.0.1:9180/apisix/admin/plugin_configs/1" -X PUT -d '
{
"plugins": {
"jwt-auth": {},
"proxy-rewrite": {
"host": "conferenceapi.azurewebsites.net"
}
}
}'
上述插件配置將請求代理到主機 conferenceapi.azurewebsites.net
。
OPA 插件的配置將使用運行在 http://localhost:8181/v1/data/rbacExample
上的 OPA 策略引擎進行身份驗證。此外,APISIX 會將所有與消費者相關的信息發送給 OPA。接下來,我們將添加這個策略文件 .rego
。
最后一步是為 Conferences API 的演講者會話創建新路由:
curl "http://127.0.0.1:9180/apisix/admin/routes/1" -X PUT -d '
{
"name": "Conferences API speaker sessions route",
"desc": "Create a new route in APISIX for the Conferences API speaker sessions",
"methods": ["GET", "POST"],
"uris": ["/speaker/*/topics", "/speaker/*/sessions"],
"upstream_id": "1",
"plugin_config_id": 1
}'
有效負載包含有關路由的信息,包括其名稱、描述、方法、URI、上游 ID 和插件配置 ID。在此配置中,路由處理兩個不同 URI 的 GET 和 POST 請求。upstream_id
字段指定處理此路由的上游服務的 ID,而 plugin_config_id
字段指定用于該路由的插件配置 ID。
到目前為止,已為 APISIX 配置了所有必要設置,以將傳入請求路由到會議 API 端點,并僅允許授權的 API 消費者訪問。此時,每次 API 使用者訪問終端節點時,必須提供 JWT 令牌才能從 Conference 后端服務檢索數據。可以通過以下方式驗證設置是否正常工作,即請求自定義 API 網關而非實際的會議服務:
curl -i http://127.0.0.1:9080/speaker/1/topics -H 'Authorization: {API_CONSUMER_TOKEN}'
接下來的步驟是使用 Docker 運行 OPA 服務,并通過其 API 上傳策略定義,這些定義將用于評估傳入請求的授權策略。
docker run -d --network=apisix-quickstart-net --name opa -p 8181:8181 openpolicyagent/opa:latest run -s
該 Docker 命令會啟動 OPA 的最新版本容器。容器將創建一個名為 opa
的新實例,并將其暴露在端口 8181 上,使 APISIX 能夠通過 http://opa:8181
地址直接向 OPA 發送策略檢查請求。請確保 OPA 和 APISIX 運行在同一 Docker 網絡中。
您需要在 OPA 中定義策略,以控制對 API 資源的訪問。這些策略應包括角色分配和角色權限分配,并通過讀取 JWT 有效負載來驗證用戶權限。以下是將策略上傳到 OPA 的命令和 Rego 文件示例:
curl -X PUT '127.0.0.1:8181/v1/policies/rbacExample' \
-H 'Content-Type: text/plain' \
-d 'package rbacExample
# Assigning user roles
user_roles := {
"jack": ["speaker"],
"bobur": ["admin"]
}
# Role permission assignments
role_permissions := {
"speaker": [{"permission": "read"}],
"admin": [{"permission": "read"}, {"permission": "write"}]
}
# Helper JWT Functions
bearer_token := t {
t := input.request.headers.authorization
}
# Decode the authorization token to get a role and permission
token = {"payload": payload} {
[_, payload, _] := io.jwt.decode(bearer_token)
}
# Logic that implements RBAC
default allow = false
allow {
# Lookup the list of roles for the user
roles := user_roles[input.consumer.username]
# For each role in that list
r := roles[_]
# Lookup the permissions list for role r
permissions := role_permissions[r]
# For each permission
p := permissions[_]
# Check if the permission granted to r matches the user's request
p == {"permission": token.payload.permission}
}'
這個策略文件定義了用戶角色和角色權限分配。bearer_token
是從請求頭中提取的 JWT 令牌,token
用于解碼并獲取權限。策略邏輯確保用戶的角色權限與請求中的權限匹配。如果匹配,則允許訪問。
在定義了 OPA 策略之后,您需要更新 APISIX 的插件配置以使用 OPA 插件。這涉及到指定 OPA 插件的主機地址和策略名稱,并啟用消費者信息的傳遞。以下是更新插件配置的命令:
curl "http://127.0.0.1:9180/apisix/admin/plugin_configs/1" -X PATCH -d '
{
"plugins": {
"opa": {
"host": "http://opa:8181",
"policy": "rbacExample",
"with_consumer": true
}
}
}'
在這個命令中:
host
指定了 OPA 服務的地址。policy
指定了之前在 OPA 中定義的策略名稱。with_consumer
設置為 true
以確保將消費者信息傳遞給 OPA 進行授權決策。執行此命令后,APISIX 將使用配置的 OPA 插件來評估請求的授權策略。
現在,您可以測試所有配置的設置,以確保 OPA 策略正常工作。使用以下 curl
命令來驗證 API Gateway 端點是否按照定義的 OPA 策略進行授權:
curl -i http://127.0.0.1:9080/speaker/1/topics -H 'Authorization: {API_CONSUMER_TOKEN}'
在此命令中:
{API_CONSUMER_TOKEN}
應替換為之前生成的 JWT 令牌。此請求將發送到 APISIX API Gateway,APISIX 將首先檢查 JWT 令牌的有效性,然后將請求數據和令牌信息傳遞給 OPA 以進行策略評估。如果 OPA 確定請求符合授權規則,則請求將被轉發到會議 API 服務;否則,將收到拒絕響應。
在本文中,我們學習了如何結合 OPA 和 Apache APISIX 實現基于角色的訪問控制(RBAC)。我們通過定義自定義的策略邏輯,確保只有具有適當角色和權限的 API 使用者才能訪問特定的 API 資源。教程演示了如何從 APISIX 發送的 JWT 令牌或消費者對象中提取相關信息,并通過 OPA 策略文件進行授權決策。這種方法使得策略管理更加集中和靈活,從而提升了 API 的安全性和管理效率。
原文鏈接:RBAC With API Gateway and Open Policy Agent (OPA)