ACL の設定 - Amazon Simple Storage Service

新しい Amazon S3 ユーザーガイドにようこそ! Amazon S3 ユーザーガイドは、使用中止された 3 つのガイド (Amazon S3 開発者ガイドAmazon S3 コンソールユーザーガイドAmazon S3 入門ガイド) の情報と手順をまとめたものです。

ACL の設定

このセクションでは、アクセスコントロールリスト (ACL) を使用して S3 バケットとオブジェクトのアクセス許可を管理する方法について説明します。AWS マネジメントコンソール、AWS コマンドラインインターフェイス (CLI)、REST API、AWS SDK を使用して、リソース AC に許可を追加できます。

バケットに対するアクセス許可とオブジェクトに対するアクセス許可は相互に独立しています。オブジェクトはバケットからアクセス許可を継承しません。たとえば、バケットを作成してユーザーに書き込みアクセスを許可した場合、そのユーザーから明示的にアクセスが許可されない限り、そのユーザーのオブジェクトにアクセスできません。

他の AWS アカウントユーザーまたは事前定義されたグループにアクセス許可を与えることができます。アクセス許可が付与されたユーザーまたはグループは、被付与者と呼ばれます。デフォルトでは、バケットを作成した AWS アカウントである所有者が、完全なアクセス許可を持っています。

ユーザーまたはグループに付与する各アクセス許可により、バケットに関連付けられたエントリが ACL に追加されます。ACL は、被付与者と付与されたアクセス許可を識別するリストを表示します。

次の表は、ACL のアクセス許可をまとめたものです。ACL の詳細については、「アクセスコントロールリスト (ACL) の概要」を参照してください。

ACL アクセス許可
アクセス許可 バケット上で付与された場合 オブジェクト上で付与された場合
READ 被付与者がバケット内のオブジェクトをリストすることを許可します 被付与者がオブジェクトデータとそのメタデータを読み込むことを許可します
WRITE 被付与者がバケット内のオブジェクトを作成、上書き、削除することを許可します 該当しません
READ_ACP 被付与者がバケット ACL を読み込むことを許可します 被付与者がオブジェクト ACL を読み込むことを許可します
WRITE_ACP 被付与者が該当するバケットの ACL を書き込むことを許可します 被付与者が該当するオブジェクトの ACL を書き込むことを許可します
FULL_CONTROL バケット上の READ、WRITE、READ_ACP、WRITE_ACP アクセス許可を被付与者に許可します オブジェクト上の READ、READ_ACP、WRITE_ACP アクセス許可を被付与者に許可します
警告

すべてのユーザー (パブリックアクセス)または認証されたユーザーグループ (すべての AWS 認証ユーザー) のグループへの書き込みアクセスを許可しないことを強くお勧めします。これらのグループに書き込みアクセスを許可した場合の影響の詳細については、「Amazon S3 の事前定義済みのグループ」を参照してください。

