控制物件的擁有權,並停用儲存貯體的 ACLs - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

控制物件的擁有權,並停用儲存貯體的 ACLs

S3 物件擁有權是 Amazon S3 儲存貯體層級設定,可用來控制上傳到儲存貯體的物件擁有權,以及停用或啟用存取控制清單 (ACLs)。根據預設,物件擁有權會設定為儲存貯體擁有者強制執行設定,且所有 ACLs 都會停用。停用 ACLs 時,儲存貯體擁有者會擁有儲存貯體中的所有物件,並僅使用存取管理政策來管理對資料的存取。

Amazon S3 中的大多數現代使用案例不再需要使用 ACLs,建議您停用 ACLs,除非在異常情況下,您必須個別控制每個物件的存取。停用 ACLs 後,您可以使用政策來更輕鬆地控制對儲存貯體中每個物件的存取,無論儲存貯體中物件上傳者是誰。

物件擁有權有三個設定,您可以用來控制上傳到儲存貯體的物件擁有權,以及停用或啟用 ACLs:

停用ACLs
  • 已強制執行儲存貯體擁有者 (預設) – ACLs 已停用,儲存貯體擁有者會自動擁有並完全控制儲存貯體中的每個物件。ACLs不再影響 S3 儲存貯體中資料的許可。儲存貯體使用政策來定義存取控制。

已啟用 ACLs
  • 儲存貯體擁有者優先 – 儲存貯體擁有者擁有並完全控制其他帳戶使用bucket-owner-full-control固定 ACL 寫入儲存貯體的新物件。

  • 物件寫入器 – 上傳物件 AWS 帳戶 的 擁有物件,擁有物件的完整控制權,並可透過 ACLs 授予其他使用者存取權。

對於 S3 中的大多數現代使用案例,我們建議您套用儲存貯體擁有者強制執行的設定,並在需要時使用儲存貯體政策與帳戶外的使用者共用資料,以停用 ACLs。這種方法可簡化許可管理。您可以在新建立的儲存貯體和現有的儲存貯體上停用 ACLs。對於新建立的儲存貯體,預設會停用 ACLs。如果現有儲存貯體中已有物件,則在停用 ACLs 之後,物件和儲存貯體 ACLs 不再是存取評估的一部分,並且會根據政策授予或拒絕存取。對於現有儲存貯體,您可以在停用 ACLs 之後隨時重新啟用 Word,並還原您現有的儲存貯體和物件 ACLs。

停用 ACLs 之前,建議您檢閱儲存貯體政策,以確保其涵蓋您打算在帳戶外授予儲存貯體存取權的所有方式。停用 ACLs 後,儲存貯體僅接受未指定 ACL 的PUT請求,或使用儲存貯體擁有者完全控制 ACLs 的PUT請求,例如以 Word 表達的bucket-owner-full-control固定 ACL 或同等形式的此 ACLXML。支援儲存貯體擁有者完全控制 ACLs 的現有應用程式不會有任何影響。包含其他 ACLs 的PUT請求 (例如,自訂授予特定 的 Word AWS 帳戶) 會失敗,並傳回400錯誤碼為 的錯誤AccessControlListNotSupported

相反地,具有儲存貯體擁有者偏好設定的儲存貯體會繼續接受和認可儲存貯體和物件 ACLs。使用此設定時,使用bucket-owner-full-control固定 ACL 寫入的新物件會自動由儲存貯體擁有者擁有,而不是物件寫入器擁有。所有其他 ACL 行為都保持不變。若要要求所有 Amazon S3 PUT操作都包含bucket-owner-full-control固定 ACL,您可以新增僅允許使用此 Word 上傳物件的儲存貯體政策。 ACL

若要查看哪些物件擁有權設定套用至儲存貯體,您可以使用 Amazon S3 Storage Lens 指標。S3 Storage Lens 是一種雲端儲存體分析功能,您可以用來了解整個組織使用物件儲存體的情況及其活動情形。如需詳細資訊,請參閱使用 S3 Storage Lens 尋找物件擁有權設定

注意

