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使用者無法在控制台的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使用者查看目標儲存空間(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(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地址或VPC的請求會被識別為不符合指定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或公網的請求。來自其他公網IP地址或VPC的請求會被識別為不符合指定IP條件,觸發拒絕規則。使用
acs:SourceIp條件關鍵字和acs:SourceVpc條件關鍵字建立一條拒絕策略語句,用於阻止指定VPC網段之外的請求。
將以上兩條拒絕策略語句添加到Bucket Policy後,滿足任一條件即觸發拒絕。以下樣本用於拒絕除指定VPC(ID為t4nlw426y44rd3iq4xxxx)的指定IP地址網段(192.168.0.0/16)以外的所有訪問者對目標儲存空間(examplebucket)進行讀取檔案操作。
以下拒絕策略語句中,由於Principal為萬用字元星號(*)且包含Condition,因此會對所有訪問者生效,包括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地址的請求,同時使用StringNotLike條件操作和acs:SourceVpc條件關鍵字排除來自指定VPC的請求。使用
acs:SourceVpc條件關鍵字建立一條拒絕策略語句,阻止來自其他VPC的請求,同時使用StringLike條件操作和acs:SourceVpc關鍵字排除來自指定公網IP地址的請求,以避免觸發不滿足指定VPC ID條件而被錯誤拒絕。
將以上兩條拒絕策略語句添加到Bucket Policy後,滿足任一條件就會觸發拒絕。以下樣本用於拒絕除指定公網IP地址(IP地址為203.0.113.5)或指定VPC(ID為t4nlw426y44rd3iq4xxxx)以外的所有訪問者執行對目標儲存空間(examplebucket)進行讀取檔案操作。
以下拒絕策略語句中,由於Principal為萬用字元星號(*)且包含Condition,因此會對所有訪問者生效,包括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 和 Object 的 ACL 設定為公用訪問
為保障 OSS 資料安全,當需要禁止將 Bucket 和 Object 的 ACL 設定為公用訪問時,您可以建立兩條拒絕策略語句:
使用
oss:x-oss-acl條件關鍵字建立一條拒絕策略語句,阻止將 Bucket ACL 設定為除private以外的許可權。任何嘗試設定公用讀取或公用讀寫許可權的操作會被識別為不符合私人條件,觸發拒絕規則。使用
oss:x-oss-object-acl條件關鍵字建立一條拒絕策略語句,阻止將 Object ACL 設定為除private和default以外的許可權。
將以上兩條拒絕策略語句添加到 Bucket Policy 後,滿足任一條件即觸發拒絕。以下樣本用於拒絕對目標儲存空間(examplebucket)設定公用存取權限的操作。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutBucketAcl"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:*:examplebucket"
],
"Condition": {
"StringNotEquals": {
"oss:x-oss-acl": "private"
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:PutObjectAcl"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:*:examplebucket/*"
],
"Condition": {
"StringNotEquals": {
"oss:x-oss-object-acl": [
"private",
"default"
]
}
}
}
]
}相關文檔
關於Bucket Policy的元素說明,請參見RAM Policy。
關於Bucket Policy的配置步驟,請參見Bucket Policy。
關於Bucket Policy的鑒權過程,請參見OSS鑒權詳解。