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

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

演示的第一步是 在您的本地設(shè)置或任何云設(shè)置上安裝 OPA、Kong、Postgres 和 Redis 。請(qǐng)克隆到此 存儲(chǔ)庫(kù) 。

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

運(yùn)行以下命令來(lái)部署服務(wù):

docker-compose?build
docker-compose up

一旦我們驗(yàn)證容器已啟動(dòng)并正在運(yùn)行,Kong 管理器和 OPA 即可在相應(yīng)的端點(diǎn) https://localhost:8002 和 https://localhost:8181 上使用,如下所示:

創(chuàng)建測(cè)試服務(wù)、路由并使用以下命令將我們的自定義 kong 插件添加到此路由:

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

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

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

僅當(dāng)用戶使用方法訪問 /demo 路徑并具有 .可以根據(jù)需要添加其他規(guī)則,以根據(jù)不同的標(biāo)準(zhǔn)定制訪問控制。GET"Moderator"

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

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

以下是失敗和成功請(qǐng)求的示例:

現(xiàn)在,為了測(cè)試這個(gè)自定義插件的核心功能,讓我們發(fā)出兩個(gè)連續(xù)的請(qǐng)求并檢查日志以了解數(shù)據(jù)檢索是如何發(fā)生的。

以下是日志:

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"

日志顯示,對(duì)于第一個(gè)請(qǐng)求,當(dāng) Redis 中沒有數(shù)據(jù)時(shí),數(shù)據(jù)將從 Postgres 獲取并緩存在 Redis 中,然后再發(fā)送給 OPA 進(jìn)行評(píng)估。在后續(xù)請(qǐng)求中,由于 Redis 中有數(shù)據(jù),因此響應(yīng)速度會(huì)快得多。

結(jié)論

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

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

上一篇:

API安全風(fēng)險(xiǎn):需要注意和如何預(yù)防

下一篇:

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

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)