Nacos 1.2.0 權(quán)限控制介紹和使用

本文來自于Nacos官網(wǎng):Nacos 1.2.0 權(quán)限控制介紹和使用,轉(zhuǎn)載請(qǐng)保留鏈接 ;)

Nacos權(quán)限控制設(shè)計(jì)方案

方案背景

Nacos自開源以來,權(quán)限控制一直需求比較強(qiáng)烈,這也反應(yīng)了用戶需求將Nacos部署到生產(chǎn)環(huán)境的需求。最新發(fā)布的Nacos 1.2.0版本已經(jīng)支持了服務(wù)發(fā)現(xiàn)和配置管理的權(quán)限控制,保障用戶安全上生產(chǎn)。本文主要介紹Nacos權(quán)限控制的設(shè)計(jì)方案和使用指南。

什么是權(quán)限控制?

在分布式服務(wù)調(diào)用時(shí),需要對(duì)未知的或者不受信任的請(qǐng)求來源的請(qǐng)求進(jìn)行識(shí)別和拒絕。權(quán)限控制一般分為兩個(gè)階段:身份識(shí)別(Authentication)和權(quán)限識(shí)別(Authorization)。身份認(rèn)證主要確定訪問者的身份,權(quán)限識(shí)別則判斷這個(gè)訪問者是否有對(duì)應(yīng)資源的權(quán)限。

在Nacos的場景中,配置管理的權(quán)限控制指的是設(shè)置某個(gè)配置能否被某個(gè)用戶讀寫,這個(gè)比較好理解,沒有權(quán)限的用戶舊無法讀取或者寫入對(duì)應(yīng)的配置。服務(wù)發(fā)現(xiàn)的權(quán)限控制指的是用戶是否有權(quán)限進(jìn)行某個(gè)服務(wù)的注冊(cè)或者訂閱,這里需要注意的是服務(wù)發(fā)現(xiàn)的權(quán)限控制只能夠控制用戶是否可以從Nacos獲取到服務(wù)的地址或者在Nacos上修改服務(wù)的地址。但是如果已經(jīng)獲取到了服務(wù)的地址,Nacos無法在服務(wù)真正調(diào)用時(shí)進(jìn)行權(quán)限控制,這個(gè)時(shí)候的權(quán)限控制需要由服務(wù)框架來完成。

1576216016307-2da56934-917f-46ec-b3eb-a221bc91a9e0.png

常見實(shí)現(xiàn)方式

認(rèn)證(Authentication)
  • 用戶名+密碼
  • Cookie(只適用于瀏覽器)
  • Session
  • Token(JWT,Oauth,LDAP,SAML,OpenID)
  • AK/SK
鑒權(quán)(Authorization)
  • ACL: 規(guī)定資源可以被哪些主體進(jìn)行哪些操作;
  • DAC: 規(guī)定資源可以被哪些主體進(jìn)行哪些操作 同時(shí),主體可以將資源的權(quán)限,授予其他主體;
  • MAC:a. 規(guī)定資源可以被哪些類別的主體進(jìn)行哪些操作 b. 規(guī)定主體可以對(duì)哪些等級(jí)的資源進(jìn)行哪些操作 當(dāng)一個(gè)操作,同時(shí)滿足a與b時(shí),允許操作;
  • RBAC: a. 規(guī)定角色可以對(duì)哪些資源進(jìn)行哪些操作 b. 規(guī)定主體擁有哪些角色當(dāng)一個(gè)操作,同時(shí)滿足a與b時(shí),允許操作
  • ABAC: 規(guī)定哪些屬性主體可以對(duì)哪些屬性資源在哪些屬性的情況下進(jìn)行哪些操作。

方案詳情

Nacos的權(quán)限控制,目標(biāo)是能夠滿足用戶基本的鑒權(quán)需求,同時(shí)能夠保持?jǐn)U展性,可以支持去對(duì)接用戶自帶的用戶管理系統(tǒng)或者鑒權(quán)系統(tǒng),包括后面和K8S生態(tài)以及Service Mesh生態(tài)能夠無縫的融合。基于這樣的考慮,目前Nacos權(quán)限控制的設(shè)計(jì)是自帶一個(gè)基本的實(shí)現(xiàn),然后可以支持用戶擴(kuò)展。具體的設(shè)計(jì)如下。

模塊設(shè)計(jì)

整體的模塊設(shè)計(jì)是盡量將鑒權(quán)的邏輯抽象出來,不在服務(wù)發(fā)現(xiàn)模塊或者配置管理模塊添加相關(guān)的邏輯。通過配置文件可以選擇當(dāng)前使用的鑒權(quán)系統(tǒng)。Nacos自帶的認(rèn)證系統(tǒng)使用JWT Token,自帶的鑒權(quán)系統(tǒng)使用的是RBAC。