如需將 Amazon S3 Express One Zone 儲存類別與目錄儲存貯體搭配使用的詳細資訊,請參閱 S3 Express One Zone使用目錄儲存貯體

「物件擁有權」設定

此資料表顯示每個物件擁有權設定對 ACLs、物件、物件擁有權和物件上傳的影響。

設定 適用對象 對物件所有權的影響 對 ACLs 的影響 已接受上傳
儲存貯體擁有者強制執行 (預設) 全部新的和現有物件 儲存貯體擁有者擁有每個物件。

ACLs 已停用,不再影響儲存貯體的存取許可。設定或更新 ACLs 的請求失敗。不過,支援讀取 ACLs 的請求。

儲存貯體擁有者擁有完整的擁有權和控制權。

物件寫入者不再擁有完整的擁有權和控制權。

使用儲存貯體擁有者完全控制 ACLs 上傳或未指定 ACL 的上傳
儲存貯體擁有者偏好 新物件 如果物件上傳包含bucket-owner-full-control固定 ACL,則儲存貯體擁有者會擁有該物件。

使用其他 ACLs 上傳的物件由寫入帳戶擁有。

可以更新 ACLs 並授予許可。

如果物件上傳包含bucket-owner-full-control固定 ACL,則儲存貯體擁有者具有完全控制存取權,且物件寫入器不再具有完全控制存取權。

所有上傳
物件寫入器 新物件 物件寫入者擁有物件。

可以更新 ACLs 並授予許可。

物件寫入者具有完整的存取控制權。

所有上傳

停用 ACLs 引入的變更

套用儲存貯體擁有者強制執行的物件擁有權設定時,ACLs 會停用,而且您會自動擁有並完全控制儲存貯體中的每個物件,而無需採取任何其他動作。儲存貯體擁有者強制執行是所有新建儲存貯體的預設設定。在套用儲存貯體擁有者強制執行設定之後,您會看到三個變更:

  • 所有儲存貯體 ACLs 和物件 ACLs 都會停用,這可讓您以儲存貯體擁有者身分完整存取。當您在儲存貯體或物件上執行讀取 ACL 請求時,您會看到只有儲存貯體擁有者有完整存取權。

  • 您身為儲存貯體擁有者會自動擁有並完全控制儲存貯體中的每個物件。

  • ACLs 不再影響儲存貯體的存取許可。因此,您資料的存取控制是以政策為基礎,例如 AWS Identity and Access Management (IAM) 身分型政策、Amazon S3 儲存貯體政策、VPC 端點政策,以及 Organizations 服務控制政策 (SCPs)資源控制政策 (RCPs)

圖表顯示當您套用儲存貯體擁有者強制執行設定以停用 ACLs 時會發生的情況。

如果您使用 S3 版本控制,則儲存貯體擁有者會擁有並且可以完全控制儲存貯體中的所有物件版本。套用「儲存貯體擁有者強制執行」設定不會新增物件的版本。

只有在使用儲存貯體擁有者完全控制 ACLs 或未指定 ACL 時,才能將新物件上傳至儲存貯體。如果物件指定任何其他 ACL,則物件上傳會失敗。如需詳細資訊,請參閱故障診斷

由於下列使用 AWS Command Line Interface (AWS CLI) 的範例PutObject操作包含bucket-owner-full-control固定 ACL,因此物件可以上傳到具有停用 ACLs 的儲存貯體。

aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file --acl bucket-owner-full-control

因為下列PutObject操作不會指定 ACL,所以也會成功處理停用 ACLs 的儲存貯體。

aws s3api put-object --bucket amzn-s3-demo-bucket --key key-name --body path-to-file
注意

如果其他 AWS 帳戶 需要在上傳後存取物件,您必須透過儲存貯體政策授予這些帳戶其他許可。如需詳細資訊,請參閱使用政策來管理 Amazon S3 資源存取權的逐步解說

重新啟用 ACLs

