停用 ACL 的先決條件 - Amazon Simple Storage Service

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

停用 ACL 的先決條件

Amazon S3 中的儲存貯體存取控制清單 (ACL) 是一種機制,可讓您定義 S3 儲存貯體中個別物件的精細許可,指定哪些 AWS 帳戶或群組可以存取和修改這些物件。Amazon S3 中的大多數新式使用案例不再需要使用 ACL。我們建議您使用 AWS Identity and Access Management (IAM) 和儲存貯體政策來管理存取,並保持 ACLs停用,除非在異常情況下,您需要個別控制每個物件的存取。

如果您的儲存貯體已啟用 ACLs,請在停用 ACLs 之前完成下列先決條件:

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

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

每個現有的儲存貯體和物件 ACL 在 IAM 政策中都有對應項。下列儲存貯體政策範例說明儲存貯體和物件 ACL 的 READWRITE 許可如何映射至 IAM 許可。如需每個 ACL 如何轉譯成 IAM 許可的詳細資訊,請參閱 ACL 許可與存取政策許可的對應

在您停用 ACLs之前:

  • 如果您的儲存貯體 ACL 授予 AWS 帳戶外部的存取權,您必須先將儲存貯體 ACL 許可遷移至儲存貯體政策。

  • 接著,將儲存貯體 ACL 重設為預設私有 ACL。

  • 我們也建議您檢閱物件層級 ACL 許可,並將其遷移至儲存貯體政策。

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

如果您的儲存貯體 ACL 授予 外部的存取權 AWS 帳戶,則在停用 ACLs 之前,您必須將儲存貯體 ACL 許可遷移至儲存貯體政策,並將儲存貯體 ACL 重設為預設私有 ACL。如果您不遷移和重設,套用儲存貯體擁有者強制執行設定以停用 ACLs的請求會失敗並傳回InvalidBucketAclWithObjectOwnership錯誤碼。也建議您檢閱物件 ACL 許可,並將其遷移至儲存貯體政策。

若要檢閱 ACL 許可並將 ACL 許可遷移至儲存貯體政策,請參閱下列主題。

儲存貯體政策範例

這些範例儲存貯體政策說明如何將 READWRITE 儲存貯體及第三方 AWS 帳戶 的物件 ACL 許可遷移至儲存貯體政策。READ_ACPWRITE_ACP ACL 與政策較不相關,因為其會授予與 ACL 相關的許可 (s3:GetBucketAcls3:GetObjectAcls3:PutBucketAcls3:PutObjectAcl)。

範例 — 儲存貯體的 READ ACL

