このページでは、Identity and Access Management(IAM)の概要と、これを使用して Cloud Storage のバケット、マネージド フォルダ、オブジェクト リソースへのアクセスを制御する方法について説明します。
- Cloud Storage でアクセス制御を行うその他の方法については、アクセス制御の概要をご覧ください。 
- IAM とその機能の詳細については、Identity and Access Management をご覧ください。 
概要
IAM を使用すると、 Google Cloud プロジェクトのリソースにアクセスできるユーザーを制御できます。リソースには、Cloud Storage バケット、バケット内のマネージド フォルダ、バケット内に保存されているオブジェクト、Compute Engine インスタンスなどの他の Google Cloud エンティティが含まれます。
IAM でのプリンシパルとは「誰」であるかを指します。プリンシパルは個々のユーザー、グループ、ドメイン、さらには一般大衆であることもあります。プリンシパルにはロールが付与されます。このロールにより、Cloud Storage と Google Cloud でより全般的な操作を行える権限が付与されます。各ロールは、1 つ以上の権限をまとめたものです。権限は IAM の基本単位です。各権限により、特定の操作が許可されます。
たとえば、storage.objects.create 権限ではオブジェクトを作成できます。この権限は、バケット内にオブジェクトを作成できる権限を付与するストレージ オブジェクト作成者(roles/storage.objectCreator)や、オブジェクトを操作するための幅広い権限を付与する Storage オブジェクト管理者(roles/storage.objectAdmin)などのロールに含まれています。
リソースに設定した IAM ロールの集合は IAM ポリシーと呼ばれます。これらのロールによって付与されるアクセス権は、ポリシーが設定されているリソースとそのリソースに含まれるリソースの両方に適用されます。たとえば、バケットに IAM ポリシーを設定し、そのバケットとバケット内のオブジェクトに対する管理権限をユーザーに付与できます。プロジェクト全体に IAM ポリシーを設定し、プロジェクト内の任意のバケット内のオブジェクトを表示する権限を付与することもできます。
Google Cloud 組織リソースがある場合は、IAM 拒否ポリシーを使用してリソースへのアクセスを拒否することもできます。リソースに拒否ポリシーがアタッチされている場合、ポリシーのプリンシパルは、付与されたロールに関係なく、指定された権限を使用してリソースまたはその中のサブリソースにアクセスできません。拒否ポリシーは IAM 許可ポリシーをオーバーライドします。
権限
権限により、Cloud Storage のバケット、マネージド フォルダ、オブジェクトに対して特定の操作を行うことをプリンシパルに許可します。たとえば、storage.buckets.list 権限を持つプリンシパルはプロジェクト内のバケットを一覧表示できます。プリンシパルに直接権限を付与するのではなく、ロールを割り当てます。ロールには 1 つ以上の権限が含まれています。
Cloud Storage に適用される IAM 権限のリファレンス リストについては、Cloud Storage に適用される IAM 権限をご覧ください。
ロール
ロールは、1 つ以上の権限をまとめたものです。たとえば、ストレージ オブジェクト閲覧者(roles/storage.objectViewer)のロールには、権限 storage.objects.get と storage.objects.list が含まれています。プリンシパルにロールを付与すると、プロジェクト内のバケット、マネージド フォルダ、オブジェクトに対する操作を行えるようになります。
Cloud Storage に適用される IAM ロールのリファレンス リストについては、Cloud Storage に適用される IAM ロールをご覧ください。
プロジェクト レベル、バケットレベル、マネージド フォルダ レベルでのロールの付与
プリンシパルには、プロジェクト レベル、バケットレベル、またはマネージド フォルダ レベルでロールを付与できます。これらのロールによって付与される権限は、リソース階層全体で追加で適用されます。権限モデルをより細かく設定するには、リソース階層のさまざまなレベルにロールを付与します。
たとえば、プロジェクト内の複数のバケットに存在するオブジェクトの読み取り権限をユーザーに付与しますが、オブジェクトの作成ができるのはバケット A だけにします。これを行うには、ユーザーにプロジェクトに対する Storage オブジェクト閲覧者(roles/storage.objectViewer)のロールを付与します。これにより、ユーザーはプロジェクト内の任意のバケットに保存されている任意のオブジェクトを読み取ることができます。バケット A に対する Storage オブジェクト作成者(roles/storage.objectCreator)ロールを付与すると、ユーザーはそのバケットにのみオブジェクトを作成できます。
一部のロールは、リソース階層のすべてのレベルで使用できます。プロジェクト レベルで使用する場合、ロールに含まれる権限はプロジェクト内のすべてのバケット、フォルダ、オブジェクトに適用されます。バケットレベルで使用する場合、権限は特定のバケット、フォルダ、その中のオブジェクトにのみ適用されます。このようなロールの例としては、ストレージ管理者(roles/storage.admin)ロール、Storage オブジェクト閲覧者(roles/storage.objectViewer)ロール、Storage オブジェクト作成者(roles/storage.objectCreator)ロールがあります。
一部のロールは 1 つのレベルでのみ適用できます。たとえば、Storage レガシー オブジェクト オーナー(roles/storage.legacyObjectOwner)ロールは、バケットレベルまたはマネージド フォルダ レベルでのみ適用できます。IAM 拒否ポリシーの制御を許可する IAM ロールは、組織レベルでのみ適用できます。
ACL との関係
バケットで均一なバケットレベルのアクセス機能が有効になっていない場合、バケットとオブジェクトは IAM に加えて、アクセス制御リスト(ACL)と呼ばれる以前のアクセス制御システムを使用できます。通常、ACL の使用は避けるべきであり、バケットに均一なバケットレベルのアクセスを有効にする必要があります。このセクションでは、バケットとその中のオブジェクトで ACL の使用を許可する場合に注意すべき点について説明します。
レガシー バケットの IAM ロールはバケットの ACL と連動して機能します。レガシー バケットのロールを追加または削除すると、バケットに関連する ACL にも変更が反映されます。同様に、バケット固有の ACL を変更すると、バケットに対応するレガシー バケットの IAM ロールも更新されます。
| レガシー バケットのロール | 同等の ACL | 
|---|---|
| Storage レガシー バケット読み取り( roles/storage.legacyBucketReader) | バケット読み取り | 
| Storage レガシー バケット書き込み( roles/storage.legacyBucketWriter) | バケット書き込み | 
| ストレージのレガシー バケット オーナー( roles/storage.legacyBucketOwner) | バケット オーナー | 
以前のオブジェクトの IAM ロールなど、これ以外のバケットレベルの IAM ロールはすべて ACL から独立して機能します。同様に、プロジェクト レベルの IAM ロールは ACL から独立して機能します。たとえば、ユーザーにストレージ オブジェクト閲覧者(roles/storage.objectViewer)のロールを設定しても、ACL は変更されません。
オブジェクトの ACL は IAM ロールから独立して機能するため、IAM ポリシーの階層には表示されません。オブジェクトのいずれかにどのユーザーがアクセスできるか評価する場合は、オブジェクトの ACL を確認することに加え、プロジェクト レベルとバケットレベルの IAM ポリシーを確認してください。
IAM 拒否ポリシーと ACL の比較
IAM 拒否ポリシーは、ACL によって付与されるアクセスに適用されます。たとえば、プロジェクトの storage.objects.get 権限を持つプリンシパルを拒否する拒否ポリシーを作成した場合、プリンシパルは、個別のオブジェクトに対する READER 権限が付与されていても、このプロジェクト内のオブジェクトを表示できません。
ACL を変更するための IAM 権限
IAM を使用すると、オブジェクトの ACL を変更するために必要な権限をプリンシパルに付与できます。.get、.getIamPolicy、.setIamPolicy、.update の各 storage.buckets 権限を合わせて付与することで、ユーザーはバケット ACL とデフォルトのオブジェクト ACL を操作できます。
同様に、.get、.getIamPolicy、.setIamPolicy、.update の各 storage.objects 権限を合わせて付与することで、ユーザーはオブジェクト ACL を操作できます。
カスタムロール
IAM には一般的なユースケースをカバーする数多くのロールが事前定義されていますが、場合によっては、自分で指定した一連の権限が含まれた、独自のロールを定義することが必要になります。これをサポートするために、IAM にはカスタムロールが用意されています。
プリンシパルのタイプ
プリンシパルにはいくつかのタイプがあります。たとえば、Google Cloud アカウントは一般的なタイプを表し、allAuthenticatedUsers と allUsers の 2 つは特別なタイプです。IAM のプリンシパル タイプのリストについては、プリンシパル ID をご覧ください。プリンシパルの一般的な詳細については、IAM プリンシパルをご覧ください。
コンビニエンス値
Cloud Storage は、コンビニエンス値をサポートしています。これは、IAM バケット ポリシーにのみ適用できる特別なプリンシパルです。通常、コンビニエンス値は本番環境で使用しないでください。使用すると、基本ロールを付与する必要があり、本番環境では推奨されません。
コンビニエンス値は、基本ロールとプロジェクト ID からなる 2 要素構成の識別子です。
- projectOwner:PROJECT_ID
- projectEditor:PROJECT_ID
- projectViewer:PROJECT_ID
コンビニエンス値は、基本ロールを付与されたプリンシパルと IAM ロールを付与されたプリンシパルを橋渡しする役割を果たします。つまり、コンビニエンス値に付与された IAM ロールは、指定されたプロジェクト ID の指定された基本ロールの全プリンシパルに付与されます。
たとえば、jane@example.com と john@example.com に、my-example-project という名前のプロジェクトに対する閲覧者(roles/viewer)の基本ロールが付与されており、my-bucket という名前のプロジェクト内にバケットがあるとします。my-bucket の Storage オブジェクト作成者(roles/storage.objectCreator)ロールをコンビニエンス値 projectViewer:my-example-project に付与すると、jane@example.com と john@example.com のどちらも、my-bucket の Storage オブジェクト作成者に関連付けられた権限を取得します。
バケットのコンビニエンス値へのアクセス権の付与や取り消しは可能ですが、特定の状況では Cloud Storage によって自動的に適用されます。詳細については、Cloud Storage の基本ロールの変更可能な動作をご覧ください。
条件
IAM Conditions では、プリンシパルに対する権限の付与または拒否を制御する条件を設定できます。Cloud Storage では、次のタイプの条件属性がサポートされています。
- resource.name: バケット名またはオブジェクト名に基づいてバケットとオブジェクトへのアクセスを許可または拒否します。また、- resource.typeを使用してバケットまたはオブジェクトへのアクセス権を付与することもできますが、- resource.nameを使用すれば、ほとんどの場合、この作業は不要になります。次の条件の例では、同じ接頭辞を持つすべてのオブジェクトに IAM の設定を適用します。- resource.name.startsWith('projects/_/buckets/BUCKET_NAME/objects/OBJECT_PREFIX')
- 日時: 権限の有効期限を設定します。 - request.time < timestamp('2019-01-01T00:00:00Z')
これらの条件式は、Common Expression Language(CEL)のサブセットを使用する論理ステートメントです。バケットの IAM ポリシーのロール バインディングで条件を指定します。
次の制限事項にご注意ください。
- バケットレベルで条件を追加する前に、バケットに対して均一なバケットレベルのアクセスを有効にする必要があります。プロジェクト レベルでの条件は許可されますが、Cloud Storage ACL によってプロジェクト レベルの IAM 条件がオーバーライドされないように、プロジェクト内のすべてのバケットを均一なバケットレベルのアクセスに移行する必要があります。均一なバケットレベルのアクセスの制約を適用して、プロジェクト内のすべての新しいバケットに対して均一なバケットレベルのアクセスを有効にできます。
- JSON API を使用して、条件付きバケットに対して getIamPolicyとsetIamPolicyを呼び出す場合は、IAM ポリシーのバージョンを 3 に設定する必要があります。
- storage.objects.list権限はバケットレベルで付与されるため、- resource.name条件属性を使用してバケット内のオブジェクトがサブセットにアクセスすることを制限することはできません。
- 期限切れの条件は、削除するまで IAM ポリシーに残ります。
Cloud Storage ツールでの使用
IAM の権限を XML API によって設定することはできませんが、IAM の権限を付与されたユーザーは XML API を使用でき、Cloud Storage へのアクセスのために他のあらゆるツールを使用することもできます。
さまざまな Cloud Storage ツールを使用した操作をユーザーに許可する IAM 権限については、Cloud Storage の IAM リファレンスをご覧ください。
次のステップ
- Cloud Storage で IAM を使用する方法を学習する。
- Cloud Storage の IAM 参照表を確認する。
- IAM の使用に関するベスト プラクティスについて確認する。
- すべての Google Cloudリソースの IAM ポリシーを管理する。