配置 ACLs - Amazon Simple Storage Service

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

配置 ACLs

本節說明如何使用存取控制清單 (ACLs) 管理 S3 儲存貯體和物件的存取許可。您可以ACL使用 AWS Management Console, AWS Command Line Interface (CLI) REST API、或 AWS SDKs.

儲存貯體許可與物件許可各自互相獨立。物件不會繼承其儲存貯體的許可。例如,若您建立儲存貯體,並將寫入存取授予使用者,除非使用者明確授予存取權給您,否則您無法存取該使用者的物件。

您可以將權限授予其他人 AWS 帳戶 使用者或預先定義的群組。您要授予許可的使用者或群組稱為「被授予者」。依預設,擁有者為 AWS 帳戶 創建存儲桶,具有完整權限。

您授與使用者或群組的每個權限,都會在與值區相關聯的ACL項目中新增一個項目。這些ACL清單會授與,用來識別受權者和授與的權限。

S3 物件擁有權是 Amazon S3 儲存貯體層級設定,可用來控制上傳到儲存貯體之物件的擁有權,以及停用或啟用。ACLs依預設,[物件擁有權] 會設定為 [值區擁有者強制執行] 設定,且全部ACLs都會停用。停用時,值區擁有者會擁有值區中的所有物件,並使用存取管理原則專門管理ACLs這些物件的存取權。

Amazon S3 中的大多數現代使用案例不再需要使用ACLs。除非您需要個別控制每個物件的存取權限,否則建議您保持ACLs停用狀態。ACLs停用後,您可以使用政策來控制值區中所有物件的存取權,無論是誰將物件上傳至您的值區。如需詳細資訊,請參閱控制物件的擁有權並停ACLs用值區

重要

如果儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定,則您必須使用政策將存取權授予儲存貯體及其中的物件。啟用值區擁有者強制設定後,設定存取控制清單 (ACLs) 或更新的要求ACLs會失敗,並傳回AccessControlListNotSupported錯誤碼。仍然支持讀取ACLs請求。

警告

我們強烈建議您避免授予「所有人」(公開存取) 或「已驗證的使用者」群組 (全部) 的寫入權限 AWS 已驗證的使用者) 群組。如需詳細資訊了解授予寫入存取權限對這些群組的影響,請參閱「Amazon S3 預先定義的群組」。

主控台會顯示重複被授予者的合併存取授予。要查看的完整列表ACLs,請使用 Amazon S3 RESTAPI, AWS CLI,或 AWS SDKs.

下表顯示您可以在 Amazon S3 主控台中為儲存貯體設定的ACL許可。

存儲桶的 Amazon S3 控制台ACL許可
主控台許可 ACL許可 Access (存取)
Objects (物件) – List (列出) READ 允許被授予者列出儲存貯體中的物件。
Objects (物件) - Write (寫入) WRITE 允許被授予者在儲存貯體中建立新物件。對於現有物件的儲存貯體和物件擁有者,還允許刪除和覆寫這些物件。
值區 ACL-讀取 READ_ACP 允許受權者讀取值區ACL。
鏟斗 ACL-寫入 WRITE_ACP 允許受權者為適用ACL的值區寫入。
每個人(公開存取):物件 - 列出 READ 對儲存貯體中的物件授予公開讀取存取權限。當您將列出存取權限授予每個人(公開存取權限)時,世界上的任何人都可以存取儲存貯體中的物件。
所有人(公共訪問):桶 ACL-讀 READ_ACP 授予值區的公開讀取權限ACL。當您將讀取存取權授予「所有人」(公開存取權) 時,全世界的任何人都可以存取值區ACL。

如需有關ACL權限的詳細資訊,請參閱存取控制清單 (ACL) 概觀

重要

如果儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定,則您必須使用政策將存取權授予儲存貯體及其中的物件。啟用值區擁有者強制設定後,設定存取控制清單 (ACLs) 或更新的要求ACLs會失敗,並傳回AccessControlListNotSupported錯誤碼。仍然支持讀取ACLs請求。