如果您的儲存貯體具有授予 AWS 帳戶 111122223333許可的 READ ACL 來列出儲存貯體的內容,您可以撰寫儲存貯體政策來授予儲存貯體的 s3:ListBuckets3:ListBucketVersionss3:ListBucketMultipartUploads許可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Permission to list the objects in a bucket", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": [ "s3:ListBucket", "s3:ListBucketVersions", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket" } ] }
範例 – READ 儲存貯體中每個物件的 ACL

如果儲存貯體中的每個物件都有授予 存取權的 READ ACL AWS 帳戶 111122223333,您可以撰寫儲存貯體政策,為儲存貯體中的每個物件授予此帳戶的 s3:GetObjects3:GetObjectVersion許可。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Read permission for every object in a bucket", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

此範例資源元素會授予特定物件的存取權。

"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/OBJECT-KEY"
範例 –WRITE ACL,授予將物件寫入儲存貯體的許可

如果您的儲存貯體具有授予 AWS 帳戶 寫入物件至儲存貯體111122223333許可的 WRITE ACL,您可以寫入授予儲存貯體s3:PutObject許可的儲存貯體政策。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Permission to write objects to a bucket", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

使用 S3 主控台來檢閱及遷移 ACL 許可

檢閱儲存貯體的 ACL 許可
  1. 登入 AWS Management Console ,並在 https://console.aws.amazon.com/s3/:// 開啟 Amazon S3 主控台。

  2. Buckets (儲存貯體) 清單中,選擇您的儲存貯體名稱。

  3. 選擇許可索引標籤標籤。

  4. Access control list (存取控制清單 (ACL)) 下,請檢閱您的儲存貯體 ACL 許可。

檢閱物件的 ACL 許可
  1. 登入 AWS Management Console ,並在 https://console.aws.amazon.com/s3/:// 開啟 Amazon S3 主控台。

  2. Buckets (儲存貯體) 清單中,選擇包含您物件的儲存貯體名稱。

  3. Object (物件) 清單中,選擇您的物件名稱。

  4. 選擇許可索引標籤標籤。

  5. Access control list (存取控制清單 (ACL)) 下,請檢閱您的物件 ACL 許可。

遷移 ACL 許可並更新您的儲存貯體 ACL
  1. 登入 AWS Management Console 並開啟位於 https://https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. Buckets (儲存貯體) 清單中,選擇您的儲存貯體名稱。

  3. Permissions (許可) 索引標籤上,Bucket policy (儲存貯體政策) 下,選擇 Edit (編輯)。

  4. Policy (政策) 方塊中,新增或更新儲存貯體政策。

    如需儲存貯體政策,請參閱 儲存貯體政策範例範例使用案例

  5. 選擇儲存變更

  6. 更新您的儲存貯體 ACL 以移除對其他群組或 AWS 帳戶的 ACL 授予。

  7. 針對物件擁有權套用儲存貯體擁有者強制執行設定

使用 AWS CLI 來檢閱和遷移 ACL 許可

  1. 若要傳回儲存貯體的儲存貯體 ACL,請使用 get-bucket-acl AWS CLI 命令:

    aws s3api get-bucket-acl --bucket amzn-s3-demo-bucket

    例如,此儲存貯體 ACL 會向第三方帳戶授予 WRITEREAD 存取權。在此 ACL 中,第三方帳戶是由正式使用者 ID 識別。若要套用「儲存貯體擁有者強制執行」設定並停用 ACL,您必須將第三方帳戶的這些許可遷移至儲存貯體政策。

    { "Owner": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID" }, "Grants": [ { "Grantee": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "DisplayName": "THIRD-PARTY-EXAMPLE-ACCOUNT", "ID": "72806de9d1ae8b171cca9e2494a8d1335dfced4ThirdPartyAccountCanonicalUserID", "Type": "CanonicalUser" }, "Permission": "READ" }, { "Grantee": { "DisplayName": "THIRD-PARTY-EXAMPLE-ACCOUNT", "ID": "72806de9d1ae8b171cca9e2494a8d1335dfced4ThirdPartyAccountCanonicalUserID", "Type": "CanonicalUser" }, "Permission": "WRITE" } ] }

    如需其他範例 ACL,請參閱 範例使用案例

  2. 將您的儲存貯體 ACL 許可遷移至儲存貯體政策:

    此範例儲存貯體政策會為第三方帳戶授予 s3:PutObjects3:ListBucket 許可。在儲存貯體政策中,第三方帳戶由 AWS 帳戶 ID () 識別111122223333

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "PolicyForCrossAccountAllowUpload", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }

    如需更多儲存貯體政策範例,請參閱 儲存貯體政策範例範例使用案例

  3. 若要傳回特定物件的 ACL,請使用 get-object-acl AWS CLI 命令。

    aws s3api get-object-acl --bucket amzn-s3-demo-bucket --key EXAMPLE-OBJECT-KEY
  4. 如有必要,請將物件 ACL 許可遷移至儲存貯體政策。

    此範例資源元素會授予儲存貯體政策中特定物件的存取權。

    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/EXAMPLE-OBJECT-KEY"
  5. 將儲存貯體的 ACL 重設為預設 ACL。

    aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
  6. 針對物件擁有權套用「儲存貯體擁有者強制執行」設定

識別需要 ACL 進行授權的所有請求

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

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

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

注意

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

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

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

套用「儲存貯體擁有者強制執行」設定以停用 ACL 之後,只有在請求使用儲存貯體擁有者完全控制 ACL 或未指定 ACL 時,才能將新物件上傳至儲存貯體。在停用 ACL 之前,請檢閱儲存貯體政策以取得與 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。不過,停用 ACL 的儲存貯體仍會接受此 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 相關條件索引鍵,則必須移除此條件索引鍵。此範例儲存貯體政策存需要適用於 S3 PutObject 請求的 public-read ACL,因此必須先更新才能停用 ACL。

{ "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" } } } ] }

範例使用案例

下列範例說明如何針對特定使用案例,將 ACL 許可遷移至儲存貯體政策。

