RAM和STS是阿里雲提供的許可權管理系統。

RAM主要的作用是控制帳號系統的許可權。通過使用RAM可以將在主帳號的許可權範圍內建立子用戶,給不同的子使用者指派不同的許可權從而達到授權管理的目的。

STS是一個安全憑證(Token)的管理系統,用來授予臨時的存取權限,這樣就可以通過STS來完成對於臨時用戶的訪問授權。

為什麼要使用RAM和STS

RAM和STS需要解決的一個核心問題是如何在不暴露主帳號的AccessKey的情況下安全的授權別人訪問。因為一旦主帳號的AccessKey暴露出去的話會帶來極大的安全風險,別人可以隨意操作該帳號下所有的資源,盜取重要訊息等。

RAM提供的實際上是一種長期有效許可權控制機制,通過分出不同許可權的子帳號,將不同的許可權分給不同的用戶,這樣一旦子帳號泄露也不會造成全域的資訊泄露。但是,由於子帳號在一般情況下是長期有效。
说明
因此,子帳號的AccessKey也是不能泄露的。

相對於RAM提供的長效控制機制,STS提供的是一種臨時訪問授權,通過STS可以返回臨時的AccessKey和Token,這些資訊是可以直接發給臨時用戶用來訪問OSS。一般來說從STS獲取的許可權會受到更加嚴格的限制,並且擁有時間限制,因此這些資訊泄露之後對於系統的影響也很小。

這些功能在下文中會以實際的例子來說明。

基本概念

以下是一些基本概念的簡單解釋:

  • 子帳號(RAM account):從阿里雲的主帳號中建立出來的子帳號,在建立的時候可以分配獨立的密碼和許可權,每個子帳號擁有自己AccessKey,可以和阿里雲主帳號一樣正常的完成有許可權的操作。一般來說,這裡的子帳號可以理解為具有某種許可權的用戶,可以被認為是一個具有某些許可權的操作發起者。
  • 角色(Role):表示某種操作許可權的虛擬概念,但是沒有獨立的登入密碼和AccessKey。
    说明
    子帳號可以扮演角色,扮演角色的時候的許可權是該角色自身的許可權。
  • 授權策略(Policy):用來定義許可權的規則,比如允許用戶讀取、或者寫入某些資源。
  • 資源(Resource):代表用戶可訪問的雲資源,比如OSS所有的Bucket、或者OSS的某個Bucket、或者OSS的某個Bucket下面的某個Object等。
子帳號和角色可以類比為某個個人和其身份的關係,某人在公司的角色是員工,在家裡的角色是父親,在不同的場景扮演不同的角色,但是還是同一個人。在扮演不同的角色的時候也就擁有對應角色的許可權。單獨的員工或者父親概念並不能作為一個操作的實體,只有有人扮演了之後才是一個完整的概念。這裡還可以體現一個重要的概念,那就是角色可以被多個不同的個人同時扮演。
说明
完成角色扮演之後,該個人就自動擁有該角色的所有許可權。

這裡再用一個例子解釋一下。

  • 某個阿里雲用戶,名為Alice,其在OSS下有兩個私有的Bucket,alice_a和alice_b。alice對這兩個Bucket都擁有完全的許可權。

  • 為了避免阿里雲帳號的AccessKey泄露導致安全風險,Alice使用RAM建立了兩個子帳號bob和carol,bob對alice_a擁有讀寫權限,carol對alice_b擁有讀寫權限。bob和carol都擁有獨立的AccessKey,這樣萬一泄露了也只會影響其中一個Bucket,而且Alice可以很方便的在控制台取消泄露用戶的許可權。

  • 現在因為某些原因,需要授權給別人讀取alice_a中的Object,這種情況下不應該直接把bob的AccessKey透露出去,那麼,這個時候可以新建一個角色,比如AliceAReader,給這個角色賦予讀取alice_a的許可權。但是請注意,這個時候AliceAReader還是沒法直接用的,因為並不存在對應AliceAReader的AccessKey,AliceAReader現在僅僅表示一個擁有訪問alice_a許可權的一個虛擬實體。

  • 為了能獲取臨時授權,這個時候可以調用STS的AssumeRole介面,告訴STS,bob將要扮演AliceAReader這個角色,如果成功,STS會返回一個臨時的AccessKeyId、AccessKeySecret還有SecurityToken作為訪問憑證。將這個憑證發給需要訪問的臨時用戶就可以獲得訪問alice_a的臨時許可權了。憑證過期的時間在調用AssumeRole的時候指定。

為什麼RAM和STS這麼複雜

乍一看RAM和STS的概念是很複雜的,但這是為了許可權控制的靈活性而犧牲了部分的易用性。

將子帳號和角色分開,主要是為了將執行操作的實體和代表許可權集合的虛擬實體分開。如果用戶本身需要的許可權很多,比如讀寫權限,但是實際上每次操作只需要其中的一部分許可權,那麼我們就可以建立兩個角色,分別具有讀寫權限,然後建立一個沒有任何許可權但是可以擁有扮演這兩個角色許可權的用戶。當用戶需要讀的時候就可以臨時扮演其中擁有讀許可權的角色,寫的時候同理,將每次操作中許可權泄露的風險降低。而且通過扮演角色可以將許可權授予其他的阿里雲用戶,更加方便了協同使用。

當然,提供了靈活性並不代表一定要使用全部的功能,應該根據需求來使用其中的一個子集即可。比如不需要帶過期時間的臨時訪問憑證的話,完全可以只使用RAM的子帳號功能而無需使用STS。

下面會用範例提供一些RAM和STS的使用指南,以及使用上的建議。樣本在操作上會盡量使用控制台和命令列等操作方式,減少實際代碼使用。如果需要使用代碼來實現建議參看RAM和STS的API手冊。

測試載入器

在測試中使用到了osscmd,這是OSS的pythonSDK中的一個工具,可以直接在命令列操作OSS。獲取的地址為PythonSDK

osscmd的典型使用方法如下:

下載檔案
./osscmd get oss://BUCKET/OBJECT LOCALFILE --host=Endpoint -i AccessKeyId -k AccessKeySecret
這裡的BUCKET和OBJECT替換成自己的,Endpoint的格式類似oss-cn-hangzhou.aliyuncs.com。AccessKeyId和AccessKeySecret使用自己帳號對應的
上傳檔案
./osscmd put LOCALFILE oss://BUCKET/OBJECT  --host=Endpoint -i AccessKeyId -k AccessKeySecret
各個欄位含義和下載一致