全部產品
Search
文件中心

Object Storage Service:阻止公用訪問

更新時間:Feb 08, 2025

OSS支援通過設定Bucket Policy和ACL來實現公用訪問。公用訪問無需特定許可權或身分識別驗證,容易引發資料泄露和外網下行流量的風險。OSS支援在OSS全域、單個Bucket、單個存取點和單個對象FC存取點的維度一鍵開啟阻止公用訪問,以避免公用訪問可能帶來的風險。開啟後,已有的公用存取權限會被忽略,且不允許建立新的公用存取權限,從而確保資料安全。

判斷是否包含公用訪問語義

您需要結合Bucket Policy和ACL(包括Bucket ACL和Object ACL)判斷OSS資源是否包含公用訪問的語義。如果任意一種包含公用訪問的語義,您的資源可能存在安全風險,建議開啟阻止公用訪問功能。

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:PutPublicAccessBlockoss:GetPublicAccessBlockoss:DeletePublicAccessBlock

    • Bucket層級:oss:PutBucketPublicAccessBlockoss:GetBucketPublicAccessBlockoss:DeleteBucketPublicAccessBlock

    • 存取點層級:oss:PutAccessPointPublicAccessBlockoss:GetAccessPointPublicAccessBlockoss:DeleteAccessPointPublicAccessBlock

    • 對象FC存取點層級:oss:PutAccessPointConfigForObjectProcessoss:GetAccessPointConfigForObjectProcessoss:DeleteAccessPointForObjectProcess

  • 開啟阻止公用訪問時,已有的公用存取權限會被忽略,且無法建立新的公用存取權限。關閉時,已有許可權仍生效,並允許建立新的公用存取權限。

  • 如果您在Bucket Policy中設定了允許任何人操作存取點的管控API,即使該存取點開啟了阻止公用訪問,使用者仍然可以通過Bucket第三層網域名修改該存取點的阻止公用訪問,原因是通過Bucket第三層網域名訪問的請求不受存取點的配置影響。

  • 對於跨地區或者同地區複製,無論源Bucket和目標Bucket是否開啟阻止公用訪問,均不影響複製前後Object的ACL。如果目標Bucket開啟了阻止公用訪問,則複製到目標Bucket中ACL為公用讀取或者公用讀寫的Object,仍不允許公用訪問。

操作方式

使用OSS控制台

為OSS全域開啟阻止公用訪問

  1. 登入OSS管理主控台

  2. 在左側導覽列,選擇資料服務 > 阻止公用訪問

  3. 阻止公用訪問頁面,開啟阻止公用訪問,然後按照頁面指引完成開啟操作。

為Bucket開啟阻止公用訪問

  1. 登入OSS管理主控台

  2. 單擊Bucket 列表,然後單擊目標Bucket名稱。

  3. 在左側導覽列,選擇許可權控制 > 阻止公用訪問

  4. 阻止公用訪問頁簽,開啟阻止公用訪問,然後按照頁面指引完成開啟操作。

為存取點開啟阻止公用訪問

  1. 登入OSS管理主控台

  2. 在左側導覽列,單擊存取點列表,然後單擊目標存取點。

  3. 存取點基礎資訊地區,開啟阻止公用訪問,然後按照頁面指引完成開啟操作。

為對象FC存取點開啟阻止公用訪問

  1. 登入OSS管理主控台

  2. 在左側導覽列,單擊對象 FC 存取點列表,然後單擊目標對象FC存取點。

  3. FC 存取點基礎資訊,開啟阻止公用訪問,然後按照頁面指引完成開啟操作。

使用命令列工具ossutil

您可以使用命令列工具ossutil來設定阻止公用訪問,ossutil的安裝請參見安裝ossutil

  • 以下命令用於開啟OSS全域阻止公用訪問的配置資訊。

    ossutil api put-public-access-block --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"

    關於該命令的更多資訊,請參見put-public-access-block

  • 以下命令用於開啟儲存空間examplebucket阻止公用訪問的配置資訊。

    ossutil api put-bucket-public-access-block --bucket examplebucket --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"

    關於該命令的更多資訊,請參見put-bucket-public-access-block

  • 以下命令用於開啟OSS全域阻止公用訪問的配置資訊。

    ossutil api put-access-point-public-access-block --bucket examplebucket --access-point-name ap-01 --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"

    關於該命令的更多資訊,請參見put-access-point-public-access-block

相關API

如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。

相關文檔

阻止公用訪問用於集中管控OSS全域、Bucket、存取點及對象FC存取點的許可權。如果您需要細粒度地管控Bucket內的部分資源或單個Object的許可權,請結合使用Bucket Policy設定Object ACL