授予 S3 日誌交付群組的存取權以進行伺服器存取日誌記錄

如果想要套用「儲存貯體擁有者強制執行」設定以針對伺服器存取記錄目的地儲存貯體 (也稱為目標儲存貯體) 停用 ACL,則您必須將 S3 日誌交付群組的儲存貯體 ACL 許可遷移至儲存貯體政策中的記錄服務主體 (logging.s3.amazonaws.com)。如需有關日誌交付許可的詳細資訊,請參閱 日誌交付許可

此儲存貯體 ACL 授予 S3 日誌交付群組的 WRITEREAD_ACP 存取權:

{ "Owner": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID" }, "Grants": [ { "Grantee": { "Type": "CanonicalUser", "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery" }, "Permission": "WRITE" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery" }, "Permission": "READ_ACP" } ] }
將 S3 日誌交付群組的儲存貯體 ACL 許可遷移至儲存貯體政策中的日誌記錄服務主體
  1. 將以下儲存貯體政策新增至您的目的地儲存貯體,取代範例值。

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json policy.json: { { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-AWS-ACCOUNT-ID" } } } ] }
  2. 將目的地儲存貯體的 ACL 重設為預設 ACL。

    aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
  3. 針對物件擁有權套用「儲存貯體擁有者強制執行」設定至您的目的地儲存貯體。

對儲存貯體中的物件授予公用讀取存取權。

如果您的物件 ACL 授予儲存貯體中所有物件的公用讀取存取權,則您可以將這些 ACL 許可遷移至儲存貯體政策。

此物件 ACL 會授予儲存貯體中物件的公用讀取存取權:

{ "Owner": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID" }, "Grants": [ { "Grantee": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/global/AllUsers" }, "Permission": "READ" } ] }
將公用讀取 ACL 許可遷移至儲存貯體政策
  1. 若要授予儲存貯體中所有物件的公用讀取存取權,請新增下列儲存貯體政策,取代範例值。

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }

    若要授予儲存貯體政策中特定物件的公用存取權,請使用 Resource 元素的下列格式。

    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/OBJECT-KEY"

    若要授予具有特定字首之所有物件的公用存取權,請使用 Resource 元素的下列格式。

    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/PREFIX/*"
  2. 針對物件擁有權套用「儲存貯體擁有者強制執行」設定

授權 Amazon ElastiCache (Redis OSS) 存取您的 S3 儲存貯體

您可以將 ElastiCache (Redis OSS) 備份匯出至 S3 儲存貯體,以便從 ElastiCache 外部存取備份。若要將備份匯出至 S3 儲存貯體,您必須授權 ElastiCache 將快照複製到儲存貯體。如果已將許可授予儲存貯體 ACL 中的 ElastiCache,則您必須先將這些許可遷移至儲存貯體政策,然後再套用「儲存貯體擁有者強制執行」設定來停用 ACL。如需詳細資訊,請參閱《Amazon ElastiCache 使用者指南》中的為您的 Amazon S3 儲存貯體授予 ElastiCache 存取權

下列範例顯示將許可授予 ElastiCache 的儲存貯體 ACL 許可。

{ "Owner": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID" }, "Grants": [ { "Grantee": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "DisplayName": "aws-scs-s3-readonly", "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353", "Type": "CanonicalUser" }, "Permission": "READ" }, { "Grantee": { "DisplayName": "aws-scs-s3-readonly", "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353", "Type": "CanonicalUser" }, "Permission": "WRITE" }, { "Grantee": { "DisplayName": "aws-scs-s3-readonly", "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353", "Type": "CanonicalUser" }, "Permission": "READ_ACP" } ] }
將 ElastiCache (Redis OSS) 的儲存貯體 ACL 許可遷移至儲存貯體政策
  1. 將以下儲存貯體政策新增至您的儲存貯體,替換範例值。

    aws s3api put-bucket-policy --bucket amzn-s3-demo-bucket --policy file://policy.json policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt15399483", "Effect": "Allow", "Principal": { "Service": "Region.elasticache-snapshot.amazonaws.com" }, "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:GetBucketAcl", "s3:ListMultipartUploadParts", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket", "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }
  2. 將儲存貯體的 ACL 重設為預設 ACL:

    aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
  3. 針對物件擁有權套用「儲存貯體擁有者強制執行」設定