1576219027093-45345003-c583-46ec-a161-01b5f4b3ff47.png

認(rèn)證算法

對(duì)于用戶來說,不管是在控制臺(tái)還是在客戶端,都是上傳用戶名和密碼來獲取一個(gè)token,然后后續(xù)的每一次到Nacos的請(qǐng)求都會(huì)帶上這個(gè)token來表明身份。這個(gè)token會(huì)有一個(gè)失效時(shí)間,對(duì)于控制臺(tái)來說,只需要直接提示用戶重新登錄即可,對(duì)于客戶端則需要有一個(gè)定期到Nacos刷新token的邏輯。

1576219050917-51013ce2-49f3-4a86-b5f9-bd07fc88f8e8.png

鑒權(quán)算法

Nacos自帶的鑒權(quán)系統(tǒng)使用的是RBAC模型,可以在網(wǎng)上查詢相關(guān)的資料。

數(shù)據(jù)模型

鑒權(quán)的數(shù)據(jù)模型也是基于標(biāo)準(zhǔn)的RBAC來設(shè)計(jì)的,分為用戶、角色和權(quán)限三部分。用戶就是由用戶名和密碼組成的用戶信息,角色則是一個(gè)邏輯上的用戶組,Nacos啟動(dòng)時(shí)會(huì)自帶一個(gè)全局管理員的角色,只有這個(gè)全局管理員的角色可以進(jìn)行添加用戶、添加角色、添加授權(quán)等操作,保證安全性。而權(quán)限則是由資源+動(dòng)作來組成。

1576736418792-936a9d1a-5095-47fc-9f87-230abed38384.png

接口設(shè)計(jì)

以下接口涉及到登錄和鑒權(quán)的所有邏輯,這些接口除了登錄接口,其他接口都只能由全局管理員來調(diào)用。

用戶管理
  • 創(chuàng)建用戶:POST<br />
    /nacos/v1/auth/users?username=xx&password=yy
  • 刪除用戶:DELETE /nacos/v1/auth/users?username=xx&password=yy
  • 更新用戶:PUT /nacos/v1/auth/users?username=xx&oldPassword=yy&newPassword=zz
  • 登錄:POST<br />
    /nacos/v1/auth/users/login?username=xxx&password=yyy
角色管理
  • 創(chuàng)建角色/綁定用戶到角色:POST /nacos/v1/auth/roles?role=xx&username=yy
  • 刪除某個(gè)用戶的角色:DELETE /nacos/v1/auth/roles?role=xx&username=yy
  • 獲取用戶的所有角色:GET /nacos/v1/auth/roles?username=xxx
權(quán)限管理
  • 給角色添加權(quán)限:POST /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
  • 從角色刪除權(quán)限:DELETE /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
  • 獲取某個(gè)角色的權(quán)限:GET /nacos/v1/auth/permissions?role=xxx

Nacos權(quán)限控制實(shí)戰(zhàn)

安裝Nacos 1.2.0

  1. 部署包準(zhǔn)備??梢灾苯酉螺d安裝包:https://github.com/alibaba/nacos/releases/tag/1.2.0,也可以將Nacos master分支clone下來進(jìn)行源碼編譯:
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
  1. 安裝包解壓,然后使用distribution/nacos-mysql.sql進(jìn)行數(shù)據(jù)庫初始化,主要是新增了users, roles, permissions三張表,standalone模式使用distribution/schema.sql進(jìn)行初始化。
  2. Server端打開權(quán)限控制開關(guān)。修改con/application.properties內(nèi)容:
nacos.core.auth.enabled=true

這個(gè)開關(guān)采用了熱加載模式,無需重啟Server即可生效。因此當(dāng)權(quán)限控制功能使用有異常時(shí),可以直接回滾到不鑒權(quán)的模式。

注意: Nacos 1.2.0里登錄和鑒權(quán)是綁定關(guān)系,而由于這個(gè)開關(guān)的默認(rèn)值為false,因此默認(rèn)啟動(dòng)時(shí),是沒有登錄界面的,這點(diǎn)請(qǐng)讀者注意。

使用權(quán)限控制

  1. 使用管理員賬號(hào)登錄Nacos控制臺(tái)(如果頁面提示錯(cuò)誤,可以清空瀏覽器緩存刷新頁面):
1580890674563-4d235fd9-983c-4b03-b45c-b1e164152ac7.png

