阻止公用訪問是OSS提供的安全防護功能。當需要防止資料被匿名使用者存取時,可在OSS全域、Bucket、存取點或對象FC存取點維度開啟此功能。開啟後,已有的公用存取權限會被忽略,且無法建立新的公用存取權限。
工作原理
阻止公用訪問通過多層級訪問限制機制保護資料安全。開啟後,OSS會忽略Bucket Policy和ACL中的公用存取權限配置,同時阻止建立新的公用存取權限;關閉後,已有許可權恢複生效,並允許建立新的公用存取權限。
OSS支援在以下四個維度開啟阻止公用訪問,當不同維度設定不一致時,遵循以下優先順序:
OSS全域 > 單個Bucket > 單個存取點 > 單個對象FC存取點上層開啟阻止公用訪問後,下層無論如何設定都不允許公用訪問:
如果希望單個Bucket允許公用訪問,需關閉OSS全域和該Bucket的阻止公用訪問。
如果希望單個存取點允許公用訪問,需關閉OSS全域、存取點關聯的Bucket和該存取點的阻止公用訪問。
如果希望單個對象FC存取點允許公用訪問,需關閉OSS全域、對象FC存取點關聯的存取點、存取點關聯的Bucket和該對象FC存取點的阻止公用訪問。
開啟方式
控制台
OSS全域
前往OSS管理主控台。
在左側導覽列,選擇。
開啟阻止公用訪問,按照頁面指引完成操作。
OSS 全域阻止公用訪問預設為關閉(BlockPublicAccess=false),即預設允許公用訪問。可以調用 GetPublicAccessBlock 介面查詢目前狀態,調用 PutPublicAccessBlock 介面或通過上述控制台開關開啟。
如果通過雲治理中心的 EnrollAccount 介面建立了資源帳號(ResourceAccount)類型的成員帳號,該成員帳號無法直接登入 OSS 控制台(控制台的登入、切換身份按鈕均為置灰狀態)。需要先為該成員帳號建立 RAM 角色,再通過 STS AssumeRole 切換身份擷取臨時訪問憑證,調用 PutPublicAccessBlock 介面為該帳號配置 OSS 全域阻止公用訪問。
雲治理中心的帳號基準不包含 OSS 阻止公用訪問配置項,因此無法通過帳號基準統一配置該功能,需按上述方式逐個成員帳號單獨配置。
Bucket
前往Bucket列表,單擊目標Bucket名稱。
在左側導覽列,選擇。
開啟阻止公用訪問,按照頁面指引完成操作。
存取點
前往OSS管理主控台。
在左側導覽列,單擊存取點列表,然後單擊目標存取點。
在存取點基礎資訊地區,開啟阻止公用訪問,按照頁面指引完成操作。
對象FC存取點
前往OSS管理主控台。
在左側導覽列,單擊對象 FC 存取點列表,然後單擊目標對象FC存取點。
在FC 存取點基礎資訊地區,開啟阻止公用訪問,按照頁面指引完成操作。
命令列工具ossutil
可以使用命令列工具ossutil 2.0開啟阻止公用訪問。
OSS全域
put-public-access-block命令用於開啟OSS全域阻止公用訪問。
ossutil api put-public-access-block --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"Bucket
put-bucket-public-access-block命令用於開啟Bucket的阻止公用訪問。
ossutil api put-bucket-public-access-block --bucket example-bucket --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"存取點
put-access-point-public-access-block命令用於開啟存取點的阻止公用訪問。
ossutil api put-access-point-public-access-block --bucket example-bucket --access-point-name example-ap --public-access-block-configuration "{\"BlockPublicAccess\":\"true\"}"判斷是否包含公用訪問語義
需要結合Bucket Policy和ACL(包括Bucket ACL和Object ACL)判斷OSS資源是否包含公用訪問的語義。如果存在任意一種包含公用訪問的語義,資源可能存在安全風險,建議開啟阻止公用訪問功能。
Bucket Policy
(推薦)調用API介面判斷
可以調用GetBucketPolicyStatus介面判斷當前Bucket Policy是否包含公用訪問的語義。
如果
IsPublic返回欄位取值為true,表示當前Bucket Policy包含公用訪問的語義。如果
IsPublic返回欄位取值為false,表示當前Bucket Policy不包含公用訪問的語義或者沒有設定Bucket Policy。
自行判斷
Bucket Policy中每條Statement的判定規則:滿足以下任一條件即視為非公用訪問,否則為公用訪問。
Effect為Deny
Principal指定固定值(不含萬用字元
*)Condition包含以下任一限制條件:
Condition欄位
取值要求
acs:SourceVpcId
指定固定值(不含萬用字元
*)acs:SourceVpc
指定固定值(不含萬用字元
*)acs:AccessId
指定固定值(不含萬用字元
*)acs:SourceIp
IPv4掩碼≥8,IPv6掩碼≥32
說明Action和Resource不作為判斷公用訪問的條件。
ACL
Bucket ACL或者Object ACL設定為公用讀取或者公用讀寫,允許公用訪問。
Bucket ACL和Object ACL同時設定為私人,不允許公用訪問。
配額與限制
RAM使用者佈建阻止公用訪問需要以下許可權:
阻止公用訪問維度
要求的權限
OSS全域
oss:PutPublicAccessBlock、oss:GetPublicAccessBlock、oss:DeletePublicAccessBlockBucket
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,仍不允許公用訪問。
API說明
如果程式自訂要求較高,可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。
API | 說明 |
OSS全域開啟阻止公用訪問 | |
Bucket開啟阻止公用訪問 | |
存取點開啟阻止公用訪問 | |
對象FC存取點開啟阻止公用訪問 |
變更影響與遷移指引
將 Bucket ACL 從公用讀取(public-read)改為私人(private)並開啟阻止公用訪問後,已有的匿名存取權限會被忽略,依賴匿名 URL 訪問 Object 的業務將中斷,請求返回403 Forbidden:
AccessDenied
You have no right to access this object because of bucket acl.替代匿名訪問的方案對比如下:
簽名 URL:適用於臨時授權情境,需在產生時指定有效期間,有效期間內持有簽名 URL 的任何人均可訪問。
Bucket Policy:適用於長期授權特定來源、IP 或 Referer 的情境,可精細控制允許訪問的主體,無需為每次訪問單獨產生連結。
遷移建議:先在測試 Bucket 中驗證簽名 URL 或 Bucket Policy 可正常訪問,再選擇業務非高峰期變更 Bucket ACL 並開啟阻止公用訪問,確認業務無影響後,在生產環境執行相同操作。
常見問題
建立 Bucket Policy 時提示“已開啟阻止公用訪問”如何處理?
Bucket 開啟阻止公用訪問後,建立含公用訪問語義(如 Principal 設為*)的 Bucket Policy 會被拒絕,返回 403 錯誤,錯誤訊息為 Put public bucket policy is not allowed。
如需建立含公用訪問語義的 Bucket Policy,先關閉阻止公用訪問,關閉後可正常建立。
如何關閉阻止公用訪問?
以 Bucket 層級為例,操作步驟如下:
前往Bucket 列表,單擊目標 Bucket 名稱。
關閉阻止公用訪問開關。
在彈出的“確定關閉阻止公用訪問?”對話方塊中,輸入“我確認關閉阻止公用訪問”,然後單擊確定。
關閉後,已有的公用存取權限恢複生效:Bucket ACL 為公用讀取的 Bucket,匿名使用者可重新訪問 Object。
關閉阻止公用訪問後會有安全風險嗎?
關閉後,之前被忽略的 Bucket ACL 和 Bucket Policy 許可權立即恢複生效。關閉前請確認:
Bucket ACL 設定為私人(private)
Object ACL 設定為私人(private)
Bucket Policy 中不含意外的公用訪問授權
相關文檔
阻止公用訪問用於管控OSS全域、Bucket、存取點及對象FC存取點的許可權。
如果需要細粒度地管控Bucket內的部分資源或單個Object的許可權,請結合使用Bucket Policy和Object ACL。
在多帳號情境下,如需強制統一開啟阻止公用訪問功能,請使用Control Policy進行集中管控。
監控警示配置
阻止公用訪問狀態變更屬於管控類操作,不會記錄在即時訪問日誌中,需要通過Action Trail事件跟蹤或 API 輪詢兩種方式監控狀態變更並配置警示。
Action Trail事件跟蹤(推薦)
在Action Trail控制台建立跟蹤,事件類型選擇管控事件,投遞到Log Service SLS。
在事件警示頁面建立警示規則,事件名稱設定為
PutBucketPublicAccessBlock和DeleteBucketPublicAccessBlock。阻止公用訪問狀態被修改時,將觸發警示通知。
API 輪詢
調用GetPublicAccessBlock介面擷取 OSS 全域阻止公用訪問配置狀態,將結果上報至CloudMonitor自訂指標,並配置閾值警示規則。