您可以隨時將儲存貯體擁有者強制執行的設定變更為另一個物件擁有權設定,以重新啟用 ACLs。如果您在套用儲存貯體擁有者強制執行設定之前使用物件 ACLs 進行許可管理,而且沒有將這些物件 ACL 許可遷移至儲存貯體政策,則在您重新啟用 ACLs 之後,會還原這些許可。此外,在套用「儲存貯體擁有者強制執行」設定時寫入儲存貯體的物件仍然由儲存貯體擁有者擁有。

例如,如果您從「儲存貯體擁有者強制執行」設定變更回「物件寫入器」設定,身為儲存貯體擁有者,您就不再擁有之前由其他 AWS 帳戶擁有的物件,且不對其擁有完整控制權。相反,上傳帳戶再次擁有這些物件。其他帳戶擁有的物件使用 ACLs 作為許可,因此您無法使用政策來授予這些物件的許可。此外,您身為儲存貯體擁有者,仍然擁有在套用「儲存貯體擁有者強制執行」設定時寫入儲存貯體的任何物件。這些物件不是物件寫入器所擁有,即使您重新啟用 ACLs。

如需使用、 AWS Command Line Interface (ACLsCLI) AWS Management Console、REST 或API 啟用和管理 AWS SDKs 的指示,請參閱 設定 ACLs

停用 ACLs 的先決條件

在停用現有儲存貯體的 ACLs 之前,請完成下列先決條件。

檢閱儲存貯體和物件 ACLs 並遷移 ACL 許可

當您停用 ACLs 時,儲存貯體和物件 ACLs 授予的許可不再影響存取。停用 ACLs 之前,請先檢閱儲存貯體和物件 ACLs。

如果您的儲存貯體 ACLs 將讀取或寫入許可授予帳戶外的其他人,您必須先將這些許可遷移至儲存貯體政策,才能套用儲存貯體擁有者強制執行的設定。如果您不遷移在帳戶外授予讀取或寫入存取權的儲存貯體 ACLs,則套用儲存貯體擁有者強制執行設定的請求會失敗,並傳回 InvalidBucketAclWithObjectOwnership 錯誤碼。

例如,如果您想要針對接收伺服器存取日誌的儲存貯體停用 ACLs,則必須將 S3 日誌交付群組的儲存貯體 ACL 許可遷移至儲存貯體政策中的記錄服務主體。如需詳細資訊,請參閱授予 S3 日誌交付群組的存取權以進行伺服器存取日誌記錄

如果您想要物件寫入者能夠完全控制其上傳的物件,則物件寫入者是您使用案例的最佳物件所有權設定。如果您想要控制個別物件層級的存取權,則儲存貯體擁有者偏好是最佳選擇。這些使用案例很少見。

若要檢閱 ACLs 並將 ACL 許可遷移至儲存貯體政策,請參閱 停用 ACLs 的先決條件

識別需要 ACL 授權的請求

若要識別需要 ACLs 授權的 Amazon S3 請求,您可以使用 Amazon S3 伺服器存取日誌中的 aclRequired 值,或 AWS CloudTrail。如果請求需要 ACL 進行授權,或者您有指定 ACL 的PUT請求,則字串為 Yes。如果不需要 ACLs,或者如果您要設定bucket-owner-full-control固定 ACL,或者如果儲存貯體政策允許請求,則 Amazon S3 伺服器存取日誌中的aclRequired值字串為 "-",並且缺少 in CloudTrail。如需預期的 aclRequired 值詳細資訊,請參閱 常見 Amazon S3 請求的 aclRequired 值

如果您有 PutBucketAclPutObjectAcl請求具有授予 ACL 型許可的標頭,除了bucket-owner-full-control固定 ACL 之外,您必須先移除這些標頭,才能停用 ACLs。否則,請求將會失敗。

對於需要 ACL 授權的所有其他請求,請將這些 ACL 許可遷移至儲存貯體政策。然後,在啟用儲存貯體擁有者強制執行設定之前,請先移除任何儲存貯體 ACLs。

注意

請勿移除物件 ACLs。否則,依賴物件 ACLs 取得許可的應用程式將失去存取權。

