當使用者希望OSS Bucket下的檔案在首次上傳後,不能被意外或惡意修改,可以為該Bucket設定禁止覆蓋規則,根據檔案路徑、類型或操作者身份精確控制哪些檔案不可被覆蓋。
首次並發上傳:當一個檔案在首次上傳時是並發的(即多個用戶端同時上傳該檔案),即使它匹配了禁止覆蓋規則,系統也不會阻止其中一個版本成功寫入。這是為了確保高並發情境下的寫入成功率。但在該檔案成功建立後,任何後續的覆蓋操作都將被規則正常攔截。
不攔截系統內部行為:禁止檔案覆蓋的功能僅針對用戶端發起的PutObject、AppendObject等操作。對於由OSS系統自身發起的後台行為,如生命週期(Lifecycle)轉換或跨地區複製(CRR)等,規則不會進行攔截,以保證這些核心功能的正常運行。
不相容版本控制:當Bucket版本控制狀態為開啟或暫停時,禁止覆蓋規則不會生效。
工作原理
當OSS收到檔案覆蓋請求時,系統會按照設定的保護規則進行評估:
規則匹配:系統按規則建立順序檢查請求檔案路徑是否同時滿足規則中的首碼、尾碼條件,以及操作者身份是否匹配授權使用者設定。
執行決策:必須同時滿足所有Filter條件(首碼、尾碼)以及操作者身份才會觸發禁止覆蓋操作,返回FileAlreadyExists。
預設行為:如果所有保護規則都不匹配,則允許正常的檔案覆蓋操作。
為特定檔案類型設定保護
保護生產環境中的設定檔和記錄檔,防止被特定使用者意外覆蓋。
在Bucket 列表頁面,單擊目標Bucket名稱。
在左側導覽列,選擇。
單擊新增禁止覆蓋寫規則,配置以下參數:
規則ID:可手動填寫或自動產生
檔案名稱首碼:輸入需要保護的目錄路徑,如
production/configs/檔案名稱尾碼:輸入副檔名,如
.json授權使用者:指定受限制的子帳號、角色或其他帳號
單擊確定建立規則。
驗證規則效果:
使用被限制的帳號嘗試上傳同名檔案到
production/configs/app.json確認返回FileAlreadyExists
其他使用者或上傳到不滿足前尾碼條件的檔案路徑則正常進行
設定全域保護原則
為關鍵業務資料建立全面保護,防止任何人員誤操作。
在Bucket 列表頁面,單擊目標Bucket名稱。
在左側導覽列,選擇。
單擊新增禁止覆蓋寫規則,配置以下參數:
規則ID:可手動填寫或自動產生
檔案名稱首碼:
critical-data/檔案名稱尾碼:留空(保護該路徑下所有檔案)
授權使用者:所有帳號(*)
單擊確定建立規則。
驗證全域保護效果:
使用任意帳號嘗試覆蓋
critical-data/database.sql確認返回FileAlreadyExists,表明全域保護生效
上傳到
public-data/路徑下的檔案正常覆蓋
匹配規則
規則數量:單個Bucket最多支援100條規則
字元長度:首碼和尾碼最大長度均為1023個字元
前尾碼匹配方式:僅支援精確字串匹配,不支援Regex或萬用字元。輸入的
logs/會被當作一般字元處理首碼匹配:
logs/匹配logs/app.log,不匹配dev-logs/app.log尾碼匹配:
.txt匹配readme.txt,不匹配readme.TXT或readme.txt.bak授權使用者匹配:支援萬用字元星號(*),可參考Bucket Policy常見樣本中 Principal 的配置。
條件組合:必須同時滿足規則中的所有Filter條件(前尾碼和授權使用者)才會觸發禁止操作
規則ID:可選項,如不填寫會自動產生UUID。如填寫必須保證在Bucket內唯一
常見問題
設定授權使用者為空白後,連我這個Bucket所有者也無法覆蓋檔案了,怎麼辦?
這是預期行為。授權使用者為空白表示規則對所有使用者生效,包括Bucket的建立者和主帳號。如需恢複覆蓋能力,可以:
在控制台刪除該規則
修改規則的首碼或尾碼條件,縮小保護範圍
設定授權使用者為特定使用者,僅限制部分使用者的覆蓋操作
設定首碼為logs/*.txt想匹配日誌目錄下的所有txt檔案,為什麼不生效?
OSS的前尾碼匹配不支援萬用字元。*會被當作一般字元處理,系統會精確匹配名為logs/*.txt的檔案。正確做法是:
首碼設定為
logs/尾碼設定為
.txt
這樣可以匹配logs/目錄下所有以.txt結尾的檔案。
首碼和尾碼都不填寫會怎樣?
當首碼和尾碼都留空時,規則會對整個Bucket生效。這意味著:
如果授權使用者也為空白,則禁止所有使用者對該Bucket內任何檔案進行覆蓋操作
如果授權使用者指定了特定使用者,則僅禁止這些使用者對Bucket內檔案的覆蓋操作