Secure Web ProxyでVMからのWebアクセスを制御してみた

記事タイトルとURLをコピーする

G-gen の三浦です。当記事では、Secure Web Proxy を使って、Virtual Private Cloud (以下、VPC)上の Compute Engine VM からインターネットへ接続する際の Web アクセス制御の方法を紹介します。

Secure Web Proxy とは

Secure Web Proxy(以下、SWP)は、Google Cloud (旧称 GCP)が提供するフルマネージドの HTTP プロキシです。

HTTP プロキシとは、クライアントとサーバー間の HTTP 通信を仲介する中継機能のことであり、セキュリティや統制の強化に利用されます。

例えば、Google 翻訳(https://translate.google.com)へのアクセスは許可し、YouTube(https://youtube.com)へのアクセスはブロックするといったように、URL 単位やドメイン名単位でのアクセス制御が可能です。

SWP では、TLS インスペクション機能を利用することで、暗号化された HTTPS 通信でも URL パス単位で詳細なアクセス制御を行うことができます。以下は、その例です。

  • https://google.com/aaa へのアクセスは許可
  • https://google.com/bbb へのアクセスはブロック

このように、SWP を使用することで、業務に必要なサイトのみを許可し、不要なサイトへのアクセスを防ぐことで、セキュリティを強化できます。

検証内容の概要

構成図

今回は、以下の構成図の環境で検証を行いました。

検証の流れ

検証手順は以下のとおりです。

  1. SWP の初期構築:
    最初に、許可ルールを設定せずに SWP を構築します。

  2. Web アクセスと Windows Update のブロック確認:
    Compute Engine VM(Windows Server 2022 Datacenter)から SWP を通じて、Web アクセスを試みます。この時点では、Windows Update も含めた全てのアクセスがブロックされることを確認します。

  3. Windows Update 許可ルールの適用:
    Windows Update の URL のみを許可リストに追加し、そのルールを SWP に適用します。Google へのアクセスは引き続きブロックされる状態を維持します。

  4. Windows Update のアクセス許可確認:
    再度、Windows VM からアクセスを試行します。Windows Update が正常に実行できる一方、www.google.com へのアクセスが引き続きブロックされることを確認します。

SWP の初期構築

プロキシ専用サブネットの作成

SWP 用の専用サブネットを作成します。このサブネットは、SWP が外部ネットワークと通信するためのものです。/23 のサブネットマスクが推奨されています。

$ gcloud compute networks subnets create proxy-01 \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=asia-northeast1 \ # SWP を構築するリージョン
--network=test-vpc \ # SWP を構築する VPC
--range=192.168.0.0/23 # サブネット範囲

SSL/TLS 証明書の作成

次に、SWP を構築するリージョンに、SWP に設定するための SSL/TLS 証明書を作成します。本検証では Google Cloud が提供する Google マネージド証明書を使用します。Google マネージド証明書の作成方法は、以下の記事を参照してください。

Google マネージド SSL/TLS 証明書 blog.g-gen.co.jp

SWP のポリシーの設定

SWP に適用するセキュリティポリシーを作成します。このポリシーは、SWP を通じて行われるトラフィックの制御を定義します。以下の YAML ファイルを使用してポリシーを定義します。<PROJECT_ID> の部分は、自環境の Google Cloud プロジェクトの ID で置き換えてください。

# policy.yaml
description: "Secure Web Proxy policy" # ポリシーの説明
name: projects/<PROJECT_ID>/locations/asia-northeast1/gatewaySecurityPolicies/policy1 # プロジェクト ID を入力し、ポリシー名を指定

YAML ファイルが準備できたら、gcloud コマンドを使用してポリシーを設定します。

$ gcloud network-security gateway-security-policies import policy1 \
--source=policy.yaml \ # 前手順で作成した policy.yaml を指定
--location=asia-northeast1 # SWP を構築するリージョン名を指定

SWP インスタンスの設定

次に、SWP インスタンスの設定ファイルを準備します。このファイルには、SWP の待ち受けポートや IP アドレス、SSL/TLS 証明書、適用するポリシーなどを定義します。

# gateway.yaml
name: projects/<PROJECT_ID>/locations/asia-northeast1/gateways/swp1 # SWP インスタンスの名前を指定(例. swp1)
type: SECURE_WEB_GATEWAY
addresses: ["192.168.64.99"] # SWP インスタンス用の IP を指定(プロキシ専用サブネットではなくクライアント VM 側のサブネット)
ports: [8080] # SWP が待ち受けるポート番号を指定
certificateUrls: ["projects/{PROJECT_ID/locations/asia-northeast1/certificates/cert-1"] # 作成した Google マネージド SSL/TLS 証明書を指定
gatewaySecurityPolicy: projects/<PROJECT_ID>/locations/asia-northeast1/gatewaySecurityPolicies/policy1 # 前手順で作成したセキュリティポリシーを指定
network: projects/<PROJECT_ID>/global/networks/test-vpc # VPC を指定
subnetwork: projects/<PROJECT_ID>/regions/asia-northeast1/subnetworks/tokyo-01 # サブネットを指定(プロキシ専用サブネットではなくクライアント VM 側のサブネット)

gcloud コマンドを使用して SWP インスタンスを構築します。SWP 構築時に、Cloud Router と Cloud NAT も自動的に構築されます。この Cloud NAT は SWP 専用のものであり、他のクライアントは利用できません。

$ gcloud network-services gateways import swp1 \ # SWP インスタンスの名前を指定(例. swp1)
--source=gateway.yaml \ # 作成した yaml を指定
--location=asia-northeast1 # SWP を構築するリージョン名を指定

Web アクセスと Windows Update のブロック確認

プロキシの設定

Windows VM にログインします。Windows キー + R でコマンド実行プロンプトを開き、ms-settings:network-proxy と入力してプロキシ設定を開きます。

コマンドを実行

表示された画面で、スクリーンショットを参考に、プロキシの設定を有効化します。

設定項目 設定値
Address 192.168.64.99(SWP インスタンスの IP アドレス)
Port 8080(SWP インスタンスのポート番号 )

プロキシサーバの指定

Web アクセスの確認

Web ブラウザで Google(https://www.google.com)にアクセスし、ページが表示されないことを確認します。

www.google.com へのアクセス(ブロック)

Cloud Logging の確認

次に、Cloud Logging を使用してアクセスログを確認します。Cloud Logging の確認方法に関しては、以下記事を参照してください。

Cloud Loggingの概念と仕組みをしっかり解説 blog.g-gen.co.jp

ログには、許可ルールが未設定のため、デフォルトの拒否アクションでアクセスがブロックされたことが記録されます。

ログの確認結果

Windows Update の確認

Windows キー + R を押し、ms-settings:windowsupdate と入力して Windows Update 設定を開きます。

コマンドを実行

「Check for updates」を選択し、更新プログラムのダウンロードが開始されることを確認します。

Windows Update の実行

プロキシに許可ルールが設定されていないため、ダウンロードが失敗し、エラーが表示されます。

更新プログラムのダウンロード失敗

Windows Update 許可ルールの適用

URL リストの設定

Windows Update に必要な URL リストを作成します。このリストには、Windows Update がアクセスするドメインが含まれており、これらのドメインへのアクセスを許可するルールを作成します。

# url.yaml
name: projects/<PROJECT_ID>/locations/asia-northeast1/urlLists/url-1 # URL リストの名前を指定。<PROJECT_ID> にはプロジェクト ID を入力。
values:
- "*.prod.do.dsp.mp.microsoft.com"
- "*.dl.delivery.mp.microsoft.com"
- "*.windowsupdate.com"
- "*.delivery.mp.microsoft.com"
- "*.update.microsoft.com"
- "adl.windows.com"
- "tsfe.trafficshaping.dsp.mp.microsoft.com"
- "definitionupdates.microsoft.com"

OS のバージョンやエディションによって必要な URL が異なる場合があるため、詳細は以下の参考ドキュメントを参照してください。

作成した URL リストを SWP に設定します。

$ gcloud network-security url-lists import url-1 \
--location=asia-northeast1 \ # SWP を構築するリージョンを指定
--source=url.yaml # 作成した URL リストの YAML ファイルを指定

ルールの設定

次に、作成した URL リストに基づいて、Windows Update だけを許可するルールを作成します。このルールは、アクセスを許可するドメインリスト(url-1)に基づいて動作します。

# rule.yaml
name: projects/<PROJECT_ID>/locations/asia-northeast1/gatewaySecurityPolicies/policy1/rules/rule-1 # ルール名を指定。<PROJECT_ID> にはプロジェクト ID を入力
basicProfile: ALLOW # ルールのアクションを指定(今回は許可のため "ALLOW" を指定)
enabled: true # ルールの状態を指定(今回は"有効" を指定)
priority: 100 # 優先度を指定(数値が小さいほど優先)
description: Allow Windows Update # ルールの説明
sessionMatcher: "inUrlList(host(), 'projects/<PROJECT_ID>/locations/asia-northeast1/urlLists/url-1')" # ルールとURLリストを紐づけ、指定したドメインにアクセスを許可

作成したルールを SWP に適用しているポリシーに反映させます。

$ gcloud network-security gateway-security-policies rules import rule-1 \
--source=rule.yaml \ # 作成したルールファイルを指定
--location=asia-northeast1 \ # SWP を構築しているリージョンを指定
--gateway-security-policy=policy1 # 適用するポリシー名を指定

Windows Update のアクセス確認

Web アクセスの確認

再度、Google(https://www.google.com)へアクセスし、ページが表示されず、ブロックされていることを確認します。

www.google.com へのアクセス(ブロック)

Windows Update の再確認

Windows Update の画面から「Retry」を選択します。

Retry の実施

更新プログラムのダウンロードが進んでいることを確認します。

更新プログラムのダウンロード中

インストールを続行するために再起動が必要となります。サーバーを再起動しても問題ないことを確認し、「Restart now」をクリックして再起動します。

再起動を求められる

再起動後に再度 Windows Update の画面を確認し、緑のチェックマークが表示され、Windows が最新の状態であることを確認します。

Windows Update が最新の状態であることの確認

三浦 健斗(記事一覧)

クラウドソリューション部

2023年10月よりG-genにジョイン。元オンプレ中心のネットワークエンジニア。ネットワーク・セキュリティ・唐揚げ・辛いものが好き。