下り(Egress)フィルタリングの代表的な手法のひとつが、完全修飾ドメイン名(FQDN)によるフィルタリングです。ドメイン名単位で送信トラフィックをきめ細かく制御できる、管理者にとって強力なアプローチです。

今や、データはネットワークやシステムの間を自由に行き交います。だからこそ、機密情報を守るための強固なセキュリティ対策が欠かせません。受信トラフィックのフィルタリングには注目が集まりがちですが、下り(Egress)フィルタリングの重要性も同じくらい見過ごせません。下りフィルタリングを行うことで、組織は送信側のネットワーク通信を統制し、許可された安全な接続のみが確立される状態を維持できます。
下りフィルタリングの代表的な手法のひとつが、完全修飾ドメイン名(FQDN)によるフィルタリングです。この方式なら、管理者はドメイン名単位で送信トラフィックを精密に制御できます。Google Cloud Platform(GCP)のFirewall Policyと組み合わせれば、ネットワークの下り(egress)ポイントを高い水準で保護・管理できます。
本記事では、ファイアウォールポリシールール内のFQDNオブジェクトを使って、GCPでFQDN下りフィルタリングを実装する手順を解説します。Firewall policyはCloud Firewallの独立した機能で、VPCファイアウォールルールと比べて多彩な機能を備えています。
なお、ファイアウォールポリシールール内のFQDNオブジェクト機能は現時点でプレビュー段階にあり、GCPサポートからSLAや技術サポートのコミットメントは提供されていません。
Firewall Policyとは
Google Cloud Platform(GCP)のFirewall Policyは、仮想マシン(VM)インスタンスやVPC(Virtual Private Cloud)ネットワークに対して、一元化されたファイアウォールルールを定義・適用できるネットワークセキュリティ機能です。
ネットワークトラフィックを統一的かつスケーラブルに管理する仕組みを提供し、受信・送信通信の制御、さまざまな条件に基づくトラフィックフィルタリング、全体的なセキュリティ強化を実現します。
Firewall Policyでは、IPレンジ、ポート、プロトコル、さらには完全修飾ドメイン名(FQDN)などをもとに、許可・拒否するトラフィックをきめ細かく指定するルールを定義できます。これにより、安全なネットワーク境界を構築し、不正アクセスや悪意ある活動からクラウドリソースを守ることができます。
GCP Firewall Policyの主な機能とメリットは次のとおりです。
- 一元管理: 複数のプロジェクト、リージョン、VPCネットワークにまたがるファイアウォールルールを単一のインターフェースから管理・設定でき、ネットワークセキュリティポリシーの運用がシンプルになります。
- 柔軟なルール定義: Cloud Firewall PolicyではIPアドレス、レンジ、ポート、プロトコル、FQDNに基づいてルールを定義できます。受信・送信トラフィックを細かく制御でき、要件に合わせて具体的なセキュリティポリシーを設計できます。
- 動的な更新: ファイアウォールルールをリアルタイムで変更できるため、既存のネットワークトラフィックを止めることなく、変化するセキュリティ要件に対応できます。
- Google Cloudサービスとの統合: Cloud Firewall PolicyはVPCネットワーク、ロードバランサー、VMインスタンスなど他のGoogle Cloudサービスとシームレスに連携し、インフラ全体で一貫したセキュリティ制御を実現します。
- ロギングとモニタリング: Cloud Firewall Policyは詳細なロギング・モニタリング機能を備え、ネットワークトラフィックの可視化、セキュリティイベントの分析、潜在的な問題のトラブルシューティングを支援します。
リファレンスアーキテクチャ

サンプル構成
リファレンスアーキテクチャの実装手順
- 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はサブネット単位で有効化します。既存のサブネットで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 Controlsを利用している場合は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に対するAレコードを作成し、次のIPアドレス(199.36.153.8、199.36.153.9、199.36.153.10、199.36.153.11)を指すように設定します。
gcloud dns record-sets create "private.googleapis.com." \<br>--type="A" \<br>--ttl="300" \<br>--rrdatas="199.36.153.8,199.36.153.9,199.36.153.10,199.36.153.11" \<br>--zone="googleapis-com"*.googleapis.com用のCNAMEレコードを作成し、先ほど設定したprivate.googleapis.comを指すようにします。
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)を利用している場合は、*.gcr.ioと*.pkg.devのプライベートゾーンもCloud DNSに追加で構成する必要があります。
Cloud NATのセットアップ
Cloud NATは分散型のソフトウェア定義マネージドサービスで、外部IPアドレスを持たないリソースからインターネットへの送信接続を可能にします。送信トラフィックを制御する用途では、デフォルトのインターネットゲートウェイではなくCloud NATの利用がおすすめです。
必要なリージョンにCloud Routerを作成します。
gcloud compute routers create cloud-firewall-policy-demo-cloud-nat \ --network=$NETWORK_NAME \ --region=$REGIONCloud 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
ファイアウォールポリシールールのセットアップ
ファイアウォールポリシーには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下りフィルタリングを適用するために必要なリソースがすべて揃いました。次は、ファイアウォールポリシーに必要なルールを追加していきます。
現時点では下りトラフィックに制限はかかっておらず、ネットワーク内のインスタンスは制限なくインターネットにアクセスできます。


本構成では、www.example.comとprivate.googleapis.comに割り当てられたパブリックIPアドレス宛ての送信トラフィックのみを許可し、それ以外のインターネットトラフィックはブロックします。
まず、デフォルトの受信許可ルールを作成します。受信アクセスは制限なく許可される設定ですが、要件に合わせてカスタマイズしてください。
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-policyprivate.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-policywww.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最後に、デフォルトの下り拒否ルールを作成します。拒否ルールを作成する前に、必要なドメインと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レンジに対してのみ許可されます。

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