現代では、データがネットワークやシステムの間を妨げなく行き交っています。だからこそ、機密情報を守るための強固なセキュリティ対策が欠かせません。インバウンドトラフィックのフィルタリングは注目されがちですが、egressフィルタリングの重要性も見過ごせません。egressフィルタリングを導入すれば、アウトバウンド通信を制御し、許可された安全な接続のみを成立させられます。
egressフィルタリングの代表的な手法のひとつが、Fully Qualified Domain Name(FQDN)によるフィルタリングです。ドメイン名単位でアウトバウンドトラフィックをきめ細かく制御でき、Google Cloud Platform(GCP)のFirewall Policyと組み合わせれば、ネットワークのegressポイントに対して高いセキュリティと管理性を実現できます。
本記事では、ファイアウォールポリシールール内のFQDNオブジェクトを使い、GCPでFQDN egressフィルタリングを構築する手順を紹介します。Firewall PolicyはCloud Firewallに含まれる独立した機能で、VPCファイアウォールルールと比べて多彩な機能を備えています。
なお、ファイアウォールポリシールール内のFQDNオブジェクト機能は現在プレビュー段階で、GCPサポートによるSLAや技術サポートのコミットメントは提供されません。
Firewall Policyとは
Google Cloud Platform(GCP)のFirewall Policyは、仮想マシン(VM)インスタンスやVPC(Virtual Private Cloud)ネットワークに対し、ファイアウォールルールを一元的に定義・適用できるネットワークセキュリティ機能です。
ネットワークトラフィックを統一的かつスケーラブルに管理でき、インバウンド/アウトバウンド通信の制御や条件に基づくフィルタリングを通じて、セキュリティ全体を底上げします。
Firewall Policyでは、IPレンジ、ポート、プロトコル、さらにはFully Qualified Domain Name(FQDN)など、さまざまな要素を組み合わせて許可・拒否ルールを細かく定義できます。これにより、強固なネットワーク境界を築き、不正アクセスや悪意ある活動からクラウドリソースを守れます。
GCP Firewall Policyの主な機能とメリットは次のとおりです。
- 一元管理:複数のプロジェクト、リージョン、VPCネットワークにまたがるファイアウォールルールを単一のインターフェースから管理・設定でき、ネットワークセキュリティポリシーの運用が大幅に簡素化されます。
- 柔軟なルール定義:Cloud Firewall PolicyはIPアドレス、レンジ、ポート、プロトコル、FQDNを基準にルールを定義できます。インバウンド・アウトバウンドの双方を細かく制御し、用途に最適化されたセキュリティポリシーを設計可能です。
- 動的な更新:既存トラフィックを止めずにルールをリアルタイムで変更でき、変化するセキュリティ要件にも素早く対応できます。
- Google Cloudサービスとの統合:VPCネットワーク、ロードバランサー、VMインスタンスなど他のGoogle Cloudサービスとシームレスに連携し、インフラ全体に一貫したセキュリティ制御を適用できます。
- ロギングとモニタリング:詳細なログとモニタリング機能を備え、ネットワークトラフィックの可視化、セキュリティイベントの分析、トラブルシューティングを効率的に行えます。
リファレンスアーキテクチャ

サンプル構成
リファレンスアーキテクチャの実装ステップ
- Private Google Accessのセットアップ
- インターネットアクセス用のCloud NAT
- ファイアウォールポリシールールのセットアップ
Private Google Accessのセットアップ
Private Google Accessを使うと、Virtual Private Cloud(VPC)ネットワーク内のリソースが、外部インターネットに接続せずプライベートIPアドレスのみでGoogleサービスにアクセスできます。
あわせて、Google APIへのリクエストがGoogle Cloud内のみでルーティングされるよう、private.googleapis.comまたはrestricted.googleapis.comドメインでPrivate Google Accessを設定します。
Private Google Accessはサブネット単位で有効化します。既存サブネットで有効にし、変数を更新してください。
gcloud config set project $PROJECT_ID
gcloud compute networks subnets update $SUBNET_NAME \
--region=$REGION \
--enable-private-ip-google-access

本構成では、private.googleapis.com用のCloud DNSゾーンを作成します。VPC Service Controlを利用している場合はrestricted.googleapis.comを指定してください。詳しくはドメインオプションを参照してください。
googleapis.comのプライベートDNSゾーンを作成します。
gcloud dns managed-zones create googleapis-com \
--dns-name=googleapis.com. \
--description="googleapis-com domain for PGA" \
--visibility=private \
--networks=$NETWORK_NAME

続いて、private.googleapis.com用に、199.36.153.8、199.36.153.9、199.36.153.10、199.36.153.11を指すAレコードを作成します。
gcloud dns record-sets create "private.googleapis.com." \
--type="A" \
--ttl="300" \
--rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11" \
--zone="googleapis-com"
さらに、*.googleapis.comから先ほど設定したprivate.googleapis.comを指すCNAMEレコードを作成します。
gcloud dns record-sets create "*.googleapis.com." \
--type="CNAME" \
--ttl="300" \
--rrdatas="private.googleapis.com." \
--zone="googleapis-com"

