Nacos 安全零信任實踐

作者:柳遵飛

Nacos 作爲配置中心經常存儲一些敏感信息,但是由於誤用導致安全風險,最常見的主要是以下兩個問題:

1)Nacos 暴露公網可以嗎?不可以,因爲 Nacos 定位是註冊配置中心,是內部系統,不應該暴露到公網使用。

2)不得已要開公網不開鑑權可以嗎?不可以,開公網不開鑑權等同於裸奔,爲黑客攻擊創造充分條件。

看到趕緊自查一下是否有這兩類問題,如果有立即解決一下!!! 解決完這些基礎問題,可以看一下下面安全的進階玩法。

安全問題的現實背景

Nacos 作爲國內被廣泛使用的註冊配置中心,是雲原生時代不可或缺的基礎中間件組件,在開源社區擁有龐大的開發者羣體,Nacos 也被廣泛運行在生產環境之中。隨着當前雲計算,物聯網,大數據 AI 等技術的興起,相比於傳統的基於“安全內網”的網絡架構,現代的系統網絡部署架構複雜性上升,傳統的網絡邊界逐漸模糊化,對傳統的網絡安全架構產生了極大的衝擊,業內數據泄露,網絡攻擊等事件頻發,安全問題給企業的發展帶來的影響越來越大。在此背景下,安全零信任的理念逐漸興起,成爲了現代化網絡安全架構的指導思想,本文將介紹如何基於安全零信任的理念來保證 Nacos 的數據安全。

今天分享的內容分爲三個部分展開,第一個部分會簡單介紹下 Nacos 這款產品以及其常見的一些使用場景,第二個部分會根據 Nacos 運行時的原理來分析其可能面臨的安全風險,沒有對 Nacos 做必要安全保護也是當前造成 Nacos 數據泄露的真實現狀,最後一個部分會分享 Nacos 在安全零信任理念下的最佳實踐,如何讓 Nacos 更加安全的運行在生產環境。

Nacos 發展及使用場景

Nacos 是什麼?它的名字是由服務和配置管理的英文首字母,它的核心功能包括動態服務發現管理,動態配置管理,動態 DNS 服務。動態服務管理可以和上層的微服務 RPC 調用框架結合,比如 Spring Cloud, Dubbo 等實現節點上下線自動流量拆除或者上線,動態配置管理提供了在運行期不重啓業務節點的情況下改變業務應用的運行時行爲,也可以結合 CoreDNS 將 Nacos 上註冊的服務導出爲 DNS 域名來實現動態 DNS 服務。

Nacos 將阿里巴巴集團內部 Diamond,ConfigServer,VipServer 三款中間件融合進一款產品,承襲了阿里內部十幾年雙十一大促的性能,穩定性,高可用方面的技術經驗,2018 年從阿里內部開源以來,無論從 github 上的 star 數,fork 數,社區活躍度還是知名技術網站論壇評選的獎項可以看出它的受歡迎程度。從註冊配置中心單一領域產品角度看,Nacos 現在是國內首選,被非常多的頭部企業使用,佔據國內 60%+ 的市場份額。

Nacos 能收到這麼多開源社區的關注度和參與度,和它的使用場景是息息相關的。

上圖列舉了 Nacos 的一些非常常見的使用場景,覆蓋了微服務領域,高可用領域,前端生態,數據庫領域等等,產品功能角度看,服務發現和註冊涉及的場景會相對聚焦一些,它所承載的數據是服務名或者域名到 ip 地址的映射關係,而配置管理涉及的場景就會豐富很多,可以說是涉及到任何的領域。從上面圖中可以看出,其中有一些非常關鍵的場景都是靠配置中心來完成的,比如流量調度,路由規則,應急預案,一些業務的關鍵開關,數據庫的一些數據源配置。

這些數據是非常敏感的,如果數據被誤寫,密碼數據被泄露,可能會產生非常大的數據安全問題。

在業界內也發生過不少的敏感數據泄漏事件,用戶把開源的 Nacos 部署到了生產環境,但沒有對 Nacos 做一些必要的安全防護的措施,當前行業對安全方面的意識也在逐漸提高,國家頒佈的網絡安全三級等保也對非銀行業的平臺做了若干個角度的安全要求。

