Nacos 權限控制介紹及實戰

2022-01-01 猿天地

轉自:阿里巴巴中間件

作者:朱鵬飛

Nacos權限控制設計方案


方案背景


 Nacos 自開源依賴,權限控制一直需求比較強烈,這也反應了用戶需求將 Nacos 部署到生產環境的需求。最新發布的 Nacos 1.2.0版本已經支持了服務發現和配置管理的權限控制,保障用戶安全上生產。本文主要介紹 Nacos 權限控制的設計方案和使用指南。什麼是權限控制?在分布式服務調用時,需要對未知的或者不受信任的請求來源的請求進行識別和拒絕。權限控制一般分為兩個階段:身份識別(Authentication)和權限識別(Authorization)。身份認證主要確定訪問者的身份,權限識別則判斷這個訪問者是否有對應資源的權限。在 Nacos 的場景中,配置管理的權限控制指的是設置某個配置能否被某個用戶讀寫,這個比較好理解,沒有權限的用戶舊無法讀取或者寫入對應的配置。服務發現的權限控制指的是用戶是否有權限進行某個服務的註冊或者訂閱,這裡需要注意的是服務發現的權限控制只能夠控制用戶是否可以從 Nacos 獲取到服務的地址或者在 Nacos 上修改服務的地址。但是如果已經獲取到了服務的地址, Nacos 無法在服務真正調用時進行權限控制,這個時候的權限控制需要由服務框架來完成。常見實現方式:認證(Authentication)Token(JWT,Oauth,LDAP,SAML,OpenID)鑑權(Authorization)DAC:規定資源可以被哪些主體進行哪些操作 同時,主體可以將資源的權限,授予其他主體;MAC:a. 規定資源可以被哪些類別的主體進行哪些操作 。b. 規定主體可以對哪些等級的資源進行哪些操作 當一個操作,同時滿足a與b時,允許操作;RBAC:a. 規定角色可以對哪些資源進行哪些操作 。b. 規定主體擁有哪些角色當一個操作,同時滿足a與b時,允許操作;ABAC:規定哪些屬性的主體可以對哪些屬性的資源在哪些屬性的情況下進行哪些操作。方案詳情


Nacos 的權限控制,目標是能夠滿足用戶基本的鑑權需求,同時能夠保持擴展性,可以支持去對接用戶自帶的用戶管理系統或者鑑權系統,包括後面和 K8s 生態以及 Service   Mesh 生態能夠無縫的融合。基於這樣的考慮,目前 Nacos 權限控制的設計是自帶一個基本的實現,然後可以支持用戶擴展。具體的設計如下。模塊設計整體的模塊設計是儘量將鑑權的邏輯抽象出來,不在服務發現模塊或者配置管理模塊添加相關的邏輯。通過配置文件可以選擇當前使用的鑑權系統。Nacos 自帶的認證系統使用 JWT Token ,自帶的鑑權系統使用的是 RBAC 。認證算法對於用戶來說,不管是在控制臺還是在客戶端,都是上傳用戶名和密碼來獲取一個 token ,然後後續的每一次到 Nacos 的請求都會帶上這個 token 來表明身份。這個 token 會有一個失效時間,對於控制臺來說,只需要直接提示用戶重新登錄即可,對於客戶端則需要有一個定期到 Nacos 刷新 token 的邏輯。 Nacos 自帶的鑑權系統使用的是 RBAC 模型,可以在網上查詢相關的資料。數據模型鑑權的數據模型也是基於標準的 RBAC 來設計的,分為用戶、角色和權限三部分。用戶就是由用戶名和密碼組成的用戶信息,角色則是一個邏輯上的用戶組, 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

/nacos/v1/auth/roles?role=xx&username=yy /nacos/v1/auth/roles?role=xx&username=yy /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 1.2.0


https://github.com/alibaba/nacos/releases/tag/1.2.0,也可以將 Nacos master 分支 clone 下來進行源碼編譯:

mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

2、安裝包解壓,然後使用 distribution/nacos-mysql.sql 進行資料庫初始化,主要是新增了 users, roles , permissions三張表,standalone模式使用 distribution/schema.sql 進行初始化。
3、Server 端打開權限控制開關。修改 con/application.properties 內容:

nacos.core.auth.enabled=true

這個開關採用了熱加載模式,無需重啟 Server 即可生效。因此當權限控制功能使用有異常時,可以直接回滾到不鑑權的模式。
使用權限控制