一部のGoogle APIやサービスは、*.gcr.io、*.gstatic.com、*.pkg.dev、pki.googといった追加のドメイン名で提供されます。
これらの追加ドメインのサービスをprivate.googleapis.comまたはrestricted.googleapis.com経由で利用できるかは、ドメインオプション内のドメインとIPアドレス範囲の表で確認してください。たとえばGoogle Kubernetes Engine(GKE)を利用する場合は、Cloud DNSで*.gcr.ioや*.pkg.devのプライベートゾーンも追加で構成する必要があります。
Cloud NATのセットアップ
Cloud NATは分散型のソフトウェア定義マネージドサービスで、外部IPアドレスを持たないリソースからインターネットへのアウトバウンド接続を可能にします。アウトバウンドトラフィックを制御するには、デフォルトのインターネットゲートウェイではなくCloud NATの利用が推奨されます。
必要なリージョンにCloud Routerを作成します。
gcloud compute routers create cloud-firewall-policy-demo-cloud-nat \
--network=$NETWORK_NAME \
--region=$REGION
続いてCloud NATゲートウェイを作成します。
gcloud compute routers nats create cloud-firewall-policy-demo-cloud-nat \
--router=cloud-firewall-policy-demo-cloud-nat \
--region=$REGION \
--auto-allocate-nat-external-ips \
--nat-all-subnet-ip-ranges

Cloud NATの構成例
ファイアウォールポリシールールのセットアップ
ファイアウォールポリシーには3つの種類があります。
- 階層型ファイアウォールポリシー:組織全体に一貫したファイアウォールポリシーを作成・適用できます。組織全体、または個別のフォルダに割り当てられます。
- グローバルネットワークファイアウォールポリシー:すべてのファイアウォールルールを単一のポリシーオブジェクトにまとめて一括更新でき、ルールはすべてのリージョンに適用されます。
- リージョナルネットワークファイアウォールポリシー:VPCネットワーク内の特定リージョン内のすべてのサブネットに対し、一貫したファイアウォールポリシーを作成・適用できます。
本構成ではグローバルネットワークファイアウォールポリシーを作成します。
gcloud compute network-firewall-policies create global-demo-firewall-policy \
--global
作成したファイアウォールポリシーと対象ネットワークを関連付けます。
gcloud compute network-firewall-policies associations create \
--firewall-policy=global-demo-firewall-policy \
--network=$NETWORK_NAME --global-firewall-policy

デフォルトのファイアウォールルールはポリシーに含まれます

ポリシーへのネットワーク関連付け
これで、ファイアウォールポリシールール内のFQDNオブジェクトを用いてFQDN egressフィルタリングを実施するためのリソースが揃いました。次は、ポリシーに必要なルールを追加していきます。
現時点ではegressトラフィックに制限がなく、ネットワーク内のインスタンスは制限なくインターネットにアクセスできます。


本構成では、www.example.comとprivate.googleapis.comに割り当てられたパブリックIPアドレスへのアウトバウンド通信のみを許可し、それ以外のインターネットトラフィックはブロックします。
まずデフォルトのingress許可ルールを作成します。インバウンドアクセスは制限なく許可されますが、要件に応じてカスタマイズしてください。
gcloud compute network-firewall-policies rules create 1001 \
--firewall-policy="global-demo-firewall-policy" \
--action="allow" \
--direction="INGRESS" \
--description="Allow ingress traffic" \
--src-ip-ranges="0.0.0.0/0" \
--layer4-configs="all" \
--global-firewall-policy
次に、プライベートIPレンジとの通信を許可するファイアウォールルールを作成します。インスタンス間通信に支障が出ないよう、環境内で利用しているカスタムプライベートレンジもあわせて許可してください。
gcloud compute network-firewall-policies rules create 999 \
--firewall-policy="global-demo-firewall-policy" -\
-action="allow" \
--direction="EGRESS" \
--description="Allow communication with private IP ranges" \
--dest-ip-ranges="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16" \
--layer4-configs="all" \
--global-firewall-policy
続いて、private.googleapis.comのパブリックIPへのアウトバウンドリクエストを許可するルールを作成します。これらのIPはGoogle Cloud内でのみルーティング可能です。
gcloud compute network-firewall-policies rules create 998 \
--firewall-policy="global-demo-firewall-policy" \
--action="allow" \
--direction="EGRESS" \
--description="Allow DNS resolution requests to private.googleapis.com" \
--dest-ip-ranges="199.36.153.8/32,199.36.153.9/32,199.36.153.10/32,199.36.153.11/32" \
--layer4-configs="tcp:443" \
--global-firewall-policy
さらに、www.example.comへのアウトバウンドリクエストを許可するルールを作成します。
gcloud compute network-firewall-policies rules create 997 \
--firewall-policy="global-demo-firewall-policy" \
--action="allow" \
--direction="EGRESS" \
--description="FQDN egress filtering rules" \
--dest-fqdns="www.example.com" \
--layer4-configs="tcp:80,tcp:443" \
--global-firewall-policy
最後にデフォルトのegress拒否ルールを作成します。拒否ルールを作成する前に、必要なドメインとIPレンジに対する許可ルールがすべて揃っていることを必ず確認してください。
gcloud compute network-firewall-policies rules create 1000 \
--firewall-policy="global-demo-firewall-policy" \
--action="deny" \
--direction="EGRESS" \
--description="Deny all Egress traffic" \
--dest-ip-ranges="0.0.0.0/0" \
--layer4-configs="all" \
--global-firewall-policy
ファイアウォールポリシールールの一覧(集約後)。

ルールが反映されるまで最大30秒ほどかかる場合があります。GCEインスタンスやGKE Podからネットワーク接続をテストしてください。アウトバウンドリクエストは、ファイアウォールポリシールールで指定したドメインとIPレンジ宛てのみ許可されます。

ファイアウォールポリシールール適用後のテスト結果
本記事では、ファイアウォールポリシールールでのegressフィルタリングにFQDNオブジェクトを活用する方法を紹介しました。この手法はネットワークセキュリティの強化と、egressポイントの制御に大いに役立ちます。
Firewall Policyの詳細は、製品ページをご参照ください。