🐡

Cloud Storage Bucket Ip filtering について解説

2024/12/23に公開

こんにちは、クラウドエース株式会社 第一開発部の阿部です。
今回は Cloud Storage Bucket IP filtering について解説します。
Jagu'e'r Advent Calendar 2024 の 9 日目の記事としても投稿しています。(開いていたので投稿してみました。)

Cloud Storage とは (おさらい)

Cloud Storage は、Google Cloud のオブジェクトストレージサービスであり、様々なファイル(非構造化データなど)を保存するためのサービスです。
弊社エンジニアによる入門者向けのブログ記事がありますので、詳細は下記のブログ記事をご覧ください。

https://zenn.dev/cloud_ace/articles/what-is-google-cloud-storage

Cloud Storage IP filtering list とは

Cloud Storage Bucket IP filtering (以降、Bucket IP filtering) は、Cloud Storage のバケットに対して、特定の IP アドレスからのアクセスのみを許可するリストを設定し、アクセス制御を行う機能です。
この機能は、 2024 年 11 月 14 日に Public Preview としてリリースされました。

これまでのアクセス制御

これまでの Cloud Storage では、バケットに対してアクセス制御を行うために、以下の方法がありました。

  • IAM ポリシーによるアクセス制御
  • VPC Service Controls によるサービス境界のアクセス制御

IAM ポリシーによるアクセス制御は、ユーザーやサービスアカウントに対して、バケットに対するアクセス権限を設定する方法です。
VPC Service Controls は、 プロジェクト毎の Google Cloud API に対してサービス境界を設定し、 IP アドレスなどのネットワーク境界に基づいてアクセス制御を行う方法です。
一見、VPC Service Controls によるネットワーク境界設定は Bucket IP filtering の動作と似ているように見えます。
しかし、VPC Service Controls はバケットに対するアクセス制御ではなく、Google Cloud API に対するアクセス制御であり、設定単位はプロジェクトです。
そのため、あるバケットに対してのみネットワーク境界のアクセス制御を行いたい場合は、そのバケットを別のプロジェクトに移動する必要がありました。

VPC Service Controls

Bucket IP filtering のメリット

Bucket IP filtering は、個々のバケットに対して特定の IP アドレス範囲からのアクセスのみを許可するリストを設定することができます。
また、 VPC ネットワークを設定でき、特定の VPC ネットワークからのアクセスを許可することも可能です。

これにより、特定のバケットに対して、IAM によるアクセス制御だけでなくネットワーク境界ベースのアクセスを許可することができ、セキュリティを向上させることができます。
Bucket IP filtering は VPC Service Controls にあるプロジェクト単位での制約がなく、バケット単位での IP アドレスベースのアクセス制御を設定できます。

Bucket IP filtering

Bucket IP filtering の設定方法

Bucket IP filtering は Public Preview 段階のため、 Google Cloud コンソールからの設定はできず、 gcloud CLI、または、 REST API を使用する必要があります。
ここでは、 gcloud CLI を使った手順を紹介します。

IP filtering リストの作成

まず、 IP filtering リストとして、JSON ファイルを作成します。
公式ドキュメントの手順にあるスキーマサンプルだとうまく設定できず、検証したところ以下のようなスキーマで作成できました。

{
  "mode": "Enabled",
  "publicNetworkSource": ["RANGE_CIDR", "..."],
  "vpcNetworkSources": [
    {
      "network": "projects/PROJECT_ID/global/networks/NETWORK_NAME",
      "allowedIpCidrRanges": ["RANGE_CIDR", "..."]
    }
  ]
}
  • RANGE_CIDR はアクセスを許可する IP アドレス範囲を指定します。
  • PROJECT_ID は内部通信を許可する VPC ネットワークのプロジェクト ID を指定します。
  • NETWORK_NAME は内部通信を許可する VPC ネットワークの名前を指定します。

publicNetworkSourcevpcNetworkSources はどちらか一方を設定すればよく、両方を設定する必要はありません。 (両方設定してもよいです。)
なお、 vpcNetworkSourcesallowedIpCidrRanges は省略できません。もし、 network に指定した VPC ネットワークの全ての IP アドレスからのアクセスを許可したい場合は、 0.0.0.0/0 のような任意のアドレス範囲を指定します。

Bucket IP filtering を有効化した GCS バケットの作成

バケット作成時のオプションに --ip-filter-file=IP_FILTER_FILE を指定することで、 Bucket IP filtering を有効化したバケットを作成できます。
以下はコマンド実行例です。

gcloud alpha storage buckets create gs://BUCKET_NAME --location LOCATION --ip-filter-file=IP_FILTER_FILE

なお、現時点(gcloud CLI v504)では、 gcloud alpha のコマンドグループでのみ実行可能です。