Nacos 面臨的安全問題

上面是 Nacos 運行時的簡要示意圖,左側是業務應用和 nacos-client,通常是部署在一個進程中,右側是 Nacos 的服務端,包括 Nacos-Server 和中心化的持久化存儲。從數據流轉方向上看,數據由業務應用側產生調用 nacos-client 的配置發佈接口,通過網絡傳輸至 Nacos-Server 端,Nacos-Server 端將配置內容持久化存儲,並且從持久化存儲加載到 Server 本地的磁盤緩存和內存緩存中,客戶端查詢配置時將配置內容從服務端拉取到本地,出於高可用容災的考慮,客戶端會將配置內容緩存在客戶端本地磁盤中。從數據的角度看,配置內容會存在於業務應用本地的磁盤緩存,服務端本地的磁盤緩存,持久化的數據庫中,並且數據會在傳輸過程中經過每一箇中間網絡設備。

現在我們做個假設,讓我們先忽略安全內網,假設這些組件都是暴露在公網之中。基於這個假設,可能會存在以下幾個方面的問題。

  • 業務應用機器被入侵

    因爲 Nacos 的配置數據會在客戶端進行緩存,所以如果業務應用的機器被入侵,本地緩存中的配置內容也會泄漏

  • 數據傳輸過程中被中間網絡設備獲取

    數據經過中間網絡設備,可能被流量抓包,如果數據是明文傳輸,數據就會泄漏

  • Nacos 服務端被入侵

    如果 Nacos 服務端所部署的機器被外部攻破,那麼存在於本地磁盤緩存內的也會被明文獲取

  • 持久化層數據庫被拖庫

    配置存儲的中心化數據庫被拖庫也會導致配置泄露

  • Nacos 服務端可公開訪問

Nacos 服務端沒有開啓權限訪問,任何知道 server 節點 IP 地址的人都可以通過 Nacos 接口 API 拉取到配置內容,或者對 Nacos 服務端的節點設置了比較寬泛的 ACL 規則,這兩種情況在用戶使用 Nacos 的場景中都比較常見,比如在商業化 MSE Nacos 的真實案例中,有很多用戶給實例開了公網訪問並且設置了比較寬泛的 ACL 規則的情況下沒有開啓鑑權,這些都是風險比較高的場景。

我們對以上的幾個問題進行一些簡單的歸納,可以分爲三個方面,存儲安全,傳輸安全,訪問控制。

上面我們做了幾個假設,比如忽略安全內網隔離的問題,假設每一個環境都可能會被攻破的。其實這也就是安全零信任理念中一個非常重要的原則,“永不信任,永遠驗證”,下一節我們將介紹下 Nacos 的安全零信任實踐,如何通過安全零信任理念來保障 Nacos 數據安全。

Nacos 安全零信任實踐

我們先簡單瞭解下安全零信任的相關內容。

零信任的定義

顧名思義,即對任何未經驗證的訪問實體默認不信任。零信任是一種現代化的網絡安全訪問理念,核心思想是“永不信任,持續驗證”。

零信任解決的問題

它誕生的背景是基於當前 IT 網絡架構下的一系列現實因素。

  • 網絡邊界模糊化,現代系統網絡架構更加負責,雲計算,物聯網等興起打破了傳統的”安全內網“邊界
  • 安全漏洞無法避免:網絡攻擊和數據泄露事件增加,傳統安全模型無法應對
  • 數據泄露風險:數據泄露對企業造成的直接經濟損失以及輿情影響
  • 合規性要求:整體大環境下,行業和法規要求企業對網絡安全實時更加嚴格的驗證

零信任基本功能

零信任的幾個基本功能包括:

  • 身份管理:提供對身份全生命週期管理
  • 身份認證:對所以訪問的來源進行身份認證
  • 訪問控制:確保對網絡實體發起訪問的資源進行授權
  • 傳輸安全:確保所有在網絡中傳輸的數據不被竊取和篡改
  • 行爲監控:對行爲進行持續監測,實時響應異常

零信任基本原則

  • 永不信任,永遠驗證
  • 訪問控制,最小權限訪問
  • 微分段,防止橫移,減少攻擊面

