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
如果您的程序自定義要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。
為OSS全局開啟阻止公共訪問的API接口說明,請參見PutPublicAccessBlock。
為Bucket開啟阻止公共訪問的API接口說明,請參見PutBucketPublicAccessBlock。
為接入點開啟阻止公共訪問的API接口說明,請參見PutAccessPointPublicAccessBlock。
為對象FC接入點開啟阻止公共訪問的API接口說明,請參見PutAccessPointConfigForObjectProcess。
相關文檔
阻止公共訪問是針對OSS全局、Bucket、接入點以及對象FC接入點維度進行集中權限管控的方式,如果您希望細粒度地管控Bucket內的部分資源或者單個Object的權限,您需要結合Bucket Policy以及Object ACL。