S3 Access Grants の概念
S3 Access Grants では、シンプルなアクセススキームとして以下の概念が導入されています。
- S3 Access Grants インスタンス
-
S3 Access Grants インスタンスは、Amazon S3 データに対してどのユーザーがどのレベルのアクセスを持つかを定義する個別のアクセス許可の論理コンテナです。AWS リージョン ごと、AWS アカウント ごとに単一の S3 Access Grants インスタンスを持つことができます。この S3 Access Grants インスタンスを使用して、同じアカウントと AWS リージョン のすべてのバケットへのアクセスを制御できます。S3 Access Grants を使用して社内ディレクトリ内のユーザーとグループのアイデンティティへのアクセスを許可する場合は、S3 Access Grants インスタンスを AWS Identity and Access Management (IAM) アイデンティティセンターのインスタンスに関連付ける必要もあります。
- ロケーション
-
ロケーションは、S3 Access Grants インスタンスがアクセスを許可できるデータを定義します。S3 Access Grants は、特定の S3 プレフィックス、バケット、またはオブジェクトへのアクセスを範囲とする IAM 認証情報を発行することで機能します。S3 Access Grants のロケーションを IAM ロールに関連付けることで、そのロールから一時的なセッションが作成されます。最も一般的なロケーション設定は、S3 Access Grants インスタンス全体を
s3://
の単一のロケーションに設定することです。これで、アカウントと AWS リージョン 内のすべての S3 バケットへのアクセスに対応できます。S3 Access Grants インスタンスでは複数のロケーションを作成することもできます。例えば、バケットをこのバケットに制限する権限のためにs3://
ロケーションとして登録できます。また、デフォルトのロケーションexample-s3-bucket1
s3://
も登録できます。 - 権限
-
ロケーション内のアクセス範囲を絞り込むには、個別の権限を作成します。S3 Access Grants インスタンスの個別の権限を使用すると、特定のエンティティ (IAM プリンシパル、または社内ディレクトリのユーザーやグループ) に Amazon S3 プレフィックス、バケット、またはオブジェクトへのアクセスを許可できます。権限ごとに、異なる範囲 (プレフィックス、バケット、またはオブジェクト) とアクセスレベル (
READ
、WRITE
、またはREADWRITE
) を定義できます。例えば、特定の社内ディレクトリグループ01234567-89ab-cdef-0123-456789abcdef
にs3://
へのexample-s3-bucket1
/projects/items/*READ
アクセスを許可する権限があるとします。この権限により、そのグループのユーザーは、
という名前のバケット内のプレフィックスexample-s3-bucket1
projects/items/
が付いたキー名を持つすべてのオブジェクトにREAD
アクセスが付与されます。 - S3 Access Grants の一時的な認証情報
-
アプリケーションは、新しい S3 API オペレーション GetDataAccess を呼び出して、アクセス許可レベルが、
READ
、WRITE
またはREADWRITE
の単一のオブジェクト、プレフィックス、またはバケットへのアクセスをリクエストすることで、ジャストインタイムアクセス認証情報をリクエストできます。S3 Access Grants インスタンスは、GetDataAccess
リクエストを保持する権限に照会して評価します。一致する権限がある場合、S3 Access Grants は、一致する権限のロケーションに関連付けられた IAM ロールを引き受けます。次に、S3 Access Grants は IAM セッションのアクセス許可の範囲を、権限の範囲で指定されている S3 バケット、プレフィックス、またはオブジェクトのみに限定します。一時アクセス認証情報の有効期限はデフォルトで 1 時間です。ただし、15 分から 12 時間までの任意の値に設定できます。
仕組み
次の図では、範囲が s3://
のデフォルトの Amazon S3 ロケーションが IAM ロール s3ag-location-role
に登録されています。この IAM ロールには、S3 Access Grants を介して認証情報が取得されると、アカウント内で Amazon S3 アクションを実行するアクセス許可があります。
このロケーションでは、2 人の IAM ユーザーに対して 2 つの個別のアクセス権限が作成されます。IAM ユーザー Bob には、DOC-BUCKET-EXAMPLE
バケット内のプレフィックス bob/
への READ
と WRITE
のアクセス権の両方が付与されます。別の IAM ロールである Alice には、DOC-BUCKET-EXAMPLE
バケット内のプレフィックス alice/
への READ
アクセス許可のみが付与されます。Bob が DOC-BUCKET-EXAMPLE
バケット内のプレフィックス bob/
にアクセスするための権限は青色で定義されています。Alice が DOC-BUCKET-EXAMPLE
バケット内のプレフィックス alice/
にアクセスするための権限は緑色で定義されています。
Bob がデータの READ
を行う場合、Bob の権限が付与されているロケーションに関連付けられている IAM ロールが S3 Access Grants の GetDataAccess API オペレーションを呼び出します。Bob が s3://DOC-BUCKET-EXAMPLE/bob/*
で始まる S3 プレフィックスまたはオブジェクトに対して READ
を行おうとすると、GetDataAccess
リクエストは s3://DOC-BUCKET-EXAMPLE/bob/*
へのアクセス許可がある一時的な IAM セッション認証情報セットを返します。Bob は、権限により許可されているため、s3://DOC-BUCKET-EXAMPLE/bob/*
で始まる任意の S3 プレフィックスまたはオブジェクトに対して WRITE
を同様に実行できます。
同じように、Alice は、s3://DOC-BUCKET-EXAMPLE/alice/
で始まるすべてに対して READ
を実行できます。ただし、s3://
内のバケット、プレフィックス、オブジェクトに対して WRITE
を実行しようすると、Access Denied (403 Forbidden) エラーが発生します。これは、どのデータに対する WRITE
アクセスを Alice に付与する権限がないためです。さらに、Alice が s3://DOC-BUCKET-EXAMPLE/alice/
外部のデータに対して何らかのアクセスレベル (READ
または WRITE
) をリクエストしても、同様に Access Denied エラーが表示されます。
![S3 Access Grants の仕組み](images/s3ag-how-it-works.png)
このパターンは多数のユーザーとバケットに応じてスケールでき、アクセス許可の管理を簡素化します。個別のユーザーとプレフィックスのアクセス関係を追加または削除するたびに、サイズが大きくなる可能性のある S3 バケットポリシーを編集する代わりに、個別の権限を別々に追加したり削除したりできます。