Nacos 傳輸安全

接下來我會按照 Nacos 傳輸安全,存儲安全,訪問控制三個方面來介紹 Nacos 的安全零信任實踐。

第一個方面是 Nacos 傳輸安全 TLS,我們知道 TLS 解決的是數據傳輸過程中的三個問題,一個是數據保密性,基於 TLS 傳輸的數據都會被加密,無法被第三方獲取明文,第二個是完整性,它保證的是數據不被第三方篡改,第三個是身份認證,它解決的是通信雙方的身份認證問題,防止中間人攻擊。

TLS 的握手過程分爲幾個主要階段,這裏做了部分簡化,第一個階段是客戶端和服務端之間進行 TLS 協議版本,加密算法,壓縮方法等基本信息的確認,第二階段是雙方的證書交換及驗證,這裏保證的是身份認證的問題,第三個階段是雙方通過非對稱加密來協商後續實際傳輸報文過程中所使用對稱祕鑰,第四個階段,雙方發送加密切換消息,雙方開始基於對稱加密祕鑰進行通信,第五個階段是進行實際的應用報文傳輸,這裏會使用對稱加密進行數據傳輸,同時對報文進行 MAC 校驗保證完整性。

Nacos 在 2.x 的版本中使用 grpc 來作爲底層通信協議,grpc 內部使用 netty 作爲網絡通信框架,Nacos 的 TLS 能力也是基於 grpc/netty 來實現的,該圖中描述了客戶端服務端的基本組件,其中淡藍色部分是用戶通過參數來控制是否開啓 TLS 的方式,包括屬性文件,jvm 參數,環境變量。深藍色部分是 Nacos 層提供的組件來接受參數,並將參數轉換爲底層 grpc、netty 的組件來實現 TLS 功能。 另外在 server 端我們支持了服務端證書的動態輪轉功能,可以自定義 SPI 擴展來實現當服務端證書文件變更時的處理邏輯。

這裏我們介紹 Nacos 如何開啓 TLS 傳輸加密功能,整個過程分爲三步:

  • 證書準備

    可以通過購買商業證書來獲得相關的文件信息,如果是開發測試,可以通過 keytool openssl 自籤的方式來生成 SSL 證書,該步驟可以參考網上的自籤 SSL 證書流程,此處不在贅述。這一步中需要得到如下幾個信息:

    • CA 證書文件:用於對端的證書合法性,對端使用的證書必須是通過是由該 CA 簽發,防止身份冒充中間人攻擊  
    • 證書文件&證書私鑰文件:用於服務端開啓 TLS 功能
    • 私鑰文件密碼:處於安全性考慮,通常需要爲私鑰文件設置密碼。
  • Nacos 服務端啓動

    • nacos.remote.server.rpc.tls.enable=true開啓 TLS 開關,設置爲 true 表示服務端開啓 TLS 功能
    • nacos.remote.server.rpc.tls.certChainFile={certFilePath}指定證書文件路徑
    • nacos.remote.server.rpc.tls.certPrivateKey={keyPath}指定證書私鑰文件
    • *nacos.remote.server.rpc.tls.mutualAuth=true/false是否開啓雙向認證,默認爲 false,設置爲 true 表示需要驗證客戶端的身份,客戶端也需要同步設置證書和私鑰文件
    • *nacos.remote.server.rpc.tls.trustCollectionChainPath={trustFilePath}受信任客戶端 CA 證書,當開啓雙向認證時,用於校驗客戶端的證書合法性
    • *nacos.remote.server.rpc.tls.compatibility=true/false是否支持非加密客戶端,默認是 true
    • *nacos.remote.server.rpc.tls.sslContextRefresher={spiName}指定證書輪轉感應器 SPI 名稱
  • Nacos 客戶端啓動

    • nacos.remote.client.rpc.tls.enable=true客戶端開啓 TLS 開關,如果設置爲 true 的情況下,服務端不支持 TLS 或者沒有開啓 TLS,則會連接失敗
    • nacos.remote.client.rpc.tls.trustAll=true/false是否信任所有支持 TLS 的服務端,設置爲 true 表示不對服務端證書進行 CA 校驗
    • *nacos.remote.client.rpc.tls.trustCollectionChainPath={trustFilePath}trustAll 爲 true 時,需要設置受信任服務端 CA 證書文件
    • *nacos.remote.client.rpc.tls.mutualAuth=true/false是否開啓雙向認證,設置爲 true 時,則需要同步設置客戶端的證書文件和私鑰
    • *nacos.remote.client.rpc.tls.certChainFile={certFilePath}指定客戶端的證書文件路徑
    • *nacos.remote.client.rpc.tls.certPrivateKey={keyPath}指定客戶端的證書私鑰文件

