開源網關 Apache APISIX 認證鑒權精細化實戰講解

關注公眾號并添加到“星標?”,防止錯過消息

后臺回復【資料包】獲取學習資料

GitOps 新手入門到專家進階實戰詳細教程

作者錢勇,API7.ai 開發工程師,Apache APISIX Committer

在當下云原生越發成熟的環境下,API 網關最核心的功能可以概括為:連接 API 消費者和 API 提供者。

實際場景中,除去少部分允許匿名訪問的 API 外,提供者往往都會對消費者有所限制,比如只有符合條件的消費者才可以對 API 進行訪問。其次,提供者對于不同的消費者的訪問策略可能并不相同,例如 A、B 消費者都可以訪問 /send_mail API,但每分鐘的調用頻次需要區分計算。

從以上兩點可以看出在 API 網關層面鑒別和驗證 API 消費者的身份至關重要。本文將介紹云原生開源 API 網關 Apache APISIX 如何實現對于消費者的認證,以及目前被企業廣泛采用的認證方式。進一步介紹 APISIX 的用戶認證體系是如何與其他安全特性聯動使用,從而進一步提升 API 網關的安全防護能力。

c1b6f028009888f0dbe732c9ac8e5753.png

Apache APISIX 的認證鑒權

Apache APISIX 是一個動態、實時、高性能的 API 網關,提供負載均衡、動態上游、灰度發布、精細化路由、限流限速、服務降級、服務熔斷、身份認證、可觀測性等數百項功能。在認證鑒權方面,APISIX 也是提供了非常多且方便的途徑。

傳統的 HTTP 代理往往只能基于請求域名、客戶端 IP 等粗粒度手段對請求方進行識別,這對于一款 API 網關來說是遠遠不夠的,我們需要有更豐富的認證方式來解決越來越復雜的業務需求。而 APISIX 區分于傳統代理的一大優勢就是靈活的插件擴展能力,這其中就包括一套用于用戶認證的插件集合,這些插件根據實現方式的不同可以分為兩大類。

第一種是對接外部認證服務,委托其進行認證。d6cea25075fbbe9f370a50ff1eac4543.png第二種則是在網關內部認證,配合 APISIX 設計的 Consumer 對象進行認證。a9dddf05a8a98c3adf04836bb4ad1224.png

下面將會依次介紹這兩種認證方式。

對接外部認證服務

在企業采用 API 網關之前,系統中往往已經部署了獨立的認證服務,此時我們要如何將 APISIX 與已有的認證服務進行對接呢?APISIX 提供了這樣一系列插件,它們的工作原理就是通過對接各種外部的認證服務,委托它們完成認證。

例如,我們可以使用 openid-connect 插件對接任意支持 OIDC 協議的認證服務,下面是一段對接到 Keycloak 服務的樣例配置:

