Cloud Storage バケットの公開アクセス権限の確認

Cloud Storage の公開権限を確認し、バケットとオブジェクトへのアクセスを必要な範囲に制限します。

説明

Cloud Storage の allUsers には匿名ユーザーが含まれ、allAuthenticatedUsers には特定の組織に限らない幅広い認証済みアカウントが含まれます。これらに権限を付与すると、意図した利用者以外もバケットやオブジェクトにアクセスできる場合があります。許可される操作は、付与したロールと適用されるアクセス制御によって異なります。

ACL 設定の省略だけでは、公開アクセスとは判断できません。初期のデフォルト ACL はプロジェクト内のアクセスを想定した設定であり、IAM でも別途権限を付与できます。均一なバケットレベルのアクセス(uniform bucket-level access)では、ACL による認可が無効になります。公開アクセスの防止(public access prevention)は、公開アクセス主体に付与された権限の効力を制限します。

想定される影響

  • オブジェクトに公開読み取り権限があると、データが漏えいするおそれがあります。バケットの READER 権限はオブジェクトの一覧取得などを許可しますが、それだけで全オブジェクトの内容を読み取れるわけではありません。
  • 公開アクセス主体にバケットへの書き込みも許可すると、オブジェクトの作成、置き換え、削除が可能になる場合があります。実際に付与されている権限を確認する必要があります。
  • デフォルトのオブジェクト ACL にある公開権限は、その ACL が適用される新しいオブジェクトにも影響する場合があります。デフォルトを変更しても既存のオブジェクトの ACL は変わらないため、別途確認が必要です。

対処方法

  • バケット ACL、オブジェクト ACL、デフォルトのオブジェクト ACL、IAM から、不要な allUsers または allAuthenticatedUsers への権限を削除してください。必要なユーザー、グループ、サービスアカウントにだけ、必要な操作を許可してください。
  • 採用するアクセス制御方式に合わせて設定してください。均一なバケットレベルのアクセスを使用している場合は、ACL に依存せず IAM で権限を管理してください。
  • 公開アクセスが不要なら、公開アクセスの防止を検討してください。適用前に公開コンテンツを必要とするサービスがないか確認し、変更後は既存のオブジェクトの権限とアプリケーションの正常なアクセスを確認してください。

ACL の設定例

以下は権限の付与先を比較するための抜粋であり、完全な構成ではありません。Ansible google.cloud 1.14.0 は ACL を辞書のリストで、各項目の bucket を参照用の辞書で受け取りますが、例ではオブジェクトと文字列を使っています。ACL の bucket 参照もモジュールの name で指定するバケット名と異なり、一部の項目には role がありません。適用前に形式と参照を修正し、必要なロールを指定してください。

公開アクセス主体

yaml
- name: create a bucket1
  google.cloud.gcp_storage_bucket:
    name: ansible-storage-module1
    project: test_project
    auth_kind: serviceaccount
    service_account_file: "/tmp/auth.pem"
    state: present
    default_object_acl:
      bucket: bucketName1
      entity: allUsers
      role: READER

- name: create a bucket2
  google.cloud.gcp_storage_bucket:
    name: ansible-storage-module2
    project: test_project
    auth_kind: serviceaccount
    service_account_file: "/tmp/auth.pem"
    state: present
    acl:
      bucket: bucketName2
      entity: allAuthenticatedUsers

グループへの権限付与

yaml
- name: create a bucket
  google.cloud.gcp_storage_bucket:
    name: ansible-storage-module
    project: test_project
    auth_kind: serviceaccount
    service_account_file: /tmp/auth.pem
    state: present
    acl:
      bucket: bucketName
      entity: group-example@googlegroups.com

補足:

  • 公開アクセス主体: 最初のタスクは新しいオブジェクトに適用するデフォルト ACL に allUsers を指定し、二つ目はバケット ACL に allAuthenticatedUsers を指定しています。対象のリソースと付与するロールを合わせて確認してください。
  • グループへの権限付与: group-example@googlegroups.com はグループを指定しています。メンバーを確認し、必要なロールだけを付与してください。グループを指定しても、ほかの ACL や IAM から付与された公開権限は削除されません。

参考資料