如果您看到沒有需要 ACL 授權的請求,您可以繼續停用 ACLs。如需識別請求的詳細資訊,請參閱 使用 Amazon S3 伺服器存取日誌來識別請求使用 CloudTrail 識別 Amazon S3 請求

檢閱和更新使用 ACL 相關條件索引鍵的儲存貯體政策

套用儲存貯體擁有者強制執行設定以停用 ACLs 之後,只有在請求使用儲存貯體擁有者完全控制 ACLs 或未指定 ACL 時,才能將新物件上傳至儲存貯體。在停用 ACLs 之前,請檢閱 ACL 相關條件索引鍵的儲存貯體政策。

如果您的儲存貯體政策使用 ACL 相關條件金鑰來要求bucket-owner-full-control固定 ACL (例如 s3:x-amz-acl),則您不需要更新儲存貯體政策。下列儲存貯體政策使用 s3:x-amz-acl來要求 S3 PutObject請求的bucket-owner-full-control固定 ACL。此政策仍然需要物件寫入器來指定bucket-owner-full-control固定 ACL。不過,停用 ACLs 的儲存貯體仍然接受此 ACL,因此請求會繼續成功,而不需要變更用戶端。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with bucket owner full control", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/ExampleUser" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }

但是,如果您的儲存貯體政策使用需要不同 ACL 的 ACL 相關條件金鑰,您必須移除此條件金鑰。此儲存貯體政策範例需要 public-read ACL for S3 PutObject請求,因此必須先更新,才能停用 ACLs。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with public read access", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:user/ExampleUser" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "public-read" } } } ] }

「物件擁有權」許可

若要套用、更新或刪除儲存貯體的「物件擁有權」設定,您需要 s3:PutBucketOwnershipControls 許可。若要退回儲存貯體的「物件擁有權」設定,您需要 s3:GetBucketOwnershipControls 許可。如需詳細資訊,請參閱 在建立儲存貯體時設定「物件擁有權」檢視 S3 儲存貯體的「物件擁有權」設定

為所有新儲存貯體停用 ACLs

根據預設,所有新儲存貯體都會在套用儲存貯體擁有者強制執行設定的情況下建立,並停用 ACLs。我們建議停用 ACLs。一般而言,我們建議使用 S3 資源型政策 (儲存貯體政策和存取點政策) 或 IAM 政策進行存取控制,而非 ACLs。政策是一種簡化且更具彈性的存取控制選項。使用儲存貯體政策和存取點政策,您可以定義若干規則,廣泛應用於 Amazon S3 資源的所有請求。

複寫與物件所有權

當您使用 S3 複寫,且來源和目的地儲存貯體由不同的 擁有時 AWS 帳戶,您可以停用 ACLs (使用物件擁有權的儲存貯體擁有者強制執行設定),將複本擁有權變更為 AWS 帳戶 擁有目的地儲存貯體的 。此設定會模擬現有的擁有者覆寫行為,而無需 s3:ObjectOwnerOverrideToBucketOwner 許可。使用「儲存貯體擁有者強制執行」設定複寫至目的地儲存貯體的所有物件都由目的地儲存貯體擁有者所擁有。如需複寫組態之擁有者覆寫選項的詳細資訊,請參閱 變更複本擁有者

設定「物件擁有權」

您可以使用 Amazon S3 主控台、 AWS SDKs AWS CLI、Amazon S3 REST API或 來套用物件擁有權設定 AWS CloudFormation。下列 REST API和 AWS CLI 命令支援物件擁有權:

REST API AWS CLI 描述
PutBucketOwnershipControls put-bucket-ownership-controls 建立或修改現有 S3 儲存貯體的「物件擁有權」設定。
CreateBucket create-bucket 使用 x-amz-object-ownership 請求標頭建立儲存貯體,以指定「物件所有權」設定。
GetBucketOwnershipControls get-bucket-ownership-controls 抓取 Amazon S3 儲存貯體的「物件擁有權」設定。
DeleteBucketOwnershipControls delete-bucket-ownership-controls 刪除 Amazon S3 儲存貯體的「物件擁有權」設定。

如需有關套用和使用「物件擁有權」設定的更多資訊,請參閱以下主題。