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鑒權詳解。