天天看點

Nacos 權限控制介紹及實戰Nacos權限控制實戰

方案背景

Nacos自開源依賴,權限控制一直需求比較強烈,這也反應了使用者需求将Nacos部署到生産環境的需求。最新釋出的Nacos 1.2.0版本已經支援了服務發現和配置管理的權限控制,保障使用者安全上生産。本文主要介紹Nacos權限控制的設計方案和使用指南。

什麼是權限控制?

在分布式服務調用時,需要對未知的或者不受信任的請求來源的請求進行識别和拒絕。權限控制一般分為兩個階段:身份識别(Authentication)和權限識别(Authorization)。身份認證主要确定通路者的身份,權限識别則判斷這個通路者是否有對應資源的權限。

在Nacos的場景中,配置管理的權限控制指的是設定某個配置能否被某個使用者讀寫,這個比較好了解,沒有權限的使用者舊無法讀取或者寫入對應的配置。服務發現的權限控制指的是使用者是否有權限進行某個服務的注冊或者訂閱,這裡需要注意的是服務發現的權限控制隻能夠控制使用者是否可以從Nacos擷取到服務的位址或者在Nacos上修改服務的位址。但是如果已經擷取到了服務的位址,Nacos無法在服務真正調用時進行權限控制,這個時候的權限控制需要由服務架構來完成。

Nacos 權限控制介紹及實戰Nacos權限控制實戰

常見實作方式

認證(Authentication)

  • 使用者名+密碼
  • Cookie(隻适用于浏覽器)
  • Session
  • Token(JWT,Oauth,LDAP,SAML,OpenID)
  • AK/SK

鑒權(Authorization)

  • ACL: 規定資源可以被哪些主體進行哪些操作;
  • DAC: 規定資源可以被哪些主體進行哪些操作 同時,主體可以将資源的權限,授予其他主體;
  • MAC:a. 規定資源可以被哪些類别的主體進行哪些操作 b. 規定主體可以對哪些等級的資源進行哪些操作 當一個操作,同時滿足a與b時,允許操作;
  • RBAC: a. 規定角色可以對哪些資源進行哪些操作 b. 規定主體擁有哪些角色當一個操作,同時滿足a與b時,允許操作;
  • ABAC: 規定哪些屬性的主體可以對哪些屬性的資源在哪些屬性的情況下進行哪些操作。

方案詳情

Nacos的權限控制,目标是能夠滿足使用者基本的鑒權需求,同時能夠保持擴充性,可以支援去對接使用者自帶的使用者管理系統或者鑒權系統,包括後面和K8S生态以及Service Mesh生态能夠無縫的融合。基于這樣的考慮,目前Nacos權限控制的設計是自帶一個基本的實作,然後可以支援使用者擴充。具體的設計如下。

子產品設計

整體的子產品設計是盡量将鑒權的邏輯抽象出來,不在服務發現子產品或者配置管理子產品添加相關的邏輯。通過配置檔案可以選擇目前使用的鑒權系統。Nacos自帶的認證系統使用JWT Token,自帶的鑒權系統使用的是RBAC。

Nacos 權限控制介紹及實戰Nacos權限控制實戰

認證算法

對于使用者來說,不管是在控制台還是在用戶端,都是上傳使用者名和密碼來擷取一個token,然後後續的每一次到Nacos的請求都會帶上這個token來表明身份。這個token會有一個失效時間,對于控制台來說,隻需要直接提示使用者重新登入即可,對于用戶端則需要有一個定期到Nacos重新整理token的邏輯。

Nacos 權限控制介紹及實戰Nacos權限控制實戰

鑒權算法

Nacos自帶的鑒權系統使用的是RBAC模型,可以在網上查詢相關的資料。

資料模型

鑒權的資料模型也是基于标準的RBAC來設計的,分為使用者、角色和權限三部分。使用者就是由使用者名和密碼組成的使用者資訊,角色則是一個邏輯上的使用者組,Nacos啟動時會自帶一個全局管理者的角色,隻有這個全局管理者的角色可以進行添加使用者、添加角色、添加授權等操作,保證安全性。而權限則是由資源+動作來組成。

Nacos 權限控制介紹及實戰Nacos權限控制實戰

接口設計

以下接口涉及到登入和鑒權的所有邏輯,這些接口除了登入接口,其他接口都隻能由全局管理者來調用。