若要設定值區的ACL權限
  1. 登入 AWS Management Console 並在打開 Amazon S3 控制台https://console.aws.amazon.com/s3/

  2. Buckets (儲存貯體) 清單中,選擇要設定許可的儲存貯體名稱。

  3. 選擇 Permissions (許可)。

  4. Access control list (存取控制清單) 下,選擇 Edit (編輯)。

    您可以編輯值區的下列ACL權限:

    物件
    • List (清單) – 允許承授者列出儲存貯體中的物件。

    • Write (寫入) – 允許承授者在儲存貯體中建立新物件。對於現有物件的儲存貯體和物件擁有者,還允許刪除和覆寫這些物件。

      在 S3 主控台中,您只能授與寫入存取權給 S3 日誌傳遞群組和儲存貯體擁有者 ( AWS 帳戶). 我們強烈建議您不要授與其他受權者的寫入存取權。不過,如果您需要授與寫入權限,您可以使用 AWS CLI, AWS SDKs,或 RESTAPI.

    水桶 ACL
    • 讀取 — 允許受權者讀取值區ACL。

    • 寫入 — 允許受權者為適用的ACL值區寫入。

  5. 若要變更值區擁有者的權限,請在值區擁有者 (您的 AWS 帳戶),清除或從下列ACL權限中選取:

    • Objects (物件)List (列出)Write (寫入)

    • 桶 ACL-讀取寫入

    有者指的是 AWS 帳戶根使用者,不是 AWS Identity and Access Management IAM使用者。如需有關 root 使用者的詳細資訊,請參閱 AWS 帳戶根使用者 (在 IAM 使用者指南中)

  6. 若要授予或復原一般大眾 (網際網路上的所有人) 的權限,請在 [所有人 (公開存取)] 旁邊清除或選取下列ACL權限:

    • Objects (物件)List (列出)

    • 桶 ACL-

    警告

    將 S3 儲存貯體的公開存取授予 Everyone (每個人) 群組時請小心。當您將存取授予此群組時,全世界的所有人都能存取您的儲存貯體。強烈建議您絕不要授予任何種類的 S3 儲存貯體公用寫入存取。

  7. 若要授與或復原權限給任何擁有 AWS 帳戶,已驗證的使用者群組旁邊 (任何具有 AWS 帳戶),清除或從下列ACL權限中選取:

    • Objects (物件)List (列出)

    • 桶 ACL-

  8. 若要授與或撤消 Amazon S3 寫入儲存貯體的伺服器存取日誌的許可,請在 S3 日誌交付群組下清除或從下列ACL許可中選取:

    • Objects (物件)List (列出)Write (寫入)

    • 桶 ACL-讀取寫入

      如果儲存貯體設定為要接收存取日誌的目標儲存貯體,儲存貯體許可必須將儲存貯體的寫入存取授予 Log Delivery (日誌交付) 群組。當您啟用儲存貯體上的伺服器存取記錄日誌時,Amazon S3 主控台會將寫入存取權限授予您選擇接收日誌之目標儲存貯體的 Log Delivery (日誌交付) 群組。如需伺服器存取記錄日誌的詳細資訊,請參閱「啟用 Amazon S3 伺服器存取記錄日誌」。

  9. 若要授與存取權給其他人 AWS 帳戶,執行下列動作:

    1. 選擇 Add grantee (新增承授者)

    2. 在「受權者」方塊中,輸入另一個人的標準 ID AWS 帳戶.

    3. 從下列ACL權限中選取:

      • Objects (物件)List (列出)Write (寫入)

      • 桶 ACL-讀取寫入

    警告

    當你授予其他 AWS 帳戶 訪問您的資源,請注意 AWS 帳戶 可以將其權限委派給其帳戶下的使用者。這稱為跨帳戶存取。如需有關使用跨帳戶存取的資訊,請參閱《使用指南》中的建立角色以將權限委派給使用IAM者。IAM

  10. 若要移除對其他人的存取 AWS 帳戶,在其他存取權下 AWS 帳戶,選擇「移除」。

  11. 若要儲存您所做的變更,請選擇 Save changes (儲存變更)

主控台會顯示重複被授予者的合併存取授予。要查看的完整列表ACLs,請使用 Amazon S3 RESTAPI, AWS CLI,或 AWS SDKs。下表顯示您可以在 Amazon S3 主控台中為物件設定的ACL許可。

物件的 Amazon S3 主控台ACL許可
主控台許可 ACL許可 存取
物件 - 讀取 READ 允許被授予者讀取物件資料及其中繼資料。
物件 ACL-讀取 READ_ACP 允許受權者讀取物ACL件。
物件 ACL-寫入 WRITE_ACP 允許受權者為適用ACL的物件寫入

如需有關ACL權限的詳細資訊,請參閱存取控制清單 (ACL) 概觀

重要