バケットに ACL アクセス許可を設定するには、次の手順に従います。ACL アクセス許可の詳細については、「ACL アクセス許可」を参照してください。

  1. AWS マネジメントコンソールにサインインして Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. [Buckets (バケット)] リストで、アクセス許可を設定するバケットの名前を選択します。

  3. [Permissions] を選択します。

  4. [アクセスコントロールリスト] で、[編集] を選択します。

    バケットに対する次の ACL アクセス許可を編集できます。

    オブジェクト

    • List (リスト) - 被付与者がバケット内のオブジェクトをリストすることを許可します

    • Write (書き込み) - 被付与者がバケット内のオブジェクトを作成、上書き、削除することを許可しますS3 コンソールでは、S3 ログデリバリーグループとバケット所有者 (AWS アカウント) にのみ書き込みアクセスを許可できます。他の被付与者には、書き込みアクセスを許可しないことを強くお勧めします。ただし、書き込みアクセスを許可する必要がある場合は、AWS CLI、AWS SDK、または REST API を使用できます。

    バケット ACL

    • Read (読み込み) - 被付与者がバケット ACL を読み込むことを許可します

    • Write (書き込み) - 被付与者が該当するバケットの ACL を書き込むことを許可します

  5. バケット所有者のアクセス許可を変更するには、[Bucket owner (your AWS account) (バケット所有者 (ユーザーの AWS アカウント))] の横で、次の ACL アクセス許可をクリアまたは選択します。

    • [Objects (オブジェクト)] – [List (リスト)] または [Write (書き込み)]

    • [Bucket ACL (バケット ACL)] – [Read (読み取り)] または [Write (書き込み)]

    所有者は AWS アカウントのルートユーザーを指します。AWS Identity and Access Management (IAM) ユーザーではありません。ルートユーザーの詳細については、IAM ユーザーガイドの「AWS アカウントのルートユーザー」を参照してください。

  6. 一般ユーザー (インターネット上のすべてのユーザー) のアクセス許可を付与または取り消すには、[Everyone (public access) (全員 (パブリックアクセス))] の横で、次の ACL アクセス許可をクリアまたは選択します。

    • [Objects (オブジェクト)] – [List (リスト)]

    • [Bucket ACL (バケット ACL)] – [Read (読み取り)]

    警告

    [全員] グループに S3 バケットへのパブリックアクセスを付与するときは注意が必要です。このグループにアクセスを付与すると、世界中のすべてのユーザーがバケットにアクセスできます。種類にかかわらず、S3 バケットへのパブリック書き込みアクセスは一切付与しないことを強くお勧めします。

  7. AWS アカウントを持つすべてのユーザーに対してアクセス許可を付与または取り消すには、[Authenticated Users group (anyone with an AWS account) (認証済みユーザーグループ (AWS アカウントを持つユーザー))] の横にある、次の ACL アクセス許可をクリアまたは選択します。

    • [Objects (オブジェクト)] – [List (リスト)]

    • [Bucket ACL (バケット ACL)] – [Read (読み取り)]

  8. Amazon S3 がバケットにサーバーアクセスログを書き込むアクセス許可を付与または取り消すには、[S3 log delivery group (S3 ログ配信グループ)] で、次の ACL アクセス許可をクリアまたは選択します。

    • [Objects (オブジェクト)] – [List (リスト)] または [Write (書き込み)]

    • [Bucket ACL (バケット ACL)] – [Read (読み取り)] または [Write (書き込み)]

      バケットがアクセスログを受け取るターゲットバケットとして設定されている場合、バケットのアクセス許可は [ログ配信] グループのバケットへの書き込みアクセスを許可する必要があります。バケット上のサーバアクセスログ記録を有効にすると、Amazon S3 コンソールは、[Log Delivery (ログ配信)] グループにログを受信することを選択したターゲットバケットへの書き込みアクセス権を付与します。サーバーアクセスログ記録の詳細については、Amazon S3 サーバーアクセスログを有効にします。 を参照してください。

  9. 別の AWS アカウントへのアクセス許可を付与するには、次の手順を実行します。

    1. [Add grantee (被付与者の追加)] を選択します。

    2. [Grantee (被付与者)] ボックスに、他の AWS アカウントの正規 ID を入力します。

    3. 次の ACL アクセス許可から選択します。

      • [Objects (オブジェクト)] – [List (リスト)] または [Write (書き込み)]

      • [Bucket ACL (バケット ACL)] – [Read (読み取り)] または [Write (書き込み)]

    警告

    他の AWS アカウントに自分のリソースへのアクセスを許可した場合、その AWS アカウントはアカウント内のユーザーにアクセス許可を譲渡できることに注意してください。これはクロスアカウントアクセスと呼ばれます。クロスアカウントアクセスの使用については、IAM ユーザーガイドの「IAM ユーザーにアクセス許可を委任するロールの作成」を参照してください。

  10. 別の AWS アカウントへのアクセスを削除するには、[Access for other AWS accounts (他の AWS アカウントのアクセス)] で [Remove (削除)] を選択します。

  11. 変更を保存するには、[変更の保存] を選択します。

オブジェクトに ACL アクセス許可を設定するには、次の手順に従います。ACL アクセス許可の詳細については、「ACL アクセス許可」を参照してください。

オブジェクトへのアクセス許可を設定するには

  1. AWS マネジメントコンソールにサインインして Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. [バケット名] リストで、オブジェクトを含むバケットの名前を選択します。

  3. オブジェクトのリストで、アクセス許可を設定するオブジェクトの名前を選択します。

  4. [Permissions] を選択します。

  5. [アクセスコントロールリスト (ACL)] で、[編集] を選択します。

    オブジェクトに対する次の ACL アクセス許可を編集できます。

    オブジェクト

    • Read (読み込み) - 被付与者がオブジェクトデータとそのメタデータを読み込むことを許可します

    オブジェクト ACL

    • 読み込み (Read) - 被付与者がオブジェクト ACL を読み込むことを許可します

    • Write (書き込み) - 被付与者が該当するオブジェクトの ACL を書き込むことを許可しますS3 コンソールでは、バケット所有者 (AWS アカウント) にのみ書き込みアクセスを許可できます。他の被付与者には、書き込みアクセスを許可しないことを強くお勧めします。ただし、書き込みアクセスを許可する必要がある場合は、AWS CLI、AWS SDK、または REST API を使用できます。

  6. 以下のオブジェクトのアクセス許可を管理できます。

    1. オブジェクト所有者へのアクセス

      所有者はAWS アカウントのルートユーザーを指します。AWS Identity and Access Management (IAM) ユーザーではありません。ルートユーザーの詳細については、IAM ユーザーガイドの「AWS アカウントのルートユーザー」を参照してください。

      所有者のオブジェクトアクセス許可を変更するには、[Access for object owner (オブジェクト所有者へのアクセス)] で、[Your AWS Account (AWS アカウント (所有者))] を選択します。

      変更するアクセス許可のチェックボックスをオンにして、[保存] を選択します。

    2. 他の AWS アカウントへのアクセス

      別の AWS アカウントから AWS ユーザーにアクセス許可を与えるには、[他の AWS アカウントのアクセス] で、[アカウントの追加] を選択します。[ID もしくは Eメール] フィールドに、オブジェクトのアクセス許可を付与する AWS ユーザーの正規 ID を入力します。正規 ID の検索の詳細については、AWS 全般のリファレンスの「AWS アカウント ID」を参照してください。最大 99 人のユーザーを追加できます。

      ユーザーに付与するアクセス許可のチェックボックスをオンにして、[保存] を選択します。アクセス許可についての情報を表示するには、ヘルプアイコンを選択します。

    3. パブリックアクセス

      オブジェクトへのアクセスを一般のユーザー (世界中のすべてのユーザー) に許可するには、[パブリックアクセス] で [全員] を選択します。パブリックアクセス許可を付与すると、世界中の誰でもオブジェクトにアクセスできるようになります。

      付与するアクセス許可のチェックボックスをオンにして、[保存] を選択します。

      警告
      • [Everyone (全員)] グループに Amazon S3 オブジェクトへの匿名アクセスを付与するときは注意が必要です。このグループにアクセスを付与すると、世界中のすべてのユーザーがオブジェクトにアクセスできます。すべてのユーザーにアクセスを付与する必要がある場合は、[Read objects (オブジェクトの読み取り)] のみのアクセス許可を付与することを強くお勧めします。

      • [全員] グループにオブジェクト書き込み許可は付与しないことを強くお勧めします。付与すると、すべてのユーザーに対して、オブジェクトの ACL アクセス許可を上書きすることが許可されます。

