RAM Policy是基於身份的授權策略,專門用於集中系統管理使用者身份對OSS資源的存取權限。通過RAM Policy可精確定義“哪個身份”、“在什麼條件下”、“可以對哪些OSS資源”、“執行何種操作”,實現許可權精細化管控,保障企業資料安全。
工作原理
RAM Policy採用基於身份的授權模式,授權主體為RAM中的身份實體(RAM使用者、使用者組、RAM角色)。許可權評估嚴格遵循“顯式拒絕優先”原則,OSS收到訪問請求後,系統綜合評估所有相關策略(包括RAM Policy和Bucket Policy),按以下順序進行許可權判定:
顯式拒絕(Deny)優先:任何策略中存在一條明確的
"Effect": "Deny"規則匹配該請求,請求立即被拒絕。尋找顯式允許(Allow):不存在匹配的Deny規則時,系統尋找是否存在一條明確的
"Effect": "Allow"規則匹配該請求。匹配成功時,請求被允許。預設拒絕:既無匹配的Deny規則,也無匹配的Allow規則時,請求預設被拒絕。
OSS支援兩種權限原則類型:系統策略和自訂策略。系統策略由阿里雲建立和維護,使用者只能使用不能修改。自訂策略由使用者建立和維護,可自主進行建立、更新和刪除操作。
授權系統權限原則
系統權限原則由阿里雲建立,可在RAM控制台直接為使用者身份授權。以下以RAM使用者為例示範授權步驟。
前往RAM使用者列表,單擊目標使用者操作列的添加权限。
在搜尋方塊中輸入系統策略名稱稱,勾選目標系統策略。OSS支援以下兩種系統策略:
AliyunOSSFullAccess:擁有管理Object Storage Service服務(OSS)的許可權。
AliyunOSSReadOnlyAccess:擁有隻讀訪問Object Storage Service服務(OSS)的許可權。
單擊確認新增授權,完成使用權限設定。
授權自訂權限原則
自訂策略由使用者自主建立和維護,授權自訂權限原則時,需先建立自訂權限原則,再為對應的使用者身份進行授權。
步驟一:建立自訂權限原則
前往權限原則列表,單擊创建权限策略。
選擇指令碼編輯,在編輯框內輸入JSON格式的授權策略。可使用RAM Policy Editor快速產生授權策略。
樣本授權策略:允許對
example-bucket及該Bucket內所有資源的全部操作。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:*", "Resource": [ "acs:oss:*:*:example-bucket", "acs:oss:*:*:example-bucket/*" ] } ] }完整的授權策略包含Version(版本號碼)和Statement(授權語句)。
Version:權限原則版本,固定為
1,不允許修改。Statement:策略語句的主體,包含一條或多條具體的授權/拒絕規則。每條授權語句包含Effect(授權效力)、Action(授權操作)、Resource(授權資源)和Condition(授權條件)。
策略元素
說明
Effect
策略的效力,可選值為
Allow(允許)或Deny(拒絕)。Action
對資源執行的具體操作,支援使用萬用字元
*。Resource
策略作用的資源範圍。
Condition
策略生效的條件。
當配置多個條件時,所有條件必須同時滿足(AND關係),策略才會生效。
完整的授權元素列表請參見OSS授權文法與元素。
單擊确定,輸入策略名称,然後單擊确定,完成自訂策略建立。
步驟二:為使用者身份進行授權
建立自訂權限原則後,需要將自訂策略授權給目標使用者身份。以下以RAM使用者為例示範授權步驟。
前往RAM使用者列表,單擊目標使用者操作列的添加权限。
在搜尋方塊中輸入自訂策略名稱稱,勾選目標策略。
單擊確認新增授權,完成使用權限設定。
常見授權情境
以下情境展示了RAM Policy在實際業務中的典型應用,涵蓋許可權授予、訪問限制和安全控制等多種需求。每個情境提供完整的策略配置樣本,可根據實際需求修改其中的Bucket名稱、目錄路徑等參數後直接使用。
情境1:授予RAM使用者對某個Bucket的完全控制許可權
以下樣本為授予RAM使用者對名為mybucket的Bucket擁有完全控制的許可權。
對於行動裝置 App來說,授予使用者對Bucket的完全控制許可權存在極高風險,應盡量避免。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
}
]
}情境2:禁止RAM使用者刪除某個Bucket下匹配特定模式檔案的許可權
以下樣本為禁止RAM使用者刪除名為mybucket的Bucket下首碼為abc且格式為.txt的所有檔案。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/abc*.txt"
]
}
]
}情境3:授予RAM使用者列舉並讀取某個Bucket下所有資源的許可權
以下樣本為授予RAM使用者通過OSS SDK或OSS命令列工具列舉並讀取名為
mybucket的Bucket下所有資源的許可權。說明ListObjects操作(Action)必須以整個Bucket作為Resource。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": "oss:GetObject", "Resource": "acs:oss:*:*:mybucket/*" } ] }以下樣本為授予RAM使用者通過OSS控制台列舉並讀取名為
mybucket的Bucket下所有資源的許可權。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:*" }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetBucketAcl" ], "Resource": "acs:oss:*:*:mybucket" }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:mybucket/*" } ] }
情境4:禁止RAM使用者刪除某個Bucket的許可權
以下樣本用于禁止RAM使用者刪除名為mybucket的Bucket的許可權。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:mybucket",
"acs:oss:*:*:mybucket/*"
]
},
{
"Effect": "Deny",
"Action": [
"oss:DeleteBucket"
],
"Resource": [
"acs:oss:*:*:mybucket"
]
}
]
}情境5:授予RAM使用者訪問某個Bucket下多個目錄的許可權
假設用於存放照片的Bucket為mybucket,該Bucket下有一些目錄,代表照片的拍攝地,每個拍攝地目錄下還包含年份子目錄。
mybucket[Bucket]
├── beijing
│ ├── 2014
│ └── 2015
└── hangzhou
├── 2014
└── 2015 需要授予RAM使用者訪問mybucket/hangzhou/2014/和mybucket/hangzhou/2015/目錄的唯讀許可權。目錄層級的授權屬於授權的進階功能,根據使用情境不同,授權策略的複雜程度也不同,以下幾種情境可供參考。
授予RAM使用者僅擁有讀取目錄
mybucket/hangzhou/2014/和mybucket/hangzhou/2015/中檔案內容的許可權。由於RAM使用者知道檔案的完整路徑,建議直接使用完整的檔案路徑來讀取目錄下的檔案內容。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] } ] }授予RAM使用者使用OSS命令列工具訪問目錄
mybucket/hangzhou/2014/和mybucket/hangzhou/2015/並列舉目錄中檔案的許可權。RAM使用者不清楚目錄中有哪些檔案,可使用OSS命令列工具或API直接擷取目錄資訊,此情境下需要添加
ListObjects許可權。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition":{ "StringLike":{ "oss:Prefix": [ "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] }授予RAM使用者使用OSS控制台訪問目錄的許可權。
使用OSS控制台訪問目錄
mybucket/hangzhou/2014/和mybucket/hangzhou/2015/時,RAM使用者可從根目錄開始,逐層進入要訪問的目錄。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketLifecycle", "oss:GetBucketWorm", "oss:GetBucketVersioning", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:GetObjectAcl" ], "Resource": [ "acs:oss:*:*:mybucket/hangzhou/2014/*", "acs:oss:*:*:mybucket/hangzhou/2015/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects" ], "Resource": [ "acs:oss:*:*:mybucket" ], "Condition": { "StringLike": { "oss:Delimiter": "/", "oss:Prefix": [ "", "hangzhou/", "hangzhou/2014/*", "hangzhou/2015/*" ] } } } ] }
情境6:禁止RAM使用者刪除某個Bucket下任意檔案的許可權
以下樣本用于禁止RAM使用者刪除名為mybucket的儲存空間下任意檔案的許可權。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:*:mybucket/*"
]
}
]
}情境7:禁止RAM使用者訪問指定標籤Object的許可權
以下為添加Deny策略,用于禁止RAM使用者訪問儲存空間examplebucket下對象標籤為status:ok以及key1:value1的Object的許可權。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Resource": [
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:ExistingObjectTag/status":"ok",
"oss:ExistingObjectTag/key1":"value1"
}
}
}
]
}情境8:授予RAM使用者通過特定的IP地址訪問OSS的許可權
在
Allow授權中增加IP地址限制。以下樣本為在
Allow授權中增加IP地址限制,授予RAM使用者僅允許通過192.168.0.0/16和198.51.100.0/24兩個IP位址區段讀取名為mybucket的Bucket下所有資源的許可權。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ], "Condition":{ "IpAddress": { "acs:SourceIp": ["192.168.0.0/16", "198.51.100.0/24"] } } } ] }在
Deny授權中增加IP地址限制。以下樣本為在
Deny授權中增加IP地址限制,禁止源IP地址不在192.168.0.0/16範圍內的RAM使用者對OSS執行任何操作。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:ListBuckets", "oss:GetBucketStat", "oss:GetBucketInfo", "oss:GetBucketTagging", "oss:GetBucketAcl" ], "Resource": [ "acs:oss:*:*:*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Resource": [ "acs:oss:*:*:mybucket", "acs:oss:*:*:mybucket/*" ] }, { "Effect": "Deny", "Action": "oss:*", "Resource": [ "acs:oss:*:*:*" ], "Condition":{ "NotIpAddress": { "acs:SourceIp": ["192.168.0.0/16"] } } } ] }說明由於權限原則的鑒權規則是Deny優先,所以訪問者從
192.168.0.0/16以外的IP地址訪問mybucket中的內容時,OSS會提示沒有許可權。
情境9:通過RAM或STS服務向其他使用者授權
通過RAM或STS服務授予IP地址為192.168.0.1的使用者使用Java SDK用戶端執行以下操作。
列舉
mybucket中以foo為首碼的對象。允許向
mybucket中上傳、下載和刪除以file開頭的對象。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetBucketAcl",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk",
"oss:Prefix": "foo"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
},
{
"Action": [
"oss:PutObject",
"oss:GetObject",
"oss:DeleteObject"
],
"Resource": [
"acs:oss:*:177530505652xxxx:mybucket/file*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"acs:UserAgent": "java-sdk"
},
"IpAddress": {
"acs:SourceIp": "192.168.0.1"
}
}
}
]
}情境10:禁止將 Bucket 和 Object 的 ACL 設定為公用訪問
以下樣本用于禁止將Bucket和Object的ACL設定為公用訪問,保障OSS資料安全。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutBucket",
"oss:PutBucketAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-acl": "private"
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:PutObject",
"oss:PutObjectAcl"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"oss:x-oss-object-acl": [
"private",
"default"
]
}
}
}
]
}情境11:授予RAM使用者使用IMM相關功能的許可權
以下RAM Policy用於授予RAM使用者使用IMM文檔處理的許可權。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:PostProcessTask",
"oss:ProcessImm"
],
"Resource": "*"
},
{
"Action": [
"imm:CreateOfficeConversionTask",
"imm:GetWebofficeURL"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram:*:*:role/aliyunimmdefaultrole"
}
]
}情境12:授予RAM使用者轉換儲存冗餘類型的許可權
授予RAM使用者轉換某個Bucket儲存冗餘類型的許可權。
以下樣本為RAM使用者授予轉換
mybucket的儲存冗餘類型的許可權。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:mybucket" } ] }授予RAM使用者轉換所有Bucket儲存冗餘類型的許可權。
重要以下樣本會授予RAM使用者轉換阿里雲帳號下所有Bucket的儲存冗餘類型的許可權,請謹慎操作。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:CreateBucketDataRedundancyTransition", "oss:GetBucketDataRedundancyTransition", "oss:ListBucketDataRedundancyTransition", "oss:DeleteBucketDataRedundancyTransition" ], "Resource": "acs:oss:*:*:*" } ] }
情境13:授予RAM使用者建立OSS資源套件訂單的許可權
以下RAM Policy用於授予RAM使用者建立OSS資源套件訂單的許可權。
RAM使用者建立OSS資源套件訂單後,可聯絡雲帳號擁有者完成訂單支付。如果要使RAM使用者能夠完成OSS資源套件訂單支付,雲帳號擁有者需要授予RAM使用者支付訂單的許可權bss:PayOrder。bss:PayOrder屬於高危許可權,涉及資金操作,非必要請勿授予。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:CreateOrder",
"Resource": "acs:oss:*:*:*"
}
]
}情境14:授予RAM使用者開通OSS的許可權
以下RAM Policy用於授予RAM使用者開通OSS的許可權。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ActivateProduct",
"Resource": "acs:oss:*:*:*"
}
]
}情境15:授予RAM使用者讀寫指定標籤Bucket資料的許可權
以下RAM Policy用於授予RAM使用者讀寫指定標籤Bucket資料的許可權,標籤鍵為key1,標籤值為value1。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:ListBuckets",
"oss:GetBucketStat",
"oss:GetBucketInfo",
"oss:GetBucketAcl",
"oss:ListObjects",
"oss:PutObject",
"oss:GetObject"
],
"Resource": [
"acs:oss:*:*:*"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"oss:BucketTag/key1": "value1"
}
}
}
]
}策略生效後,RAM使用者僅能對帶有標籤key1=value1的OSS Bucket執行指定操作。不同訪問方式的行為特性如下:
通過OSS SDK或ossutil發起
ListBuckets請求時,需添加標籤過濾參數(如tag-key=key1,tag-value=value1)。策略配置正確時,返回結果僅包含符合指定標籤條件的Bucket。通過OSS控制台發起
ListBuckets請求時,由於控制台無法附加標籤參數,請求將因不滿足策略條件限制(oss:BucketTag/key1=value1)而被拒絕,系統提示許可權不足。其他動作(如
PutObject、GetObject等)同樣受標籤條件限制,操作的目標Bucket必須滿足key1=value1的標籤要求。
應用於生產環境
在配置RAM Policy和管理RAM身份時,遵循以下安全最佳實務,可有效降低資料泄露風險並確保許可權管控的精確性:
遵循最小許可權原則:始終只授予執行任務所必需的最小許可權集。避免使用
oss:*這樣寬泛的授權,除非絕對必要。通過最小許可權原則可減少潛在的攻擊面,降低許可權濫用和誤操作風險。使用RAM角色和STS臨時憑證:對於應用程式,尤其是部署在ECS或容器中的應用,建議使用RAM角色並擷取STS臨時憑證來訪問OSS。相比長期AccessKey,臨時憑證具備自動到期機制,避免將長期AccessKey寫入程式碼在代碼或設定檔中,顯著降低了AK泄露的風險。
人員使用者與程式使用者分離:為不同的人員和應用程式建立獨立的RAM使用者,實現身份管理的專業化和許可權的精細控制。
人員使用者:設定控制台訪問,使用帳號和密碼訪問雲產品控制台,推薦開啟MFA多因素認證。
程式使用者:設定使用永久AccessKey訪問,通過存取金鑰調用API訪問雲資源。
AccessKey安全管理:
不要把RAM使用者的AccessKey ID和AccessKey Secret儲存在工程代碼中,否則可能導致AK泄露。
建議使用STS或環境變數等方式擷取訪問授權。
定期輪換AccessKey。
RAM角色安全建議:
建立RAM角色後,請勿隨意變更RAM角色的可信實體,避免影響業務或帶來過度授權風險。
設定合理的STS Token有效期間,避免有效期間過長帶來安全風險。
定期審計許可權:定期檢查並清理不再需要的RAM使用者和權限原則,確保許可權與當前業務需求保持一致。
利用Condition加強安全:在策略中添加
Condition,例如限制源IP或VPC,通過多維度條件約束為資料訪問增加額外的安全防線。