G-genの福井です。Cloud Storage バケットへのアクセスを送信元 IP アドレスに基づいて制御する IP フィルタリング機能の概要と設定方法、そして VPC Service Controls との違いについて解説します。

はじめに
Cloud Storage は、高い耐久性とスケーラビリティを持つオブジェクトストレージサービスであり、その用途は多岐にわたります。様々なネットワーク環境からアクセスが可能であるため、意図しないリクエストを防ぐためのアクセス制御が重要です。
Google Cloud は IAM や VPC Service Controls といった多様なセキュリティ機能を提供しています。その中でも、送信元のパブリック IP アドレスに基づいてアクセスをシンプルに制御したい、という要件に応えるのが当記事で解説する IP アドレスフィルタリング機能です。
当記事では、IP アドレスフィルタリング機能の概要から、類似機能である VPC Service Controls との違い、使用上の注意点、そして具体的な設定手順までを解説します。
Cloud Storage の IP フィルタリングとは
機能の概要
Cloud Storage の IP フィルタリングは、バケットへのアクセスを送信元の IP アドレスに基づいて制御する機能です。
この機能を有効にすると、許可設定した IP アドレスからのリクエストのみが許可されます。許可設定していない IP アドレスからのリクエストは、ステータスコード 403 Forbidden で拒否されます。
このフィルタリングは、バケット単位で設定し、そのバケット内の全オブジェクトに適用されます。制御できるアクセス元は以下の通りです。
| アクセス元の種類 | 説明 |
|---|---|
| パブリック IP | インターネット経由でのアクセスを、送信元のグローバル IP アドレスで制御します。 |
| VPC ネットワーク | VPC ネットワーク内からのアクセスを、その VPC ネットワークで予約された IP アドレスで制御します。 |
この機能の重要な点は、Cloud Storage の認証システムの前に評価されることです。つまり、たとえ有効な認証情報を持っていたとしても、許可されていない IP アドレスからのリクエストはバケットに到達する前にブロックされます。
- 参考 : IP アドレス フィルタリングの概要
ユースケース
この機能は、特定のネットワーク環境からのアクセスのみに制限したい場合に有効です。
| ユースケース | 説明 |
|---|---|
| 特定の拠点からのアクセス制限 | 本社や支社のオフィス、あるいは特定のデータセンターの固定 IP アドレスからのみ、バケットへのアクセスを許可したい場合に使用します。 |
| 特定のアプリケーション環境からのアクセス制限 | Google Cloud の VPC ネットワーク内で稼働するアプリケーションからのアクセスのみに限定したい場合に使用します。これにより、意図しない他のリソースからのアクセスをネットワークレベルで防ぐことができます。 |
| 多層的なセキュリティの実現 | IAM による認証・認可に加え、ネットワークレベルでのアクセス制御を組み合わせることで、認証情報が万が一漏洩した際の情報流出リスクを低減し、より強固なセキュリティを実現します。 |
VPC Service Controls との違い
Cloud Storage へのアクセスをネットワークレベルで制御する機能として、IP アドレスフィルタリングの他に VPC Service Controls があります。両者は似ているようで、その目的と機能は大きく異なります。
機能比較
| 特徴 | IP アドレスフィルタリング | VPC Service Controls |
|---|---|---|
| 目的 | 送信元 IP に基づくシンプルなアクセス制御 | サービス境界(Perimeter)を作成し、境界の外から中へのアクセスを防いだり、逆に境界の中から外へのデータ流出等を防ぐ |
| 適用範囲 | Cloud Storage のバケット単位 | 単一または複数のプロジェクトをサービス境界に含めることが可能。組織レベルでのデータガバナンスを実現する |
| 主な制御要素 | 送信元のパブリック IP または VPC | 送信元のネットワークロケーション(VPC, オンプレミス)、ID、デバイスなど、複数のコンテキスト |
| 設定の複雑さ | シンプル。許可したい IP のリストを定義するのみ | 高度。サービス境界、アクセスレベル、ブリッジなどの設計が必要 |
使い分けのポイント
どちらの機能を選択するかは、セキュリティ要件によって決まります。
| セキュリティ要件 | 推奨される機能 |
|---|---|
| 「特定のオフィスの固定 IP からのみアクセスさせたい」など、要件がシンプルな場合 | IP アドレスフィルタリング |
| IP アドレスだけでなく、ユーザー ID やデバイス情報なども含めた多角的なアクセス制御が必要な場合 | VPC Service Controls |
| Cloud Storage だけでなく、BigQuery など他のサービスも含めて、組織としてデータ持ち出しを厳密に防ぎたい場合 | VPC Service Controls |
基本的には、特定の IP アドレスからのアクセスをシンプルに制限したい場合は IP アドレスフィルタリングを、より広範で強力なデータ保護境界を構築したい場合は VPC Service Controls を選択します。
制限事項
IP アドレスフィルタリング機能には、使用する上で制限があります。
| 制限事項 | 内容 |
|---|---|
| 許可される IP CIDR ブロックの最大数 | パブリックネットワークと VPC ネットワークを合わせて、最大 200 個の IP CIDR ブロックを指定できます。 |
| 許可される VPC ネットワークの最大数 | 最大 25 個 の VPC ネットワークを指定できます。 |
| リージョンエンドポイントのサポート | リージョンエンドポイントは、Private Service Connect を使用する場合にのみサポートされます。 |
| 一部 Google Cloud サービスとの連携 | BigQuery のように、データのインポート/エクスポートで Cloud Storage を使用するサービスからのアクセスが制限されます。サービスの中断を避けるため、これらのサービスがアクセスするバケットでは IP フィルタリングの使用は推奨されません。 |
| App Engine からのアプリケーション | App Engine アプリケーションが Cloud Storage のデータにアクセスする場合は、VPC を介して使用することが推奨されます。 |
| Cloud Shell のサポート | Cloud Shell からのアクセスはサポートされていません。 |
- 参考 : 制限事項
設定方法
ここからは、実際に IP アドレスフィルタリング機能を設定する手順を解説します。
2025年7月現在、Google Cloud コンソールからの設定には対応していません。
当記事では gcloud コマンドを使った手順を紹介します。
前提条件
IP フィルタリングの設定には、Google Cloud CLI バージョン 526.0.0 以降が必要です。古いバージョンの CLI を使用して、IP フィルタリングの設定を行うと、以下のエラーが発生します。
Found invalid JSON/YAML for the IP filter rule.
エラーが発生した場合は、以下のコマンドでバージョンを確認し、必要に応じて更新してください。
# バージョン確認 gcloud version | head -n1 # バージョン更新 gcloud components update --version=526.0.0
必要な権限
IP アドレスフィルタリングの設定には、以下のIAM権限が必要です。
| 操作 | 権限 |
|---|---|
| IP フィルタリング ルールを使用してバケットを作成 | storage.buckets.create storage.buckets.setIpFilter |
| バケットの IP フィルタリング ルールを更新 | storage.buckets.update storage.buckets.setIpFilter |
| バケットの IP フィルタリング ルールを取得 | storage.buckets.get storage.buckets.getIpFilter |
| バケット IP フィルタリングを無効 | storage.buckets.update storage.buckets.setIpFilter |
これらの権限を取得する最も簡単な方法は、対象プロジェクトまたはバケットに対して ストレージ管理者(roles/storage.admin)のロールを付与することです。この事前定義ロールには、上記の権限が含まれています。また、これらの権限を持つカスタムロールを個別に作成することも可能です。
IP フィルタリング設定用 JSON
IP フィルタリングの設定は、バケットの新規作成時、または既存のバケットに対して行います。いずれのシナリオでも、設定内容を記述した JSON ファイルをコマンドで読み込ませて設定します。
特定のパブリック IP 範囲
指定したパブリック IPv4 アドレス範囲からのアクセスを許可し、VPC からのアクセスをブロックする設定です。
{ "mode": "Enabled", "publicNetworkSource": { "allowedIpCidrRanges": ["192.0.2.0/24"] }, "allowCrossOrgVpcs": false, "allowAllServiceAgentAccess": false }
特定の VPC ネットワーク範囲
指定した VPC の IPv4 アドレスからのアクセスを許可し、パブリック IP からのアクセスをブロックする設定です。
{ "mode": "Enabled", "vpcNetworkSources": [ { "network": "projects/[PROJECT_ID]/global/networks/[NETWORK_NAME]", "allowedIpCidrRanges": ["192.0.2.0/24"] }, ], "allowCrossOrgVpcs": false, "allowAllServiceAgentAccess": false }
設定項目の解説
| 項目 | 説明 |
|---|---|
| mode | フィルタリングのモードを指定します。Enabled : IP フィルタリングを有効にし、設定されたルールに基づいてリクエストを評価します。Disabled : フィルタリングを無効にし、すべてのリクエストを許可します(ルールは保持されます)。 |
| publicNetworkSource | パブリック IP アドレスからのアクセスに関するルールを定義するオブジェクトです。 |
| allowedIpCidrRanges | バケットへのアクセスを許可するパブリックな IPv4 または IPv6 の CIDR 範囲のリストです。(例: ["192.0.2.0/24", "2001:db8::/32"]) |
| vpcNetworkSources | VPC ネットワークからのアクセスに関するルールを定義するオブジェクトのリストです。 |
| network | VPC ネットワークの名前です。PROJECT_ID は、VPC ネットワークが存在するプロジェクト IDNETWORK_NAME は、バケットへのアクセスを許可する VPC ネットワークの名前 |
| allowCrossOrgVpcs | 組織(Organization)をまたいだ VPC ネットワークからのアクセスを許可するかどうかを指定します。true : 組織をまたいだアクセスを許可します。false : バケットと同じ組織内の VPC に限定します。(デフォルト) |
| allowAllServiceAgentAccess | Google Cloud のサービスエージェントからのアクセスを、IP フィルタリングの設定に関わらずすべて許可するかどうかを指定します。true : 他の Google Cloud サービスがサービスエージェントを使ってバケットにアクセスすることを許可します。false : 許可しません。 |
バケット作成時にフィルタリング設定
gcloud alpha storage buckets create gs://[BUCKET_NAME] --ip-filter-file=[IP_FILTER_CONFIG_FILE]
BUCKET_NAMEには新規に作成するバケット名、IP_FILTER_CONFIG_FILEにはIPフィルタリング設定用JSONのファイルパスを指定します。
既存バケットにフィルタリング設定
gcloud alpha storage buckets update gs://[BUCKET_NAME] --ip-filter-file=[IP_FILTER_CONFIG_FILE]
BUCKET_NAMEには IP フィルタリングを設定するバケット名、IP_FILTER_CONFIG_FILEにはIPフィルタリング設定用JSONのファイルパスを指定します。
フィルタリング ルールを取得
gcloud alpha storage buckets describe gs://[BUCKET_NAME] --format="default(ip_filter_config)"
BUCKET_NAMEには IP フィルタリングを取得するバケット名を指定します。
フィルタリング ルールを無効化
gcloud alpha storage buckets update gs://[BUCKET_NAME] --clear-ip-filter
BUCKET_NAMEには IP フィルタリングを無効にするバケット名を指定します。
IPフィルタリングのバイパス設定
概要
Cloud Storage の IP アドレスフィルタリングにおいてバイパス設定を行うと、特定の IAM プリンシパル(ユーザー、サービスアカウントなど)は、送信元 IP アドレスに関わらず、バケットの作成、削除、構成に関する IP フィルタリング制限の対象から除外されます。
ユースケース
| ユースケース | 説明 |
|---|---|
| バケット ロックアウト | IP フィルタリングの設定を誤って追加し、バケットにアクセスできなくなった場合 |
| 予期しない IP 変更 | ネットワークの変更により IP アドレスが予期せず変更され、ロックアウトされた場合 |
設定方法
IAM 権限 storage.buckets.exemptFromIpFilter をプリンシパルに付与します。この権限はカスタムロールを使用して権限を付与します。
カスタムロールの作成
gcloud iam roles create ip_filter_bypasser \ --project=[PROJECT_ID] \ --title="Custom IP Filter Bypasser" \ --description="Cloud Storage IPフィルタリングをバイパスする" \ --permissions=storage.buckets.exemptFromIpFilter
PROJECT_ID には、Google Cloud プロジェクト ID を指定します。
IAM ポリシーへのバインディング
作成したカスタムロールを対象のプリンシパル(この例ではユーザーアカウント)に付与します。
gcloud projects add-iam-policy-binding [PROJECT_ID] \ --member="user:[USER_EMAIL]" \ --role="projects/[PROJECT_ID]/roles/ip_filter_bypasser"
PROJECT_ID には、Google Cloud プロジェクト ID、USER_EMAIL には、カスタムロールを付与するユーザーのメールアドレスを指定します。
運用の注意点
storage.buckets.exemptFromIpFilter 権限は非常に強力です。この権限を持つプリンシパルの認証情報が漏洩した場合、IP フィルタリングによる保護が無効化されてしまいます。
使用にあたっては最小権限の原則を遵守し、本当に必要なプリンシパルにのみ、必要最小限の期間だけ付与するようにしてください。恒久的な権限としてではなく、Privileged Access Manager(PAM) を使用して、期間限定で付与する運用が理想的です。
福井 達也(記事一覧)
カスタマーサクセス課 エンジニア
2024年2月 G-gen JOIN
元はアプリケーションエンジニア(インフラはAWS)として、PM/PL・上流工程を担当。G-genのGoogle Cloudへの熱量、Google Cloudの魅力を味わいながら日々精進