1、使用管理員帳號登錄 Nacos 控制臺(如果頁面提示錯誤,可以情況瀏覽器緩存刷新頁面):可以看到,左側邊欄增加了一個父菜單和三個子菜單,分別用於權限控制裡的用戶創建、角色創建以及權限管理。這個菜單欄只會在管理員登錄的時候顯示,也就意味著只有管理員才能進行權限的管理和分配。2、管理用戶。點擊「用戶列表」,進入用戶管理頁面,可以進行用戶的創建、修改和刪除:3、管理角色。因為 Nacos 的自帶的權限是基於角色來進行分配的,因此需要給創建好的用戶綁定一些角色:4、管理權限。角色創建好以後,就可以給這個角色賦予特定的權限了:在「添加資源」對話框裡,可以選擇綁定的角色,命名空間資源以及對應的動作類型,例如在上圖中,我們給角色 role1 綁定命名空間test的讀寫權限。然後又因為剛剛我們是將 user1 綁定到了 role1 上,那麼 user1 這個用戶就可以對 test 這個命名空間的資源進行讀寫操作了。5、使用 user1 登錄控制臺。點擊控制臺右上角,退出 admin 帳號,然後用剛才創建的 user1 進行登錄:如上圖所示,首先是左側的權限管理菜單消失了,因為當前用戶不是管理員。其次是會彈出一個鑑權失敗的提示框。不用擔心,這個提示框意思是 user1 沒有 public 命名空間的讀權限,所以會彈出,但是不影響我們將命名空間切換到 test :如上圖所示,我們可以看到 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);

我們在招人


阿里巴巴雲原生基礎技術中臺是隸屬於阿里雲基礎產品事業部的核心研發團隊,致力於打造穩定、標準、先進的雲原生應用基礎平臺,推動行業面向雲原生技術升級與革命。目前在招聘技術專家崗位,詳情可參考:http://www.posterhr.com/html/CkgpBwD6f?from=timeline&isappinstalled=0(可以直接投遞,也可以將簡歷直接發送到 water.lyl@alibaba-inc.com)朱鵬飛,GitHub ID:@nkorange,Nacos Maintainer,Nacos 開源負責人。阿里巴巴技術專家,阿里雲 EDAS 註冊中心 ANS 負責人,目前主要專注於服務發現、服務管理等領域。熱文推薦

為我開發的API添加華麗的外衣

技術人的副業之道

RedisTemplate:我不背鍋,是你用錯了

得虧了它,我才把潛藏那麼深的Bug挖出來

驚訝!緩存剛Put再Get居然獲取不到?

好機會,我要幫女同事解決Maven衝突問題

如有收穫,點個在看,誠摯感謝