Nacos 存儲安全

配置存儲安全解決的問題是當各個可能存在配置內容的介質被攻破,配置被明文訪問的問題。在這種情況下,我們需要對配置內的內容進行加密存儲,加密存儲需要第三方加密系統來輔助完成,複雜性會上升,通常我們建議對部分敏感配置進行加密存儲。下面我們將介紹如何通過配置的加解密插件來實現敏感配置存儲。

上圖介紹了加密配置的發佈過程,明文內容在業務應用中產生,經由 nacos-client 發往服務端,在客戶端內部,加密配置經過 IConfigFilter 過濾器,會經過加解密插件的加密 encrypt 步驟,將明文轉化爲密文和 dataKey,通常的做法是本地先生成一個隨機 key,通過這個隨機 key 對明文內容進行本地加密爲密文,將 key 經由加解密插件加密的 dataKey,然後把將密文配置內容和加密後的 dataKey 發向服務端,服務端將密文 +dataKey 進行持久化存儲,並且通知集羣所有節點將密文 +dataKey 從數據庫加載到服務端本地的磁盤緩存和內存緩存中。這種情況下,即使服務端被攻破,持久化數據庫被拖庫,無法通過密文 +dataKey 解密對應的明文,降低數據泄露帶來的安全風險。

接下來是加密後的配置的查詢過程,客戶端從服務端查詢配置,服務端將密文 +dataKey 返回給客戶端,客戶端經由 IConfigFilter 過濾器,會經過加解密插件的解密 decrypt,將密文 +dataKey 解密爲明文,然後在內存中將明文回調給業務的監聽器,其中客戶端本地緩存中存儲的是密文和 dataKey,並不是明文,以此來保證整個鏈路中的配置存儲安全。

在整個鏈路中引入了第三方加解密插件,增加數據安全的同時,也會帶來額外的鏈路複雜度,我們建議是對一些敏感信息進行加解密,比如用戶名密碼,數據庫配置,AK/SK, Token 等。同時因爲加解密插件實現了密文->明文的加密過程,在與其的交互過程中也要保證數據傳輸安全,並且如果它是有狀態的,也要保證它的存儲安全。在商業化 MSE Nacos 中,我們使用 KMS 作爲第三方加解密插件的實現方,來保證整體的數據安全。

Nacos 訪問控制

第三個部分,我們將介紹如何通過 Nacos 鑑權插件實現對 Nacos 的訪問控制。

鑑權插件對 Nacos 訪問控制進行了基礎的模型抽象,分爲客戶端和服務端,兩者通過約定的規則實現整體的訪問控制功能。

  • 客戶端

    • 提取識別客戶端身份信息 IdentityContext
    • 使用身份信息對訪問資源進行簽名
    • 在報文中上傳身份信息+簽名
  • 服務端

    • 提取客戶端上傳的身份信息 identityNames
    • 驗證身份合法性及驗證簽名 validateIdentity
    • 驗證身份與訪問資源的權限 validateAuthority

身份信息 IdentityContext 可以是用戶名密碼,AK/SK,或者 STS/RAM ROLE 自動輪轉的 AK/TOKEN,如果想自定義實現自己的身份信息,只需要按需實現 SPI 即可,也可在自定義實現中實現動態身份輪轉的邏輯。無論使用哪種身份識別信息,客戶端和服務端要保持一致的規則,包括身份信息的提取以及簽名驗證的邏輯。

服務端處理身份驗證和簽名驗證之外,還需要對身份和訪問資源進行權限的校驗,用戶權限管理比較通用的是 RBAC 模型,RBAC 全稱是基於角色的訪問控制,當前 Nacos 默認的鑑權插件也就是使用這個模型。