如果儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定,則您必須使用政策將存取權授予儲存貯體及其中的物件。啟用值區擁有者強制設定後,設定存取控制清單 (ACLs) 或更新的要求ACLs會失敗,並傳回AccessControlListNotSupported錯誤碼。仍然支持讀取ACLs請求。

若要設定物件的ACL權限
  1. 登入 AWS Management Console 並在打開 Amazon S3 控制台https://console.aws.amazon.com/s3/

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

  3. objects (物件) 清單中,選擇您要設定許可的物件名稱。

  4. 選擇 Permissions (許可)。

  5. 在 [存取控制清單 (ACL)] 下,選擇 [編輯]。

    您可以編輯物件的下列ACL權限:

    物件
    • Read (讀取) – 允許承授者讀取物件資料及其中繼資料

    物件 ACL
    • 讀取 — 允許受權者讀取物ACL件。

    • 寫入 — 允許受權者為適用的ACL物件寫入。在 S3 主控台中,您只能授予儲存貯體擁有者 (您的 AWS 帳戶). 我們強烈建議您不要授與其他受權者的寫入存取權。不過,如果您需要授與寫入權限,您可以使用 AWS CLI, AWS SDKs,或 RESTAPI.

  6. 您可以管理下列項目的物件存取許可:

    1. 其他擁有者的存取

      有者指的是 AWS 帳戶根使用者,而不是 AWS Identity and Access Management IAM使用者。如需有關 root 使用者的詳細資訊,請參閱 AWS 帳戶根使用者 (在 IAM 使用者指南中)

      若要變更擁有者的物件存取權限,請在物件擁有者的存取權下,選擇您的 AWS 帳戶(所有者)

      選取您要變更之許可的核取方塊,然後選擇 Save (儲存)

    2. 訪問其他 AWS 帳戶

      若要授與權限 AWS 來自不同的用戶 AWS 帳戶,在其他存取權下 AWS 帳戶,選擇 [新增帳戶]。在「輸入 ID」欄位中,輸入 AWS 您要授與物件權限的使用者。如需有關尋找規範 ID 的資訊,請參閱您的 AWS 帳戶中的識別碼 Amazon Web Services 一般參考。 您最多可以新增 99 個使用者。

      選取您要授予使用者之許可的核取方塊,然後選擇 Save (儲存)。若要顯示許可的相關資訊,請選擇說明圖示。

    3. 公用存取

      若要將物件的存取權授予一般大眾 (全世界的所有人),請在 Public access (公開存取) 下,選擇 Everyone (每個人)。授予公用存取許可表示全世界的所有人都能存取該物件。

      選取您要授予之許可的核取方塊,然後選擇 Save (儲存)

      警告
      • 將 Amazon S3 物件的匿名存取權授予每個人群組時請謹慎小心。當您將存取權授予此群組時,全世界任何人都能存取您的物件。若必須將存取權授予每個人,強烈建議您只授予 Read objects (讀取物件) 許可。

      • 強烈建議您「不要」將寫入物件許可授予 Everyone (每個人) 群組。這樣做可讓任何人覆寫物件的ACL權限。

本節提供如何在值區和物件上設定存取控制清單 (ACL) 授與的範例。

重要

如果儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定,則您必須使用政策將存取權授予儲存貯體及其中的物件。啟用值區擁有者強制設定後,設定存取控制清單 (ACLs) 或更新的要求ACLs會失敗,並傳回AccessControlListNotSupported錯誤碼。仍然支持讀取ACLs請求。

Java

本節提供如何在值區和物件上設定存取控制清單 (ACL) 授與的範例。第一個範例會建立含有罐頭 ACL (請參閱罐裝 ACL) 的值區,建立自訂權限授與清單,然後以ACL包含自訂授ACL與的罐裝取代。第二個範例顯示如何修改 ACL using 方AccessControlList.grantPermission()法。

範例 建立儲存貯體並指定ACL可授與 S3 日誌傳遞群組權限的罐裝