使用者管理

  • 建立使用者:POST

/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

/nacos/v1/auth/users/login?username=xxx&password=yyy

角色管理

  • 建立角色/綁定使用者到角色:POST /nacos/v1/auth/roles?role=xx&username=yy
  • 删除某個使用者的角色:DELETE /nacos/v1/auth/roles?role=xx&username=yy
  • 擷取使用者的所有角色:GET /nacos/v1/auth/roles?username=xxx

權限管理

  • 給角色添權重限:POST /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
  • 從角色删除權限:DELETE /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz
  • 擷取某個角色的權限:GET /nacos/v1/auth/permissions?role=xxx

Nacos權限控制實戰

安裝Nacos 1.2.0

  1. 部署包準備。可以直接下載下傳安裝包: https://github.com/alibaba/nacos/releases/tag/1.2.0 ,也可以将Nacos master分支clone下來進行源碼編譯:
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U           
  1. 安裝包解壓,然後使用distribution/nacos-mysql.sql進行資料庫初始化,主要是新增了users, roles, permissions三張表,standalone模式使用distribution/schema.sql進行初始化。
  2. Server端打開權限控制開關。修改con/application.properties内容:
nacos.core.auth.enabled=true           

這個開關采用了熱加載模式,無需重新開機Server即可生效。是以當權限控制功能使用有異常時,可以直接復原到不鑒權的模式。

使用權限控制

1、使用管理者賬号登入Nacos控制台(如果頁面提示錯誤,可以情況浏覽器緩存重新整理頁面):

Nacos 權限控制介紹及實戰Nacos權限控制實戰

可以看到,左側邊欄增加了一個父菜單和三個子菜單,分别用于權限控制裡的使用者建立、角色建立以及權限管         理。這個菜單欄隻會在管理者登入的時候顯示,也就意味着隻有管理者才能進行權限的管理和配置設定。

2、管理使用者。點選“使用者清單”,進入使用者管理頁面,可以進行使用者的建立、修改和删除:

Nacos 權限控制介紹及實戰Nacos權限控制實戰

3、管理角色。因為Nacos的自帶的權限是基于角色來進行配置設定的,是以需要給建立好的使用者綁定一些角色:

Nacos 權限控制介紹及實戰Nacos權限控制實戰

4、管理權限。角色建立好以後,就可以給這個角色賦予特定的權限了:

Nacos 權限控制介紹及實戰Nacos權限控制實戰

在“添加資源”對話框裡,可以選擇綁定的角色,命名空間資源以及對應的動作類型,例如在上圖中,我們給角色role1綁定命名空間test的讀寫權限。然後又因為剛剛我們是将user1綁定到了role1上,那麼user1這個使用者就可以對test這個命名空間的資源進行讀寫操作了。

5、使用user1登入控制台。點選控制台右上角,退出admin賬号,然後用剛才建立的user1進行登入:

Nacos 權限控制介紹及實戰Nacos權限控制實戰

如上圖所示,首先是左側的權限管理菜單消失了,因為目前使用者不是管理者。其次是會彈出一個鑒權失敗的提示框。不用擔心,這個提示框意思是user1沒有public命名空間的讀權限,是以會彈出,但是不影響我們将命名空間切換到test:

Nacos 權限控制介紹及實戰Nacos權限控制實戰

如上圖所示,我們可以看到test命名空間的配置資料了,下面我們再來介紹用戶端的使用。

6、首先依賴最新的nacos 1.2.0用戶端,然後在初始化時添加如下代碼:

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);           

7、使用用戶端進行正常的讀寫配置操作。

我們在招人

阿裡巴巴雲原生基礎技術中台是隸屬于阿裡雲基礎産品事業部的核心研發團隊,緻力于打造穩定、标準、先進的雲原生應用基礎平台,推動行業面向雲原生技術更新與革命。目前在招聘技術專家崗位,詳情可參考:

http://www.posterhr.com/html/CkgpBwD6f?from=timeline&isappinstalled=0

(可以直接投遞,也可以将履歷直接發送到 [email protected]

作者資訊:朱鵬飛,GitHub ID:@nkorange,Nacos Maintainer,Nacos 開源負責人。阿裡巴巴技術專家,阿裡雲 EDAS 注冊中心 ANS 負責人,目前主要專注于服務發現、服務管理等領域。