curl?http://127.0.0.1:9180/apisix/admin/routes?-H?"X-Api-Key:?your-API-key"?-XPOST?-d?'
{"uri":"/*","plugins":{"openid-connect":{"client_id":"apisix",?//?keycloak?創建?client?時生成"client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4","discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration",?//?keycloak?OpenID?Endpoint"scope":"openid?profile","bearer_only":false,"realm":"apisix_test_realm","introspection_endpoint_auth_method":"client_secret_post","redirect_uri":"http://127.0.0.1:9080/"}},"upstream":{...}
}'

網關內部認證

Consumer

當來自多渠道的請求到達 API 網關后,網關需要識別出這些調用方。為此,Apache APISIX 提出了 Consumer 概念,用來代表某類服務的調用方。7b45b28172b85d7520f632911b517106.pngConsumer 對象需要配置認證插件進行使用,以最簡單的 key-auth 插件為例:

curl?http://127.0.0.1:9180/apisix/admin/consumers??-H?'X-API-KEY:?your-API-key'?-X?PUT?-i?-d?'
{"username":?"jack","plugins":?{"key-auth":?{"key":?"auth-jack"}
}'

以上配置表示當請求中攜帶指定的 key(auth-jack)時,當前請求將會與 jack 這個消費者進行關聯。可以看到,Consumer 上配置的認證插件實際上就是一個指定認證機制下的身份憑證,在 key-auth 插件中,key 即是標識某個消費者的憑證,類似的還有 basic-auth 插件的用戶名與密碼等等。

為路由配置認證插件

當我們通過 Consumer 將憑證信息與具體的消費者進行關聯后,還需要在相應的路由上開啟認證插件:

curl?http://127.0.0.1:9180/apisix/admin/routes/orders?-H?'X-API-KEY:?your-API-key'?-X?PUT?-i?-d?'
{"uri":?"/orders","plugins":?{"key-auth":?{"header":?"Authorization"}}
}'

以上配置表示在 /orders 這個路由上開啟 key-auth 插件,驗證效果如下:

curl?http://127.0.0.1:9080/orders?-H?'Authorization:?auth-jack'?-iHTTP/1.1?200?OK
...curl?http://127.0.0.1:9080/orders?-H?'Authorization:?wrong-key'?-iHTTP/1.1?401?Unauthorized
...
{"message":"Invalid?API?key?in?request"}

當來自用戶的請求命中這條路由時,APISIX 會嘗試通過 Authorization 頭部拿到用戶提供的 Key。如果無法獲取或者獲取到的 Key 是不合法的,那么該請求將會被網關直接拒絕,從而保護上游服務。

可以看到以上兩種認證方式中,認證插件都處于整個體系中的核心地位,它的豐富度將直接影響著 API 網關用戶對于認證方式的選擇空間。

APISIX 支持的認證方式

認證鑒權作為計算機世界從第一天起就存在的基礎機制,經過這么多年的迭代,已經發展成為一個非常多樣化的領域。而 APISIX 的插件機制極大地降低了實現各種認證方式的開發成本,以下是部分 APISIX 已經支持的主流認證方式。

Key Auth

Key Auth 是目前 APISIX 所支持的認證方式中,使用起來最簡單的。但 key-auth 插件在實際環境中有著非常豐富的應用場景,例如:收費軟件中的 License、開放 API 平臺中的用于標識開發者的 token 等等,都可以非常輕松地使用 key-auth 來實現。并且基于 APISIX 全動態的配置下發能力,Key 可以被迅速創建、吊銷,而且實時生效。

Basic Auth

Basic Auth 是基于用戶名、密碼進行認證的方式,常用于網頁登錄場景,例如:網站的管理后臺需要管理員登錄后才可以使用,那么我們可以使用 Basic Auth 方式進行認證。

LDAP

LDAP(Lightweight Directory Access Protocol)是一種基于 X.500 標準的輕量級文件訪問協議,通過 IP 協議提供訪問控制和維護分布式信息的目錄信息,借助于 LDAP ,運維人員可以細粒度地控制用戶對資源的訪問權限。通過 APISIX 的 ldap-auth 插件,可以輕松對接實現了 LDAP 協議的平臺,例如微軟的 Active Direcory,或者 Linux 平臺的 OpenLDAP Server,從而能夠精細化地控制 Consumer 對具體路由的訪問權限。

OIDC

OpenID 是一個去中心化的網上身份認證系統。對于支持 OpenID 的網站,用戶不需要記住像用戶名和密碼這樣的傳統驗證標記。取而代之的是,他們只需要預先在一個作為 OpenID 身份提供者(identity provider, IdP)的網站上注冊賬號,而后就可以用這個賬號登錄所有對接了該提供者的應用,例如:可以通過知名的 Google 或者 Facebook 服務的賬號來認證我們自身系統的用戶。

針對 OIDC,APISIX 提供了 openid-connect 插件,可以用于對接支持了 OIDC 協議的認證服務。

Forward Auth

當 APISIX 的標準認證插件無法滿足你當前需求時,或者當前系統中已經部署了專門的并且是非標準協議的認證服務,此時你可以考慮使用 forward-auth 插件。使用該插件可以將用戶的請求通過 HTTP 形式轉發至認證服務中,并在認證服務響應非正常狀態(錯誤碼非 20x)時,返回自定義報錯或者將用戶重定向至認證頁面。

借助 forward-auth 插件的能力,可以非常巧妙地將認證與授權邏輯轉移到專門的、非標準協議的外部服務中。

“認證+任意功能”,APISIX 助力 API 安全

用戶認證只是 APISIX 保障 API 安全的第一步,將認證能力與其他安全類型插件的有機結合將會進一步放大網關的安全能力。

ACL 訪問控制

在一個復雜的后端系統中,可能會存在部分 API 的安全限制是高于其他 API 的,這種限制不僅需要攔截匿名用戶,而且需要對認證用戶進行限制,例如:只允許白名單用戶訪問用戶管理 API。

a59a9881bc01e993f966dda532d779c7.png

此時我們可以使用 APISIX 提供的 consumer-restriction 插件去實現一個訪問控制機制。

curl?http://127.0.0.1:9180/apisix/admin/routes?-H?'X-API-KEY:?your-API-key'?-X?POST?-i?-d?'
{"uri":?"/api/v1/users/admin","plugins":?{"key-auth":?{},"consumer-restriction":?{"whitelist":?["Rose","Peter]}},"upstream":?{...},
}'

上述配置中,通過 key-authconsumer-restriction 兩個插件限制了:/api/v1/users/admin 路由需要通過 key auth 認證,并且僅 Rose 和 Peter 可以訪問。

限流限速

前面我們介紹了可以通過在 Consumer 中配置認證插件將用戶憑證與消費者進行關聯,事實 APISIX Consumer 對象不僅僅可以掛載認證類型的插件,而是可以像路由和 Service 一樣,掛載任意插件。

以限流場景舉例,在實際應用中,限流策略往往不是一成不變而是"千人千面",不同服務等級的調用方擁有不同的 API 限流策略是非常常見的需求,這樣的需求是無法通過在路由上掛載限流插件進行解決的。為此,我們可以在消費者上掛載限流插件,并且為每一個消費者指定不同的限流策略。

curl?http://127.0.0.1:9180/apisix/admin/consumers??-H?'X-API-KEY:?your-API-key'?-X?PUT?-i?-d?'
{"username":?"jack","plugins":?{"key-auth":?{"key":?"jack"},"limit-count":?{"count":?200,"time_window":?60,"rejected_code":?503,"key":?"$consumer_name",}
}'curl?http://127.0.0.1:9180/apisix/admin/consumers??-H?'X-API-KEY:?your-API-key'?-X?PUT?-i?-d?'
{"username":?"rose","plugins":?{"key-auth":?{"key":?"rose"},"limit-count":?{"count":?1000,"time_window":?60,"rejected_code":?503,"key":?"$consumer_name",}
}'

通過上方的配置,我們為 jack 和 rose 分別指定了不同的限流策略。Rose 在 60 秒內擁有更多的請求次數配額 1000,而 Jack 只有 200 配額。

總結

認證鑒權作為 API 網關不可或缺的能力,已然成為用戶在選型 API 網關時考量的重要因素之一。

本文中介紹的開源網關 Apache APISIX,覆蓋了所有主流的認證方式,可以滿足企業用戶對于認證鑒權的需求。同時 APISIX 還擁有其他以下優勢:

  • 豐富的、開箱即用的認證插件;

  • 同時支持內置、外置認證方式,用戶可以自由選擇;

  • 支持二次開發,方便對接自定義鑒權中心。

這些優勢都可以幫助企業更輕松的落地網關層面的認證鑒權,加強 API 安全。

- END -

a7e761a3c944cab5f2b1f7ee2403806d.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279943.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279943.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279943.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python應用POP3、IMAP、SMTP 協議,獲取郵箱驗證碼

POP3和IMAP是郵件相關的協議,IMAP是比POP3更高級一點的協議,實…

固件中啟用的虛擬化否_哪些固件或硬件機制可啟用強制關機?

固件中啟用的虛擬化否At one time or another, all of us have had to force our computers to shut down by pushing and holding the power button down until they powered off. Is this mechanism hardware-based, firmware-based, or both? Today’s SuperUser Q&A p…

簡述閉包

閉包 這是我對閉包的一點小理解.有問題請直接指出,在此先謝過! 閉包的含義 封閉隔離的空間,在javascript中,只有函數能夠符合這種特性; 為什么要用閉包呢? 因為在引用外部js文件(如jquery,各種框架)時防止變量重名造成的問題,同時也使代碼更具隱私性; 獲取閉包中數據的方法: …

Confluence 6 配置服務器基礎地址備注

使用不同 URL。如果你配置了不同的基礎 URL 地址或者你站點的訪問者使用了不同的 URL 地址來訪問你的 Confluence 地址,你有很大概率可能會受到錯誤信息。修改上下文地址。如果你修改了基礎 URL 地址的上下文地址,你同時也需要修改下面的配置&#xff1a…

2019第10周知識總結

react 事件綁定 函數寫法 文檔總結 https://react.docschina.org/docs/handling-events.html 1 通過 constroucor綁定 class Toggle extends React.Component {constructor(props) {super(props);this.state {isToggleOn: true};// This binding is necessary to make this wo…

.NET 云原生架構師訓練營(基于 OP Storming 和 Actor 的大型分布式架構二)--學習筆記...

▲ 點擊上方“DotNet NB”關注公眾號回復“1”獲取開發者路線圖學習分享 丨作者 / 鄭 子 銘 這是DotNet NB 公眾號的第202篇原創文章目錄為什么我們用 OrleansDapr VS OrleansActor 模型Orleans 的核心概念結合 OP Storming 的實踐結合 OP Storming 的實踐業務模型設計模型代…

PHP 多維數組轉json對象

PHP 多維數組轉json對象 php 數組轉json對象&#xff0c;可能大家都知道要用json_encode,但是轉換出來的格式多有不同&#xff0c;此處做個小小的記錄&#xff01; 1. 一維數組轉json對象 <?php $arr_1 [one, two, three]; var_dump(json_encode($arr_1)); $arr_2 [0 >…

微軟文本檢索_如何在Microsoft Word中引用其他文檔中的文本

微軟文本檢索You probably have some text that you type often in your Word documents, such as addresses. Instead of retyping this text every time you need it, you can put this common text into one Word document and reference it in other documents–it’ll eve…

Hadoop-Flume-類比吸塵器圖解

2019獨角獸企業重金招聘Python工程師標準>>> 這是我自己理解Hadoop-Flume的方式 轉載于:https://my.oschina.net/u/3697442/blog/1560613

BZOJ4327:[JSOI2012]玄武密碼(SAM)

Description 在美麗的玄武湖畔&#xff0c;雞鳴寺邊&#xff0c;雞籠山前&#xff0c;有一塊富饒而秀美的土地&#xff0c;人們喚作進香河。相傳一日&#xff0c;一縷紫氣從天而至&#xff0c;只一瞬間便消失在了進香河中。老人們說&#xff0c;這是玄武神靈將天書藏匿在此。 很…

ChatGPT 之后,再玩玩 Stable-Diffusion

前些天體驗的 ChatGPT 主要用來進行文本方面的處理&#xff0c;那么圖片生成有沒有這樣的 AI 工具 呢&#xff1f;答案是肯定的。例如&#xff1a;和菜頭公眾號的題圖和文章中的插圖大多都是使用 Stable-Diffusion 的 AI 圖形生成工具創作的。順著 Stable-Diffusion 搜索了下相…

滲透測試入門DVWA 教程1:環境搭建

首先歡迎新萌入坑。哈哈。你可能抱著好奇心或者疑問。DVWA 是個啥&#xff1f; DVWA是一款滲透測試的演練系統&#xff0c;在圈子里是很出名的。如果你需要入門&#xff0c;并且找不到合適的靶機&#xff0c;那我就推薦你用DVWA。 我們通常將演練系統稱為靶機&#xff0c;下面請…

指派問題(匈牙利算法)

問題描述&#xff1a; 在生活中經常遇到這樣的問題&#xff0c;某單位需完成n項任務&#xff0c;恰好有n個人可承擔這些任務。由于每人的專長不同&#xff0c;各人完成任務不同(或所費時間)&#xff0c;效率也不同。于是產生應指派哪個人去完成哪項任務&#xff0c;使完成n項任…

移動硬盤改臺式機硬盤_如何在臺式機或移動設備上離線使用Google云端硬盤

移動硬盤改臺式機硬盤If there’s any drawback to using cloud-based services for all your productivity and organization needs, it’s that if you can’t get an Internet connection, you’re basically out of luck. 如果使用基于云的服務來滿足您的所有生產力和組織需…

你可能不知道的容器鏡像安全實踐

大家好&#xff0c;我是Edison。最近在公司搭建CI流水線&#xff0c;涉及到容器鏡像安全的話題&#xff0c;形成了一個筆記&#xff0c;分享與你&#xff0c;也希望我們都能夠提高對安全的重視。時代背景近年來應用程序逐步廣泛運行在容器內&#xff0c;容器的采用率也是逐年上…

從零基礎到拿到網易Java實習offer,談談我的學習經驗

微信公眾號【程序員江湖】作者黃小斜&#xff0c;斜杠青年&#xff0c;某985碩士&#xff0c;阿里研發工程師&#xff0c;于2018 年秋招拿到 BAT 頭條、網易、滴滴等 8 個大廠 offer個人擅長領域 &#xff1a;自學編程、技術校園招聘、軟件工程考研&#xff08;關注公眾號后回復…

【Win 10 應用開發】UI Composition 札記(二):基本構件

在上一篇中&#xff0c;老周用一個示例&#xff0c;演示了框架視圖的創建過程&#xff0c;在本篇中&#xff0c;老周將給大伙伴們說一下 Composition 構建 UI 的一些“零件”。 UI Composition 有一個核心類——對&#xff0c;就是 Compositor 類&#xff0c;它是總生產車間&am…

禁用內置鍵盤_如何禁用Windows 10的所有內置廣告

禁用內置鍵盤Windows 10 has a lot of built-in advertising. This isn’t just about the free upgrade offer: Even if you purchase a new PC that comes with a Windows 10 license or spend $200 for a copy of Windows 10 Professional, you’ll see ads in your operati…

zbb20180710 maven Failed to read artifact descriptor--maven

Failed to read artifact descriptor--maven2016年09月10日 13:30:46閱讀數&#xff1a;13036在開發的過程中,作為新手,經常遇到Maven下載依賴的時候,"Failed to read artifact descriptor for xxx:jar"的錯誤對于這種非業務相關的問題,耽誤時間非常不效率,看到網站很…

震驚!頂著 39.5℃高燒 ,我和這哥倆都聊了些啥?

這是頭哥侃碼的第271篇原創上周三&#xff0c;我邀請了兩位嘉賓進入直播間&#xff0c;即便自己頂著 39.5 度的高燒&#xff0c;還是強打精神與這哥倆聊了倆小時。相信關注我的朋友們都知道&#xff0c;我是頭哥侃碼的主理人&#xff0c;同時也是上海TGO上海分會董事會成員。趙…