このセクションでは、バケットやオブジェクトでアクセスコントロールリスト (ACL) の付与を設定する方法の例を示します。

Java

このセクションでは、バケットやオブジェクトでアクセスコントロールリスト (ACL) の付与を設定する方法の例を示します。最初の例では、既定 ACL を使用するバケット (「既定 ACL」を参照) を作成します。次に、カスタムアクセス許可の付与のリストを作成して、既定の ACL をカスタム付与を含む ACL で置き換えます。2 番目の例では、AccessControlList.grantPermission() メソッドを使用して ACL を変更する方法を示します。

例 バケットを作成し、S3 ログ配信グループにアクセス許可を付与する既定 ACL を指定する

この例では、バケットを作成します。リクエストで既定の 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 をクリアする

  • 2 つのアクセス許可として、所有者へのフルアクセスと、メールアドレスで識別されたユーザーへの 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

例 バケットを作成し、S3 ログ配信グループにアクセス許可を付与する既定 ACL を指定する

この C# の例では、バケットを作成します。リクエストで既定の ACL を指定し、バケットにログを書き込むアクセス許可をログ配信グループに付与します。

有効な例を作成してテストする手順については、「Amazon S3 .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 をクリアする。

  • 2 つのアクセス許可として、所有者へのフルアクセスと、メールアドレスで識別されたユーザーへの WRITE_ACP を追加する。

  • PutAcl リクエストを送信して ACL を保存する。

有効な例を作成してテストする手順については、「Amazon S3 .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 API を使用して、バケットまたはオブジェクトの作成時に、ACL を設定できます。Amazon S3 では、既存のバケットまたはオブジェクトに ACL を設定する API も提供します。これらの API は ACL を設定する次のメソッドを提供します。

  • リクエストヘッダーを使用した ACL の設定 - リソース (バケットまたはオブジェクト) を作成するリクエストを送るときに、リクエストヘッダーを使用して ACL を設定します。これらのヘッダーを使用して、既定 ACL を指定するか、許可を明示的に指定 (被付与者とアクセス許可を明示的に識別) します。

  • リクエストボディを使用した ACL の設定 - 既存のリソースに ACL を設定するリクエストを送信するときに、リクエストのヘッダーまたはボディを使用して ACL を設定できます。

REST API での ACL の管理のサポートの詳細については、Amazon Simple Storage Service API リファレンスの以下のセクションを参照してください。

アクセスコントロールリスト (ACL) 固有の要求ヘッダー

ヘッダーを使用して、アクセスコントロールリスト (ACL) ベースのアクセス許可を付与できます。デフォルトでは、すべてのオブジェクトがプライベートです。所有者だけがフルアクセスコントロールを持っています。新しいオブジェクトを追加するときに、個々の AWS アカウントに、または Amazon S3 であらかじめ定義されたグループにアクセス許可を付与できます。これらのアクセス許可は、オブジェクトのアクセスコントロールリスト (ACL) に追加されます。詳細については、「アクセスコントロールリスト (ACL) の概要」を参照してください。

この操作では、次の 2 つの方法のいずれかを使用してアクセス許可を付与できます。

  • 既定 ACL (x-amz-acl) — Amazon S3 は、既定 ACL と呼ばれる、あらかじめ定義された一連の ACL をサポートしています。各既定 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-control

AWS CLI を使用した ACL の管理の詳細については、AWS CLI Command Reference の「put-bucket-acl」を参照してください。