當請求通過 Kong Proxy 發出時,Kong 自定義插件將被觸發。該插件將獲取所需的數據并將其與輸入/查詢一起傳遞給 OPA。此數據獲取分為兩個部分:一部分是查找 Redis 以找到所需的值,如果找到,則將其傳遞給 OPA;否則,它將進一步查詢 Postgres 并獲取數據并將其緩存在 Redis 中,然后再傳遞給 OPA。我們可以在運行下一節中的命令并觀察日志時重新回顧這一點。OPA 做出決定(基于策略、輸入和數據),如果允許,Kong 將繼續將該請求發送到 API。使用這種方法,對 Postgres 的查詢數量顯著減少,但可用于 OPA 的數據相當準確,同時保持低延遲。

要開始構建自定義插件,我們需要一個 handler.lua 實現插件核心邏輯的地方,以及一個 schema.lua 定義插件配置架構的地方(顧名思義)。如果您正在開始學習如何為 Kong 編寫自定義插件,請參閱 此鏈接 了解更多信息。文檔還解釋了如何打包和安裝插件。讓我們繼續了解這個插件的邏輯。

演示的第一步是 在您的本地設置或任何云設置上安裝 OPA、Kong、Postgres 和 Redis 。請克隆到此 存儲庫 。

查看 docker-compose yaml,其中定義了用于部署上述所有四個服務的配置。觀察 Kong Env 變量以了解自定義插件的加載方式。

運行以下命令來部署服務:

docker-compose?build
docker-compose up

一旦我們驗證容器已啟動并正在運行,Kong 管理器和 OPA 即可在相應的端點 https://localhost:8002 和 https://localhost:8181 上使用,如下所示:

創建測試服務、路由并使用以下命令將我們的自定義 kong 插件添加到此路由:

curl -X POST http://localhost:8001/config -F config=@config.yaml

使用以下命令將 authopa.rego 文件中定義的 OPA 策略發布并更新到 OPA 服務:

curl -X PUT http://localhost:8181/v1/policies/mypolicyId -H "Content-Type: application/json" --data-binary @authopa.rego

僅當用戶使用方法訪問 /demo 路徑并具有 .可以根據需要添加其他規則,以根據不同的標準定制訪問控制。GET"Moderator"

opa_policy = [
{
"path": "/demo",
"method": "GET",
"allowed_roles": ["Moderator"]
}
]

現在設置已準備就緒,但在測試之前,我們需要在 Postgres 中添加一些測試數據。我為一些員工添加了一些示例數據(姓名、電子郵件和角色),如下所示(請參閱 PostgresReadme)。

以下是失敗和成功請求的示例:

現在,為了測試這個自定義插件的核心功能,讓我們發出兩個連續的請求并檢查日志以了解數據檢索是如何發生的。

以下是日志:

2024/09/13 14:05:05 [error] 2535#0:?*10309?[kong]?redis.lua:19 [authopa]?No data found in Redis for key:?alice@example.com, client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"ebbb8b5b57ff4601ff194907e35a3002"

2024/09/13 14:05:05 [info] 2535#0:?*10309?[kong]?handler.lua:25 [authopa]?Fetching roles from PostgreSQL for email:?alice@example.com, client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"ebbb8b5b57ff4601ff194907e35a3002"

2024/09/13 14:05:05 [info] 2535#0:?*10309?[kong]?postgres.lua:43 [authopa] Fetched roles:?Moderator, client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"ebbb8b5b57ff4601ff194907e35a3002"

2024/09/13 14:05:05 [info] 2535#0:?*10309?[kong]?handler.lua:29 [authopa]?Caching user roles in Redis, client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"ebbb8b5b57ff4601ff194907e35a3002"

2024/09/13 14:05:05 [info] 2535#0:?*10309?[kong]?redis.lua:46 [authopa] Data successfully cached in Redis, client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"ebbb8b5b57ff4601ff194907e35a3002"

2024/09/13 14:05:05 [info] 2535#0:?*10309?[kong]?opa.lua:37?[authopa] Is Allowed by OPA:?true, client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"ebbb8b5b57ff4601ff194907e35a3002"

2024/09/13 14:05:05 [info] 2535#0:?*10309?client 192.168.96.1 closed keepalive connection

------------------------------------------------------------------------------------------------------------------------

2024/09/13 14:05:07 [info] 2535#0:?*10320?[kong]?redis.lua:23 [authopa]?Redis result: {"roles":["Moderator"],"email":"alice@example.com"},?client:?192.168.96.1, server:?kong, request:?"GET /demo HTTP/1.1",?host:?"localhost:8000",?request_id:?"75bf7a4dbe686d0f95e14621b89aba12"

2024/09/13 14:05:07 [info] 2535#0: *10320 [kong] opa.lua:37 [authopa] Is Allowed by OPA: true, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "75bf7a4dbe686d0f95e14621b89aba12"

日志顯示,對于第一個請求,當 Redis 中沒有數據時,數據將從 Postgres 獲取并緩存在 Redis 中,然后再發送給 OPA 進行評估。在后續請求中,由于 Redis 中有數據,因此響應速度會快得多。

結論

總之,通過將 Kong Gateway 與 OPA 相結合并使用 Redis 緩存實現自定義插件,我們有效地平衡了高吞吐量環境中訪問控制的準確性和速度。該插件通過在初始查詢后將用戶角色緩存在 Redis 中來最大限度地減少昂貴的 Postgres 查詢的數量。在后續請求中,數據將從 Redis 中檢索,從而顯著減少延遲,同時為 OPA 策略評估保持準確和最新的用戶信息。這種方法可確保在網關級別有效處理 細粒度的訪問控制, 而不會犧牲性能或安全性,使其成為擴展微服務同時實施精確訪問策略的理想解決方案。

原文鏈接: https://dzone.com/articles/enhanced-api-security-fine-grained-access-control

上一篇:

API安全風險:需要注意和如何預防

下一篇:

OpenID Connect (OIDC)是什么及其應用
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費