相關焦點

  • 小白也能懂的 Nacos 服務模型介紹
    花了一定的篇幅介紹 Nacos 為什麼需要設計「服務模型」,再來看看實際的 Nacos 模型是個啥,其實沒那麼玄乎,一張圖就能表達清楚:");String serviceName = "nacos.test.service.1";String instanceIp = InetAddress.getLocalHost().getHostAddress();int instancePort = 8080;namingService.registerInstance(serviceName
  • Nacos 2.0的Spring Boot Starter來了!
    隨著Nacos2.0成熟穩定,Nacos-spring-boot
  • Spring Cloud Alibaba之一:Nacos
    =root \-e MYSQL_SERVICE_PASSWORD=123456 \-e MYSQL_SERVICE_DB_NAME=nacos \-p 8848:8848 \--restart=always \--name nacos \nacos/nacos-server:1.4.2簡單介紹一下上述指令,首先-v依舊是掛載數據卷,方便我們查看nacos日誌;-e Mode用於指定nacos
  • Alibaba 之 Nacos
    它目前只有三個組件:Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。Nacos Server 有兩種運行模式:不論哪種方式吧,都需要先去 https://github.com/alibaba/nacos/releases 下載最新的 release 包,然後解壓,以 nacos-server-0.4.0.zip 為例unzip nacos-server-0.4.0.zipcd nacos
  • 今天來學學Nacos
    一、Nacos介紹Nacos是阿里zhuc中間件團隊開源的一款服務發現
  • Sentinel Dashboard 中修改規則同步到 Nacos
    下面通過這篇,詳細介紹當使用Nacos作為配置中心之後,如何實現Sentinel Dashboard中修改規則同步到Nacos。關於下面改造的原理和分析可以見上一篇《Sentinel Dashboard中修改規則同步到Apollo》的頭兩節內容,本篇就不重複介紹了。
  • 微服務的靈魂擺渡者Nacos究竟有多強?
    圖片推薦下自己做的 Spring Boot 的實戰項目:https://github.com/YunaiV/ruoyi-vue-proNacos官方文檔的介紹中有這麼一句話推薦下自己做的 Spring Cloud 的實戰項目:https://github.com/YunaiV/onemall對於初學者當然是官方文檔了,下面作者列出了Nacos相關的官方文檔:https://nacos.io/zh-cn/docs/what-is-nacos.html(中英文兼備)https:/
  • Nacos 集群部署模式最佳實踐
    這篇模式文章便是給大家介紹一下,在實踐中可以被採用的幾種集群部署模式,無論你是希望自行搭建 Nacos,還是希望對 MSE 商業版 Nacos 有一個更加深刻的理解,我都很樂意跟你分享下面的內容。由於篇幅限制,本文不會介紹如何將一個多節點的 Nacos 集群啟動起來,主要介紹的是一個多節點的 Nacos 集群啟動之後,我們的應用如何很好地連接到 Nacos 集群,即客戶端視角。
  • Nacos 快速開始
    從 Github 上下載源碼方式git clone https://github.com/alibaba/nacos.gitcd nacos/mvn -Prelease-nacos clean install -Uls -al distribution/target/// change the $version to your actual
  • 【Spring Cloud Alibaba】Nacos 服務註冊與發現
    1、服務註冊首先創建一個名為:spring-cloud-alibaba-nacos-discovery 的引用,相關依賴為以下內容,核心依賴 spring-cloud-starter-alibaba-nacos-discovery<dependencies>
  • 服務發現、配置中心,Nacos幫我們都搞定了
    因此,我會通過最近幾篇博客介紹目前比較流行的一些微服務組件,其實微服務並沒有那麼難。如果在跑項目過程中,想要知道整個項目的所有依賴pom文件或者任何疑問,直接聯繫我即可。服務註冊4.2 調用服務前面已經把一個服務註冊到Nacos,接下來需要用另外一個服務去調用它,調用方式有很多,這裡主要介紹兩種:由於調用中會用到feign和ribbon,先引入依賴:
  • nacos gateway動態路由
    --nacos依賴--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency
  • Nacos踩坑記錄之The IPv4 address("nacos.xxxx.local") is incorrect
    中nacos-client的版本還是1.4.13、解決方案找到了這個問題之後,我們就可以在grade(或者maven)中手動排除一下nacos-client,重新引入一下nacos-client的最新版本 compile ('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config') { exclude
  • SpringCloud Alibaba-nacos註冊中心
    動態 DNS 服務動態 DNS 服務支持權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及數據中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。
  • sentinel dashboard集成nacos
    <i class="glyphicon glyphicon-filter"></i>&nbsp;&nbsp;流控規則</a></li>修改後會調用FlowControllerV2中的接口application.properties 中增加配置sentinel.nacos.serverAddr
  • K8S-Nacos高可用集群搭建
    -0.nacos-svc.kube-nacos.svc.cluster.local:8848 nacos-1.nacos-svc.kube-nacos.svc.cluster.local:8848 nacos-2.nacos-svc.kube-nacos.svc.cluster.local:8848" selector: matchLabels: app:
  • 詳解nacos註冊中心服務註冊流程
    一、nacos 簡介本文的目的在於詳解 nacos 註冊中心的服務註冊流程,所以首先需要對 nacos 有個基本的了解。nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。nacos 是構建以「服務」為中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。
  • 微服務註冊中心Nacos入門
    Nacos集群部署本例搭建是偽集群,在一臺虛擬機上起3個nacos服務,使用nginx做負載均衡。文件:#mysql資料庫連接信息,需要自己創建資料庫,sql腳本在conf/nacos-mysql.sqlserver.port=8849  #3個nacos服務埠號分別為8849,8850,8851spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://192.168.1.14:
  • Nacos的那些事兒(一):集群搭建
    //從GitHub拉取代碼 如果下載代碼比較慢,可以從Release地址下載 nacos-server-$version.zip 或者 nacos-server-$version.tar.gz 包。git clone https://github.com/alibaba/nacos.git //編譯打包 (install命令完成了項目編譯、單元測試(跳過)、打包功能,同時把打好的可執行jar包布署到本地maven倉庫) cd nacos/ mvn -Prelease-nacos -Dmaven.test.skip=true clean install -
  • 最強 Spring Cloud 註冊中心 Nacos,和艿艿來擼一波~
    discoveryClient 屬性,DiscoveryClient 對象,服務發現客戶端,上文我們已經介紹過。這裡我們注入的不是 Nacos Discovery 提供的 NacosDiscoveryClient,保證通用性。