可以看到,左側(cè)邊欄增加了一個(gè)父菜單和三個(gè)子菜單,分別用于權(quán)限控制里的用戶創(chuàng)建、角色創(chuàng)建以及權(quán)限管 理。這個(gè)菜單欄只會(huì)在管理員登錄的時(shí)候顯示,也就意味著只有管理員才能進(jìn)行權(quán)限的管理和分配。

  1. 管理用戶。點(diǎn)擊“用戶列表”,進(jìn)入用戶管理頁面,可以進(jìn)行用戶的創(chuàng)建、修改和刪除:
1580890674569-a729854e-a72d-4b3b-bc4c-53f9df831f3e.png
  1. 管理角色。因?yàn)镹acos的自帶的權(quán)限是基于角色來進(jìn)行分配的,因此需要給創(chuàng)建好的用戶綁定一些角色:
1580890674603-f69520a1-f53e-4eb7-9186-f2963e7b3d65.png
  1. 管理權(quán)限。角色創(chuàng)建好以后,就可以給這個(gè)角色賦予特定的權(quán)限了:
1580890674580-e22945e1-be3a-46bd-b8f3-11b38eee0786.png

在“添加資源”對(duì)話框里,可以選擇綁定的角色,命名空間資源以及對(duì)應(yīng)的動(dòng)作類型,例如在上圖中,我們給角色role1綁定命名空間test的讀寫權(quán)限。然后又因?yàn)閯倓偽覀兪菍ser1綁定到了role1上,那么user1這個(gè)用戶就可以對(duì)test這個(gè)命名空間的資源進(jìn)行讀寫操作了。

  1. 使用user1登錄控制臺(tái)。點(diǎn)擊控制臺(tái)右上角,退出admin賬號(hào),然后用剛才創(chuàng)建的user1進(jìn)行登錄:
1580890674574-ca6eee1f-b749-4275-897d-ab9fba0ebf80.png

如上圖所示,首先是左側(cè)的權(quán)限管理菜單消失了,因?yàn)楫?dāng)前用戶不是管理員。其次是會(huì)彈出一個(gè)鑒權(quán)失敗的提示框。不用擔(dān)心,這個(gè)提示框意思是user1沒有public命名空間的讀權(quán)限,所以會(huì)彈出,但是不影響我們將命名空間切換到test:

1580890674621-bc16b2ad-4a9e-4ebc-83e8-fa41f4a0cba4.png

如上圖所示,我們可以看到test命名空間的配置數(shù)據(jù)了,下面我們?cè)賮斫榻B客戶端的使用。

  1. 首先依賴最新的nacos 1.2.0客戶端,然后在初始化時(shí)添加如下代碼:
Properties properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "99a791cf-41c4-4535-9e93-b0141652bad0");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
// 配置用戶名:
properties.put(PropertyKeyConst.USERNAME, "user1");
// 配置密碼:
properties.put(PropertyKeyConst.PASSWORD, "pwd1");
ConfigService iconfig = NacosFactory.createConfigService(properties);
  1. 使用客戶端進(jìn)行正常的讀寫配置操作。

我們?cè)谡腥?/h1>

阿里巴巴云原生基礎(chǔ)技術(shù)中臺(tái)是隸屬于阿里云基礎(chǔ)產(chǎn)品事業(yè)部的核心研發(fā)團(tuán)隊(duì),致力于打造穩(wěn)定、標(biāo)準(zhǔn)、先進(jìn)的云原生應(yīng)用基礎(chǔ)平臺(tái),推動(dòng)行業(yè)面向云原生技術(shù)升級(jí)與革命。在這里,你將與來自云計(jì)算、大數(shù)據(jù)領(lǐng)域的頂尖技術(shù)專家親密合作,在全球獨(dú)一無二的場景和規(guī)模中從事Kubernetes、Service Mesh、Serverless、Open Application Model(OAM)、Cloud Native Microservices、OpenMessaging、Event Streaming等云原生生態(tài)核心基礎(chǔ)技術(shù)及Apache Dubbo、Apache RocketMQ、Nacos、Arthas等頂級(jí)開源項(xiàng)目的研發(fā)和落地工作。在標(biāo)桿級(jí)的平臺(tái)上,既服務(wù)阿里巴巴全球經(jīng)濟(jì)體,更服務(wù)全世界的開發(fā)者用戶。目前在招聘技術(shù)專家崗位,詳情可參考:http://www.posterhr.com/html/CkgpBwD6f?from=timeline&isappinstalled=0(可以直接投遞,也可以將簡歷直接發(fā)送到dungu.zpf#alibaba-inc.com。#替換為@)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容