RBAC 模型由權限-角色-用戶三個部分組成。

  • 權限:權限定義了對指定資源的訪問規則,包括資源定義+ 操作(讀/寫)+許可(允許/拒絕),比如允許對命名空間 A 下的配置進行讀操作。
  • 角色:擁有一系列權限集合的虛擬身份,它包含了多個權限的集合,比如定義命名空間 A 管理員角色,給其賦於對命名空間 A 下的配置進行讀寫操作。
  • 用戶:可實際訪問系統的實體用戶,用於一個代表自身身份的標識,可以將多個角色賦於實體的用戶,間接擁有多種權限。分爲管理員和普通用戶,管理員擁有最高權限,一般對其會進行 MFA 多因素認證。普通用戶由管理員創建,可以給用戶賦於多種角色。

上面提到,Nacos 默認的鑑權插件也是基於 RBAC 模型構建,可以完成基本的權限控制,開啓默認的鑑權功能需要創建 users,roles, permissions 三張表用於存儲對應的數據。

開啓 Nacos 訪問控制需要三步:

1)服務端開啓鑑權

  • 打開鑑權開關:nacos.core.auth.enabled=true
  • 設置鑑權插件:nacos.core.auth.system.type=nacos,指定爲 Nacos 模型內置鑑權插件名

2)創建用戶/角色/權限

  • 修改 admin 角色默認密碼:開啓服務端鑑權開關後,登錄 Nacos 控制檯需要設置用戶名密碼,首次登錄後務必替換默認密碼。開啓鑑權後,登錄控制檯,左側會出現權限控制的菜單
  • 創建普通用戶,設置用戶名密碼
  • 創建角色,綁定用戶-角色
  • 創建權限,綁定資源訪問規則和角色的關係

3)創建用戶/角色/權限

服務端打開鑑權之後,控制檯登錄需要驗證用戶名密碼,通過 nacos-client 進行接口調用時也需要傳入用戶名,密碼,在構建 ConfigService 和 NamingService 時需要在 properties 屬性中傳入用戶名密碼,否則接口訪問會返回 403 無權限錯誤碼。

🔔 注意: 開源默認的鑑權插件當前支持基於命名空間粒度的權限控制,MSE 商業化 Nacos 基於阿里雲產品 RAM 實現訪問控制,可以支持細粒度服務 serviceName/ 配置 dataId 級別權限控制。

結語

以往我們更多地從用戶的易用性角度出發,爲了降低 Nacos 使用門檻,安全層面往往被忽視,在過去一年內,Nacos 在安全方面做了很大的投入,其中也因爲安全問題做了一下 breakchange 的版本更新,刪除了一些默認的安全方面的參數,提升用戶在使用 Nacos 過程中的安全意識。

除了實現業務功能,安全問題也是當下每一個架構師需要關注的必不可少的方面。上面我們介紹瞭如何在使用開源 Nacos 過程中實現傳輸安全,存儲安全,訪問控制三方面來構建安全零信任架構,在此我們倡議在生產環境使用 Nacos 中默認開啓訪問控制,關閉匿名訪問,對身份權限進行精細化權限管控,使用 TLS 保證數據傳輸安全,並在此基礎之上,使用加解密插件對高敏感信息進行加密存儲。未來在開源 Nacos 側我們會持續完善安全防護策略,在快速入門中引導安全相關設置,開源控制檯中增加更多的提示,加強用戶數據安全意識建設。

Nacos 是一款開源產品,我們在 2.0 的版本中進行了多個插件化改造,用戶可以進行插件化定製或者增強自建 Nacos 的安全等級,這些需要一些額外的定製開發工作。

這裏推薦大家試用商業化 MSE Nacos ,可獲得一站式安全防護能力。在商業化 MSE Nacos 中我們提供了完善了安全防護能力,包括 TLS 證書統一管理分發及自動輪轉,聯合 KMS3.0 支持加解密解決方案,結合 RAM 實現了完善細粒度的鑑權規則,支持日常安全巡檢,風險管理等進階安全防護能力。

如果你有更多的安全需求,也歡迎通過釘釘搜索羣號聯繫我們。(釘釘羣號:23371469

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章