既存の GCS バケットに Bucket IP filtering を設定する

既存のバケットに Bucket IP filtering を設定する場合は、以下のコマンドを実行します。

gcloud alpha storage buckets update gs://BUCKET_NAME --ip-filter-file=IP_FILTER_FILE

Bucket IP filtering の無効化を設定する

--clear-ip-filter オプションを指定して gcloud alpha storage buckets update コマンドを実行することで、 Bucket IP filtering を無効化できます。

gcloud alpha storage buckets update gs://BUCKET_NAME --clear-ip-filter

Bucket IP filtering の動作確認

実際に、 Bucket IP filtering が有効になっているバケットに対して、設定した IP アドレス範囲以外からのアクセスを試みると、以下のようなエラーメッセージが表示されます。

ERROR: [USER_PRINCIPAL] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): There is an IP filtering condition that is preventing access to the resource. This command is authenticated as USER_PRINCIPAL which is the active account specified by the [core/account] property.

[USER_PRINCIPAL] はアクセスの際に使用した Email 形式のアカウント、 [BUCKET_NAME] はアクセスしようとしたバケット名です。

Bucket IP filtering の注意点

Bucket IP filtering は強いアクセス制御を提供する機能であるため、例えプロジェクトオーナーのロールを付与したアカウントであっても、 IP filtering リストに記載されていない IP アドレスからのアクセスは拒否されます。
これは、オブジェクトの操作だけでなく、バケットの操作にも適用されます。

そのため、IP filtering リストに誤った設定を行うと、バケットへのアクセスが拒否されてしまい、設定ミスの復旧も含め操作不能になる可能性があります。
こうした設定ミスが発生した場合は、後述するバイパスロールによる復旧方法を使用します。

バイパスロールによる復旧方法 (Bypass IP filtering)

前述の設定ミス等で IP filtering された GCS バケットにアクセスできなくなった場合の復旧方法として、バイパスロールを使用できます。
バイパスロールは事前定義ロールとして用意されておらず、カスタムロールとして別途作成する必要があります。

公式ドキュメントの手順がやや分かりづらいですが、以下のような手順でバイパスロールを使用できます。

バイパスパーミッションを含むカスタムロールの作成と設定手順

カスタムロール自体は Google Cloud コンソール、gcloud CLI のどちらでも作成可能ですが、ここでは gcloud CLI を使用した手順を紹介します。

まず、カスタムロール設定用の YAML ファイルを作成します。
このとき、カスタムロールのパーミッションに storage.buckets.exemptFromIpFilter が含まれるようにします。
例として、以下のような YAML ファイルを作成します。

title: Bypass Cloud Storage IP filter
description: Bypass Cloud Storage IP filter
stage: GA
includedPermissions:
  - storage.buckets.exemptFromIpFilter

titledescription は任意の値を設定して問題ありません。

次に、以下のコマンドを実行してカスタムロールを作成します。

gcloud iam roles create CUSTOM_ROLE_NAME --project=PROJECT_ID \
    --file=CUSTOM_ROLE_YAML_FILE

CUSTOM_ROLE_NAME はカスタムロールの名前、 PROJECT_ID はプロジェクト ID、 CUSTOM_ROLE_YAML_FILE は先ほど作成した YAML ファイルのパスです。

以降は例として、 CUSTOM_ROLE_NAMEstorage.bypassIpFilter を指定して作成します。

最後に、カスタムロールをプロジェクト IAM に付与するコマンドを実行します。

gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:USER_PRINCIPAL" \
  --role="projects/PROJECT_ID/roles/storage.bypassIpFilter"

この手順で、バイパスロールを使用して IP filtering された GCS バケットにアクセスできるようになります。

バイパスロール使用時の注意点

この手順で作成したバイパスロールは、 IP filtering された GCS バケットに対してアクセスできる権限を持つため、設定ミスの復旧が終わったら、バイパスロールを削除することをおすすめします。
(IAM conditions や、 PAM といった機能を使用してバイパスロールの使用を限定的にすることもおすすめです。)

なお、バイパスロールを設定しても、 IP filtering された GCS バケットに対してオブジェクトの操作は実行できません。
あくまで、バイパスロールでアクセス許可される対象は IP filtering された GCS バケット自体の設定変更のみです。

まとめ

Cloud Storage の Bucket IP filtering について解説しました。
GCS バケットに IP アドレスベースのアクセス制限を設定したいが、VPC Service Controls だと大げさなケースでは、この IP filtering リストが有効だと思います。
まだ Preview 段階の機能ですが、コンソールからの操作など、今後のリリースに期待です。

この記事が、Cloud Storage をお使いの方の参考になれば幸いです。

Discussion