天天看點

安全管理最佳實踐系列:給ECS執行個體配置一個RAM角色身份(使用動态STS-Token通路雲服務API)

AK(AccessKey)是代表使用者身份的鑰匙,是使用者通路阿裡雲API的身份認證密鑰。如果部署在ECS執行個體中的應用程式需要通路各種阿裡雲服務API,使用者通常會将AK儲存在應用程式的配置檔案中,使得應用程式能讀取AK來調用阿裡雲服務API。這裡存在兩個問題:(1) 保密性問題。不管AK以何種形式存在于執行個體中,它都可能随着快照、鏡像及鏡像建立出來的執行個體被洩露。(2) 難運維性問題。由于AK存在于執行個體中,如果要更換AK(比如周期性輪轉或切換使用者身份),那麼需要對每個執行個體和鏡像進行更新并重新部署,這會極大增加對執行個體和鏡像管理的複雜性。

針對保密性問題的通常解法是借助加解密(Crypto)或通路控制(Access Control)技術。

加密方案

由于AK本身也是一種密鑰,而加解密技術通常不适合保護密鑰本身,因為總有最後一把密鑰(Last Key)是需要保護的,是以加密技術這裡不适用。當然可能有少數區域的ECS執行個體提供了可信加密裝置支援(比如HSM、TPM或SGX),但基于硬體來保護Last Key的方法是另一個專題,本文不做讨論。

通路控制方案

一種簡單有效的AK保護做法是采用通路控制技術。比如,可以使用作業系統提供的通路控制機制來保護存放AK密鑰的配置檔案,比如 $ chmod 400 ~/.aliyuncli/credentials (隻允許目前使用者可讀) 在使用者登入管理嚴格的條件下,這種機制可以起到一定的保護作用。但由于AK本身沒有加密,通過快照或鏡像洩露之後就可能繞過通路控制機制,仍然可能洩漏。

針對難運維性問題就難解了,隻要AK存在于執行個體檔案中,對大量執行個體和鏡像的管理複雜性就無法降低。

站在作業系統設計的角度,使用者态中難解的問題,在核心态看來根本不是事。同樣,ECS執行個體中難解的問題交給ECS管控來解,也不是難題。

圖1較長的描述了如何給ECS執行個體配置RAM角色的工作原理:

安全管理最佳實踐系列:給ECS執行個體配置一個RAM角色身份(使用動态STS-Token通路雲服務API)

(圖1)

Step 1. 雲賬号(root)在RAM中建立一個ECS執行個體型的RAM-Role,并對角色授予合适的Policy權限。

Step 2. 啟動ECS執行個體時,可以配置使用上一步驟中建立的RAM-Role。

所謂ECS執行個體型角色,它隻是RAM服務角色中的一種類型,表示該角色是由客戶建立并授權給該客戶的ECS執行個體所使用。ECS服務在建立執行個體時:(i) 根據所配置的RAM角色,調用AssumeRole去通路STS請求擷取該角色的StsToken;(ii) STS服務會驗證ECS服務身份及該角色的授權類型,驗證通過後頒發StsToken,否則拒絕請求。擷取到StsToken後,ECS将通過Metadata服務提供給執行個體中的應用程式通路(HTTP通路位址:100.100.100.200 )。StsToken過期時間通常為6小時,在過期之前ECS服務會自動維護StsToken的重新整理。

Step 3. 擷取StsToken。

ECS執行個體中的應用程式需要通過通路 ECS Metadata服務來擷取相應的StsToken。比如, 在Linux中執行指令:

即可擷取StsToken及過期時間等中繼資料資訊。

Step 4. 使用StsToken調用雲服務API。

Step 5. StsToken在有效期内及權限範圍内都能正常通路雲服務API。如果StsToken過期,那麼需要從ECS Metadata服務中重新擷取StsToken;如果StsToken權限不足,那麼需要找管理者給執行個體RAM角色添加足夠的權限。執行個體RAM角色的權限更新後,StsToken權限立即生效,使用者無需重新啟動ECS執行個體。

在上文的技術圖解1中,讀者可以發現授權者和ECS執行個體操作者都是管理者。而對很多企業客戶來說,授權者和ECS執行個體操作者通常都是不同的RAM使用者,不同的人幹不同的事,職責分離。

那麼針對管理者與操作員分離的客戶場景,我們需要對圖解1進行一下擴充,得到如下的圖解2:

安全管理最佳實踐系列:給ECS執行個體配置一個RAM角色身份(使用動态STS-Token通路雲服務API)

(圖2)

除了增加Step 1.5之外,其它各步驟與圖解1相同。

當RAM使用者(假設僅有ECS權限,而并非RAM權限管理者)在建立ECS執行個體并配置RAM角色時,這個RAM使用者必須要被授予對該角色的PassRole權限。ECS服務會強制檢查目前使用者是否擁有指定RAM-Role的 ram:PassRole 權限,否則無法成功建立ECS執行個體。這樣做能確定隻有被授權使用者才能為ECS執行個體配置RAM角色,進而避免RAM角色權限被濫用。

Step 1.5 管理者給操作員增加一個PassRole權限。

管理者可以通過RAM按如下Policy樣例建立一個自定義政策(注意替換rolename為自己的RAM角色名稱),然後将這個自定義政策授權給操作員:

至此,你已經通曉了ECS執行個體型角色的概念和技術原理,趕緊開啟安全最佳實踐吧,讓你不再因為ECS執行個體中的AK洩露和管理難的問題而煩惱了。