OSS支援通過設定Bucket Policy以及ACL的方式實現公用訪問。公用訪問是指無需特定許可權或身分識別驗證即可對OSS資源進行訪問。公用訪問容易引發資料泄露以及被惡意訪問而產生大量外網下行流量的風險。為避免公用訪問可能帶來的風險,OSS支援在OSS全域、單個Bucket、單個存取點和單個對象FC存取點的維度一鍵開啟阻止公用訪問。開啟阻止公用訪問後,已有的公用存取權限會被忽略,且不允許建立新的公用存取權限,以此關閉資料的公開訪問渠道,確保資料安全。
判斷是否包含公用訪問語義
您需要結合Bucket Policy和ACL(包括Bucket ACL和Object ACL)判斷OSS全域、單個Bucket、單個存取點和單個對象FC存取點是否包含公用訪問的語義。當Bucket Policy或ACL任意一種包含公用訪問的語義時,即可視為您的資源可能存在被公用訪問的安全風險,需要考慮開啟阻止公用訪問功能來規避該風險。
Bucket Policy
(推薦)調用API介面判斷
您可以通過調用GetBucketPolicyStatus介面判斷當前Bucket Policy是否包含公用訪問的語義。
如果IsPublic返回欄位取值為true,表示當前Bucket Policy包含公用訪問的語義。
如果IsPublic返回欄位取值為false,表示當前Bucket Policy不包含公用訪問的語義或者沒有設定Bucket Policy。
更多資訊,請參見GetBucketPolicyStatus。
自行判斷
非公用訪問判斷條件和樣本
僅當Bucket Policy滿足以下條件的情況下,才會被視為非公用訪問。
說明Action和Resource不作為判斷是否為公用訪問的條件。
如果Bucket Policy中的Effect是Deny,則被視為非公用訪問。
元素
欄位
取值
Principal
不適用
針對一項或多項指定一個或多個固定值,即取值不包含萬用字元星號(*)
Condition
acs:SourceVpcId
acs:SourceVpcIp
acs:SourceVpc
acs:AccessId
acs:SourceIp
如果是IPv4地址,掩碼大於等於8。
如果是IPv6地址,掩碼大於等於32。
非公用訪問樣本
{ "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" ] } ] }
公用訪問判斷條件和樣本
不滿足非公用訪問任意判斷條件的Bucket Policy,均被視為公用訪問。常見的公用訪問樣本如下:
樣本1
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:GetObject", "Principal": "*", "Resource": "acs:oss:*:17464958576xxxx:examplebucket/*" } ] }
樣本2
Policy中同時包含公用訪問(允許所有VPC訪問)和非公用訪問(僅允許指定使用者訪問)的策略時,最終判斷結果仍被視為公用訪問。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:GetObject", "Principal": "*", "Resource": "acs:oss:*:17464958576xxxx:examplebucket/*", "Condition": { "StringLike": { "acs:SourceVpc": [ "vpc-*" ] } } }, { "Effect": "Allow", "Action": "oss:*", "Principal": "27464958576xxxx", "Resource": "*" } ] }
ACL
Bucket ACL或者Object ACL設定為公用讀取或者公用讀寫,則判斷為包含公用訪問語義,即允許公用訪問。
Bucket ACL和Object ACL同時設定為私人,則判斷為不包含公用訪問語義,即不允許公用訪問。
不同維度阻止公用訪問的優先順序說明
OSS支援對OSS全域、單個Bucket、單個存取點和單個對象FC存取點開啟阻止公用訪問功能。當不同維度阻止公用訪問設定不一致時,OSS將遵循以下優先順序來確定最終訪問效果。
OSS全域 > 單個Bucket > 單個存取點 > 單個對象FC存取點
根據以上優先順序順序,下一層級是否允許公用訪問取決於上一層級的阻止公用訪問設定。只要OSS全域開啟了阻止公用訪問,則單個Bucket、存取點以及對象FC存取點均不允許公用訪問。
如果希望單個Bucket允許公用訪問,則OSS全域以及該Bucket均需要關閉阻止公用訪問。
如果希望單個存取點允許公用訪問,則OSS全域、存取點關聯的Bucket以及存取點均需要關閉阻止公用訪問。
如果希望單個對象FC存取點允許公用訪問,則OSS全域、對象FC存取點關聯的存取點、存取點關聯的Bucket以及對象FC存取點均需要關閉阻止公用訪問。
注意事項
RAM使用者通過不同維度阻止公用訪問時,需要具備以下許可權。
OSS全域阻止公用訪問:
oss:PutPublicAccessBlock
、oss:GetPublicAccessBlock
、oss:DeletePublicAccessBlock
。Bucket層級阻止公用訪問:
oss:PutBucketPublicAccessBlock
、oss:GetBucketPublicAccessBlock
、oss:DeleteBucketPublicAccessBlock
。存取點層級阻止公用訪問:
oss:PutAccessPointPublicAccessBlock
、oss:GetAccessPointPublicAccessBlock
、oss:DeleteAccessPointPublicAccessBlock
。對象FC存取點層級阻止公用訪問:
oss:PutAccessPointConfigForObjectProcess
、oss:GetAccessPointConfigForObjectProcess
、oss:DeleteAccessPointForObjectProcess
。
如果開啟阻止公用訪問,則已有的公用存取權限會被忽略,且不允許建立新的公用存取權限。如果關閉阻止公用訪問,則已有的公用存取權限仍生效,且支援建立新的公用存取權限。
如果您在Bucket Policy中設定了允許任何人操作存取點的管控API,即使該存取點開啟了阻止公用訪問,使用者仍然可以通過Bucket第三層網域名修改該存取點的阻止公用訪問,原因是通過Bucket第三層網域名訪問的請求不受存取點的配置影響。
對於跨地區或者同地區複製,無論源Bucket和目標Bucket是否開啟阻止公用訪問,均不影響複製前後Object的ACL。如果目標Bucket開啟了阻止公用訪問,則複製到目標Bucket中ACL為公用讀取或者公用讀寫的Object,仍不允許公用訪問。
操作步驟
使用OSS控制台
使用RESTAPI
相關文檔
阻止公用訪問是針對OSS全域、Bucket、存取點以及對象FC存取點維度進行集中許可權管控的方式,如果您希望細粒度地管控Bucket內的部分資源或者單個Object的許可權,您需要結合Bucket Policy以及Object ACL。