此為建立儲存貯體的範例。在要求中,範例會指定一個罐裝ACL,授與記錄傳遞群組權限,以便將記錄寫入值區。

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.*; import java.io.IOException; import java.util.ArrayList; public class CreateBucketWithACL { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String userEmailForReadPermission = "*** user@example.com ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withRegion(clientRegion) .build(); // Create a bucket with a canned ACL. This ACL will be replaced by the // setBucketAcl() // calls below. It is included here for demonstration purposes. CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName, clientRegion.getName()) .withCannedAcl(CannedAccessControlList.LogDeliveryWrite); s3Client.createBucket(createBucketRequest); // Create a collection of grants to add to the bucket. ArrayList<Grant> grantCollection = new ArrayList<Grant>(); // Grant the account owner full control. Grant grant1 = new Grant(new CanonicalGrantee(s3Client.getS3AccountOwner().getId()), Permission.FullControl); grantCollection.add(grant1); // Grant the LogDelivery group permission to write to the bucket. Grant grant2 = new Grant(GroupGrantee.LogDelivery, Permission.Write); grantCollection.add(grant2); // Save grants by replacing all current ACL grants with the two we just created. AccessControlList bucketAcl = new AccessControlList(); bucketAcl.grantAllPermissions(grantCollection.toArray(new Grant[0])); s3Client.setBucketAcl(bucketName, bucketAcl); // Retrieve the bucket's ACL, add another grant, and then save the new ACL. AccessControlList newBucketAcl = s3Client.getBucketAcl(bucketName); Grant grant3 = new Grant(new EmailAddressGrantee(userEmailForReadPermission), Permission.Read); newBucketAcl.grantAllPermissions(grant3); s3Client.setBucketAcl(bucketName, newBucketAcl); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it and returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
範例 更新ACL現有物件

此範例會更新物件ACL上的。範例會執行下列任務:

  • 檢索對象的 ACL

  • ACL透過移除所有現有權限來清除

  • 新增兩個權限:擁有者的完整存取權限,以及對透過電子郵件地址識別的使用者 WRITE _ ACP (請參閱我可以授予哪些許可?)

  • 儲存ACL至物件

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.CanonicalGrantee; import com.amazonaws.services.s3.model.EmailAddressGrantee; import com.amazonaws.services.s3.model.Permission; import java.io.IOException; public class ModifyACLExistingObject { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String keyName = "*** Key name ***"; String emailGrantee = "*** user@example.com ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Get the existing object ACL that we want to modify. AccessControlList acl = s3Client.getObjectAcl(bucketName, keyName); // Clear the existing list of grants. acl.getGrantsAsList().clear(); // Grant a sample set of permissions, using the existing ACL owner for Full // Control permissions. acl.grantPermission(new CanonicalGrantee(acl.getOwner().getId()), Permission.FullControl); acl.grantPermission(new EmailAddressGrantee(emailGrantee), Permission.WriteAcp); // Save the modified ACL back to the object. s3Client.setObjectAcl(bucketName, keyName, acl); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET
範例 建立儲存貯體並指定ACL可授與 S3 日誌傳遞群組權限的罐裝

此為建立儲存貯體的 C# 範例。在要求中,程式碼也會指定一個罐裝ACL,以授與記錄傳遞群組權限,以將記錄寫入值區。

如需有關設定和執行程式碼範例的詳細資訊,請參閱 AWS SDK對於. NETAWS SDK對於. NET開發人員指南

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ManagingBucketACLTest { private const string newBucketName = "*** bucket name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); CreateBucketUseCannedACLAsync().Wait(); } private static async Task CreateBucketUseCannedACLAsync() { try { // Add bucket (specify canned ACL). PutBucketRequest putBucketRequest = new PutBucketRequest() { BucketName = newBucketName, BucketRegion = S3Region.EUW1, // S3Region.US, // Add canned ACL. CannedACL = S3CannedACL.LogDeliveryWrite }; PutBucketResponse putBucketResponse = await client.PutBucketAsync(putBucketRequest); // Retrieve bucket ACL. GetACLResponse getACLResponse = await client.GetACLAsync(new GetACLRequest { BucketName = newBucketName }); } catch (AmazonS3Exception amazonS3Exception) { Console.WriteLine("S3 error occurred. Exception: " + amazonS3Exception.ToString()); } catch (Exception e) { Console.WriteLine("Exception: " + e.ToString()); } } } }
範例 更新ACL現有物件

這個 C# 範例會更新現有物件ACL上的。範例會執行下列任務:

  • 檢索對象的ACL。

  • ACL透過移除所有現有權限來清除。

  • 新增兩個權限:擁有者的完整存取權限,ACP以及透過電子郵件地址識別的使用者 WRITE _。

  • ACL透過傳送PutAcl請求來儲存。

如需有關設定和執行程式碼範例的詳細資訊,請參閱 AWS SDK對於. NETAWS SDK對於. NET開發人員指南

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ManagingObjectACLTest { private const string bucketName = "*** bucket name ***"; private const string keyName = "*** object key name ***"; private const string emailAddress = "*** email address ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); TestObjectACLTestAsync().Wait(); } private static async Task TestObjectACLTestAsync() { try { // Retrieve the ACL for the object. GetACLResponse aclResponse = await client.GetACLAsync(new GetACLRequest { BucketName = bucketName, Key = keyName }); S3AccessControlList acl = aclResponse.AccessControlList; // Retrieve the owner (we use this to re-add permissions after we clear the ACL). Owner owner = acl.Owner; // Clear existing grants. acl.Grants.Clear(); // Add a grant to reset the owner's full permission (the previous clear statement removed all permissions). S3Grant fullControlGrant = new S3Grant { Grantee = new S3Grantee { CanonicalUser = owner.Id }, Permission = S3Permission.FULL_CONTROL }; // Describe the grant for the permission using an email address. S3Grant grantUsingEmail = new S3Grant { Grantee = new S3Grantee { EmailAddress = emailAddress }, Permission = S3Permission.WRITE_ACP }; acl.Grants.AddRange(new List<S3Grant> { fullControlGrant, grantUsingEmail }); // Set a new ACL. PutACLResponse response = await client.PutACLAsync(new PutACLRequest { BucketName = bucketName, Key = keyName, AccessControlList = acl }); } catch (AmazonS3Exception amazonS3Exception) { Console.WriteLine("An AmazonS3Exception was thrown. Exception: " + amazonS3Exception.ToString()); } catch (Exception e) { Console.WriteLine("Exception: " + e.ToString()); } } } }

Amazon S3 可APIs讓您在建立儲存貯體或物件ACL時設定。Amazon S3 也提供在現有儲存貯體或物件ACL上設定的功API能。這些APIs提供了以下方法來設置ACL:

  • ACL使用請求標頭設定:當您傳送建立資源 (值區或物件) 的要求時,您可以ACL使用要求標頭來設定。使用這些標頭,您可以指定固定ACL或明確指定授權 (明確識別受權者和權限)。

  • ACL使用要求主體設定:當您傳送要求以針ACL對現有資源設定時,您可以在要求標頭或內文中設定。ACL

如需管理RESTAPI支援的相關資訊ACLs,請參閱 Amazon 簡單儲存服務API參考中的以下各節:

重要

如果儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定,則您必須使用政策將存取權授予儲存貯體及其中的物件。啟用值區擁有者強制設定後,設定存取控制清單 (ACLs) 或更新的要求ACLs會失敗,並傳回AccessControlListNotSupported錯誤碼。仍然支持讀取ACLs請求。

存取控制清單 (ACL) 特定要求標頭

您可以使用標頭來授與存取控制清單 (ACL) 型權限。所有物件預設皆為私有。只有擁有者有完整的存取控制權。新增物件時,您可以將權限授與個人 AWS 帳戶 或由 Amazon S3 定義的預先定義群組。然後,這些權限會新增至物件的「存取控制清單」(ACL)。如需詳細資訊,請參閱存取控制清單 (ACL) 概觀

透過此操作,您可以使用下列兩種方法之一授與存取許可:

  • 罐裝 ACL (x-amz-acl) — Amazon S3 支援一組預先定義的ACLs,稱為罐裝ACLs。每個罐頭都ACL有一組預先定義的受權者和權限。如需詳細資訊,請參閱罐裝 ACL

  • 存取權限 — 明確授與特定存取權限 AWS 帳戶 或群組,請使用下列標頭。每個標頭都會對應到 Amazon S3 支援的特定許可ACL。如需詳細資訊,請參閱存取控制清單 (ACL) 概觀。在標頭中,您指定取得特定許可的授與者清單。

    • x-amz-grant-read

    • x-amz-grant-write

    • x-amz-grant-read-ACP

    • x-amz-grant-write-ACP

    • x-amz-grant-full-控制

如需ACLs使用管理的詳細資訊 AWS CLI,請參閱put-bucket-acl中的 AWS CLI 指令參考

重要

如果儲存貯體使用 S3 物件擁有權的儲存貯體擁有者強制執行設定,則您必須使用政策將存取權授予儲存貯體及其中的物件。啟用值區擁有者強制設定後,設定存取控制清單 (ACLs) 或更新的要求ACLs會失敗,並傳回AccessControlListNotSupported錯誤碼。仍然支持讀取ACLs請求。