Bucket Policy是OSS提供的一種針對存儲空間(Bucket)的授權策略,使您可以精細化地授權或限制有身份的訪問者(阿里云賬號、RAM用戶、RAM角色)或匿名訪問者對指定OSS資源的訪問。例如,您可以為其他阿里云賬號的RAM用戶授予指定OSS資源的只讀權限。
通用說明
與RAM Policy不同的是,Bucket Policy還包含了用于指定允許或拒絕訪問資源的主體元素Principal。使用Principal,您可以精細化地授權或限制不同訪問者對指定OSS資源的訪問。在不需要對訪問者做個性化區分的情況下,通過一種集中式的方式管理權限,避免重復對每個訪問者進行授權或限制。例如,通過在Principal輸入多個RAM用戶的UID,來匹配指定的RAM用戶;通過在Principal中輸入通配符星號(*),來匹配所有訪問者。
注意事項
在Bucket Policy的策略語句中,如果Principal為通配符星號(*),且包含Condition,則策略語句會對包含Bucket Owner在內的所有訪問者生效。即使是默認擁有所有訪問權限的Bucket Owner,如果觸發拒絕策略,其訪問請求也會被拒絕。
在Bucket Policy的策略語句中,如果Principal為通配符星號(*),但不包含Condition,則策略語句只會對除Bucket Owner以外的所有訪問者生效。對于默認擁有所有訪問權限的Bucket Owner,不會觸發拒絕策略,其訪問請求不會被拒絕。
示例一:授予指定RAM用戶讀寫權限
當您希望允許自己團隊的指定成員或合作方的指定成員上傳、下載、管理存儲空間中的文件時,您可以通過Bucket Policy在存儲空間級別直接為這些成員對應的RAM用戶授予權限,而無需為每個RAM用戶單獨設置訪問策略。以下示例用于授予指定RAM用戶(UID為27737962156157xxxx
和20214760404935xxxx
)對目標存儲空間(examplebucket
)的讀寫權限。
以下允許策略語句中,由于沒有授予指定RAM用戶列舉存儲空間的權限,因此指定RAM用戶無法在阿里云控制臺的Bucket列表頁面查看所有的存儲空間,找到目標的存儲空間,然后點擊進入。指定RAM用戶可以通過添加收藏路徑來訪問目標存儲空間,而無需擁有列舉存儲空間的權限。具體操作,請參見訪問路徑。
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:GetVodPlaylist",
"oss:PostVodPlaylist",
"oss:PublishRtmpStream",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal":[
"27737962156157xxxx",
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
]
},
{
"Effect":"Allow",
"Action":[
"oss:ListObjects"
],
"Principal":[
"27737962156157xxxx",
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"*"
]
}
}
}
]
}
示例二:授予指定RAM用戶對指定目錄的只讀權限
當您需要保護存儲空間中的特定項目文件不被篡改,但又希望允許相關的項目成員列舉和讀取這些文件時,您可以只為項目成員對應的RAM用戶授予列舉和讀取特定項目文件的權限。以下示例用于授予指定RAM用戶(UID為20214760404935xxxx
)對目標存儲空間(examplebucket
)下指定目錄(前綴為hangzhou/2020
和shanghai/2015
)的只讀權限。
以下允許策略語句中,由于沒有授予指定RAM用戶列舉存儲空間的權限,因此指定RAM用戶無法在阿里云控制臺的Bucket列表頁面查看所有的存儲空間,找到目標的存儲空間,然后點擊進入。指定RAM用戶可以通過添加收藏路徑來訪問目標存儲空間,而無需擁有列舉存儲空間的權限。具體操作,請參見訪問路徑。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:GetObject",
"oss:GetObjectAcl",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl"
],
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/hangzhou/2020/*",
"acs:oss:*:174649585760xxxx:examplebucket/shanghai/2015/*"
]
},
{
"Action":[
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"hangzhou/2020/*",
"shanghai/2015/*"
]
}
},
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
]
}
]
}
示例三:授予所有訪問者列舉所有文件的權限
當您的存儲空間用于公共資源共享,需要讓所有訪問者都能查看文件名但不能訪問文件的實際內容時,您可以設置Principal為通配符星號(*),并為其授予列舉所有文件的權限。以下示例用于授予所有訪問者列舉目標存儲空間(examplebucket
)下所有文件的權限。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Effect":"Allow",
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
]
}
]
}
示例四:授予指定RAM用戶查看存儲空間并列舉文件的權限
當您希望允許自己團隊的指定成員或合作方的指定成員查看存儲空間的所有信息并列舉其中的文件時,您可以通過Bucket Policy在存儲空間級別直接為這些成員對應的RAM用戶授予權限,而無需為每個RAM用戶單獨設置訪問策略。以下示例用于授予指定RAM用戶查看目標存儲空間(examplebucket
)的所有信息并列舉其中的文件的權限。
以下允許策略語句中,由于沒有授予指定RAM用戶列舉存儲空間的權限,因此指定RAM用戶無法在阿里云控制臺的Bucket列表頁面查看所有的存儲空間,找到目標的存儲空間,然后點擊進入。指定RAM用戶可以通過添加收藏路徑來訪問目標存儲空間,而無需擁有列舉存儲空間的權限。具體操作,請參見訪問路徑。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:Get*",
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket"
]
}
]
}
示例五:授予指定RAM角色讀取文件的權限
當您需要允許RAM用戶或應用程序臨時訪問您的存儲空間文件時,可以創建一個RAM角色并授予相應權限。RAM用戶或應用程序通過扮演該角色,便能夠獲得讀取您存儲空間文件的臨時訪問憑證。以下示例用于為一個阿里云賬號下的1個RAM角色下的所有會話以及1個RAM角色下的指定會話授予讀取存儲空間(examplebucket
)下所有文件的權限。
BucketPolicy給角色授權的時候,Principal
需要遵循以下格式:arn:sts::<uid>:assumed-role/<role-name>/<session-name>
。其中,<role-name>
以及<session-name>
的值大小寫敏感。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetObject"
],
"Effect": "Allow",
"Principal": [
"arn:sts::10323xxxxx72056:assumed-role/okrole/sessiontest",
"arn:sts::10323xxxxx72056:assumed-role/secondrole/*"
],
"Resource": [
"acs:oss:*:1032xxxxx672056:examplebucket/*"
]
}
]
}
示例六:限制只能從指定VPC訪問
當您的存儲空間需要限制只能從指定VPC訪問時,您可以使用acs:SourceVpc
條件關鍵字創建一條拒絕策略語句并將其添加到Bucket Policy中,用于阻止來自其他VPC或公網的請求。對于來自其他VPC的請求,會被識別為不符合指定VPC ID條件,觸發策略中的拒絕規則。對于來自公網的請求,由于從公網訪問不包含VPC信息,因此也會被識別為不符合指定VPC ID條件,觸發策略中的拒絕規則。以下示例用于拒絕除指定VPC(ID為t4nlw426y44rd3iq4xxxx
)以外的所有訪問者對目標存儲空間(examplebucket
)進行讀取文件操作。
以下拒絕策略語句中,由于Principal為通配符星號(*),且包含Condition,因此該拒絕策略語句會對包含Bucket Owner在內的所有訪問者生效。添加以下拒絕策略語句后,即使是默認擁有所有訪問權限的Bucket Owner,如果不是從指定VPC訪問,其訪問請求也會被拒絕。
以下拒絕策略語句僅用于限制訪問,而不會授予任何訪問權限。如果授權主體沒有被授予過訪問權限,您可以添加一條允許策略語句來授予其訪問權限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
}
]
}
示例七:限制只能從指定公網IP地址訪問
當您的存儲空間需要限制只能從指定公網IP地址訪問時,您可以使用acs:SourceIp
條件關鍵字創建一條拒絕策略語句并將其添加到Bucket Policy中,用于阻止來自其他公網IP地址或VPC的請求。對于來自其他公網IP地址的請求,會被識別為不符合指定IP條件,觸發策略中的拒絕規則。對于來自VPC的請求,由于從VPC訪問時使用私網IP地址,因此也會被識別為不符合指定IP地址條件,觸發策略中的拒絕規則。以下示例用于拒絕除指定公網IP地址(IP地址為203.0.113.5
)以外的所有訪問者對目標存儲空間(examplebucket
)進行讀取文件操作。
以下拒絕策略語句中,由于Principal為通配符星號(*),且包含Condition,因此該拒絕策略語句會對包含Bucket Owner在內的所有訪問者生效。添加以下拒絕策略語句后,即使是默認擁有所有訪問權限的Bucket Owner,如果不是從指定公網IP地址訪問,其訪問請求也會被拒絕。
以下拒絕策略語句僅用于限制訪問,而不會授予任何訪問權限。如果授權主體沒有被授予過訪問權限,您可以添加一條允許策略語句來授予其訪問權限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"NotIpAddress":{
"acs:SourceIp":[
"203.0.113.5"
]
}
}
}
]
}
示例八:限制只能從指定VPC的指定IP地址網段訪問
當您的存儲空間需要限制只能從指定VPC的指定IP地址訪問時,您可以創建兩條拒絕策略語句:
使用
acs:SourceVpc
條件關鍵字創建一條拒絕策略語句,用于阻止來自其他VPC或公網的請求。對于來自其他VPC的請求,會被識別為不符合指定VPC ID條件,觸發策略中的拒絕規則。對于來自公網的請求,由于公網訪問不包含VPC信息,因此也會被識別為不符合指定VPC ID條件,觸發策略中的拒絕規則。使用
acs:SourceIp
條件關鍵字和acs:SourceVpc
條件關鍵字創建一條拒絕策略語句,用于阻止指定VPC網段之外的請求。
將以上兩條拒絕策略語句添加到Bucket Policy后,兩者之間的邏輯關系為或,即滿足任一條件就會觸發拒絕。以下示例用于拒絕除指定VPC(ID為t4nlw426y44rd3iq4xxxx
)的指定IP地址網段(IP地址網段為192.168.0.0/16
)以外的所有訪問者對目標存儲空間(examplebucket
)進行讀取文件操作。
以下拒絕策略語句中,由于Principal為通配符星號(*),且包含Condition,因此該拒絕策略語句會對包含Bucket Owner在內的所有訪問者生效。添加以下拒絕策略語句后,即使是默認擁有所有訪問權限的Bucket Owner,如果不是從指定VPC的指定IP地址網段訪問,其訪問請求也會被拒絕。
以下拒絕策略語句僅用于限制訪問,而不會授予任何訪問權限。如果授權主體沒有被授予過訪問權限,您可以添加一條允許策略語句來授予其訪問權限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
},
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
},
"NotIpAddress":{
"acs:SourceIp":[
"192.168.0.0/16"
]
}
}
}
]
}
示例九:限制只能從指定公網IP地址或指定VPC訪問
當您的存儲空間需要限制只能從指定公網IP地址或指定VPC訪問時,您可以創建兩條拒絕策略語句:
使用
acs:SourceIp
條件關鍵字創建一條拒絕策略語句,用于阻止來自其他公網IP地址的請求。由于來自指定VPC的請求也存在IP地址,在阻止來自其他公網IP地址的請求時,還需要使用StringNotLike
條件操作和acs:SourceVpc
條件關鍵字來排除這些請求,以避免觸發不滿足指定IP地址條件而被錯誤拒絕。使用
acs:SourceVpc
條件關鍵字創建一條拒絕策略語句,用于阻止來自其他VPC的請求。由于來自指定公網IP地址的請求不包含VPC信息,也會被識別為不符合指定VPC ID條件,在阻止來自其他VPC的請求時,還需要使用StringLike
條件操作和acs:SourceVpc
關鍵字來排除這些請求,以避免觸發不滿足指定VPC ID條件而被錯誤拒絕。
將以上兩條拒絕策略語句添加到Bucket Policy后,兩者之間的邏輯關系為或,即滿足任一條件就會觸發拒絕。以下示例用于拒絕除指定公網IP地址(IP地址為203.0.113.5
)或指定VPC(ID為t4nlw426y44rd3iq4xxxx
)以外的所有訪問者執行對目標存儲空間(examplebucket
)進行讀取文件操作。
以下拒絕策略語句中,由于Principal為通配符星號(*),且包含Condition,因此該拒絕策略語句會對包含Bucket Owner在內的所有訪問者生效。添加以下拒絕策略語句后,即使是默認擁有所有訪問權限的Bucket Owner,如果不是從指定的公網IP地址或指定VPC訪問,其訪問請求也會被拒絕。
以下拒絕策略語句僅用于限制訪問,而不會授予任何訪問權限。如果授權主體沒有被授予過訪問權限,您可以添加一條允許策略語句來授予其訪問權限。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringNotLike":{
"acs:SourceVpc":[
"vpc-*"
]
},
"NotIpAddress":{
"acs:SourceIp":[
"203.0.113.5"
]
}
}
},
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition":{
"StringLike":{
"acs:SourceVpc":[
"vpc-*"
]
},
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
}
]
}
示例十:限制API調用方式必須為臨時訪問憑證
當您希望通過調用API的方式來訪問存儲空間的資源時,需要限制API調用方式必須是臨時訪問憑證,您可以使用acs:AccessId
條件關鍵字創建一條拒絕策略語句并將其添加到Bucket Policy中,用于阻止其他非臨時訪問憑證(例如通過阿里云賬號或者RAM用戶的長期訪問密鑰)的訪問方式。對于通過非臨時訪問憑證的訪問方式,會觸發策略中的拒絕規則。以下示例用于拒絕除臨時訪問憑證(以TMP.或者STS.開頭的)以外的所有訪問者查看目標存儲空間(examplebucket
)以及列舉文件的操作。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action":[
"oss:Get*",
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:examplebucket/*"
],
"Condition": {
"StringNotLike": {
"acs:AccessId": [
"TMP.*",
"STS.*"
]
}
}
}
]
}
相關文檔
關于Bucket Policy的元素說明,請參見RAM Policy。
關于Bucket Policy的配置步驟,請參見Bucket Policy。
關于Bucket Policy的鑒權過程,請參見OSS鑒權詳解。