ユーザー定義ルールを使用して NLB/VM に対応する Cloud Armor

1. はじめに

Cloud Armor セキュリティ ポリシーは、ユーザー定義のルールを構成して Google ネットワークのエッジ(インフラストラクチャの上流)でトラフィックをフィルタするために使用されます。ネットワーク エッジのセキュリティ ポリシーを使用すると、エンドポイント タイプ(ネットワーク ロードバランサ、プロトコル転送、パブリック IP を持つ VM)をターゲットとするトラフィックを保護、許可またはブロックできます。

7bc9d3ed0c03b54f.png

この Codelab では、DDoS 攻撃を防ぐために、ユーザー定義のルールで Cloud Armor セキュリティ ポリシーを構成する方法のデモを行います。

f0a40260147e71b1.png

図 1. パブリック IP 保護を備えた VM 向け Cloud Armor。

学習内容

  • ユーザー定義のルール構成を使用した Cloud Armor セキュリティ ポリシー
  • UDP オフセットの構成とテスト。

必要なもの

  • TCP/IP の知識
  • Unix/Linux コマンドラインの知識

2. 始める前に

Cloud Shell 内で、プロジェクト ID が設定されていることを確認します。

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

3. ターゲット VPC ネットワークの作成

次のセクションでは、VPC ネットワークと関連ネットワーク構成を設定します。Cloud Armor ネットワーク エッジのセキュリティ ポリシーはリージョン ベースであり、すべての関連リソースを asia-southeast1 リージョンに設定します。

VPC ネットワーク

Cloud Shell から

gcloud compute networks create ca4nlb --project=$prodproject --subnet-mode=custom

サブネットの作成

Cloud Shell から

gcloud compute networks subnets create ca4nlb-asia-southeast1 --project=$prodproject --range=10.0.0.0/24 --network=ca4nlb --region=asia-southeast1

ファイアウォール ルールを作成します。

このセクションでは、想定される UDP トラフィックをポート 10000 に許可するファイアウォール ルールを追加します。

次のテスト用に UDP ポート 10000 を開くファイアウォール ルールを Cloud Shell で作成します。

gcloud compute firewall-rules create ca4nlb-udp10000 --allow udp:10000 --network ca4nlb --source-ranges 0.0.0.0/0 --enable-logging

Cloud Shell で、IAP に VM インスタンスへの接続を許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create ca4nlb-iap-prod --network ca4nlb --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

4. ターゲット VM インスタンスを作成する

セキュリティ ポリシーをテストするためのターゲット VM を作成します。この VM にはパブリック IP アドレスがあり、UDP ポート 10000 が開いている必要があります。

Cloud Shell でインスタンス targetvm を作成する

gcloud compute instances create targetvm \
--zone=asia-southeast1-b \
--image-family=debian-11 \
--image-project=debian-cloud \
--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=ca4nlb-asia-southeast1 \
--shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring

5. 高度なネットワーク DDoS 対策を構成する

Cloud Shell から

 gcloud compute security-policies create ca_advanced_ddos \
     --type CLOUD_ARMOR_NETWORK \
     --region asia-southeast1

 gcloud compute security-policies update ca_advanced_ddos \
     --network-ddos-protection ADVANCED \
     --region asia-southeast1

 gcloud compute network-edge-security-services create caedgepolicy \
     --security-policy ca_advanced_ddos \
     --region asia-southeast1

6. デフォルトのルールを使用してネットワーク エッジのセキュリティ ポリシーを作成する

ネットワーク エッジのセキュリティ ポリシーを作成する

Cloud Shell から

gcloud alpha compute security-policies create customnetworkedge --type=CLOUD_ARMOR_NETWORK --region=asia-southeast1

デフォルト ルールの変更

Cloud Shell から

gcloud alpha compute security-policies rules update 2147483647 --security-policy=customnetworkedge --action=deny --region=asia-southeast1

7. 構成済みのルールを使用してネットワーク エッジのセキュリティ ポリシーを作成する

ユーザーが事前定義された UDP オフセット。Cloud Armor ポリシーで構成。この「オフセット値」を含むパケットポリシー チェックに合格し、バックエンド VM に送信されます。次の例では、2 つの「offset」と作成します。

1 つ目の値は UDP ヘッダーの直後にあり、2 バイトと完全に一致します: 0x1700

2 番目の値は、UDP ヘッダーのオフセット 8 バイト(4 バイトと完全一致)です。0x12345678

事前定義された値を超える値は、UDP パケットビットビューに変換されます。

cbfdaeb93292e07b.png

Cloud Shell から

gcloud alpha compute security-policies add-user-defined-field customnetworkedge \
--user-defined-field-name=SIG1_AT_0 \
--base=udp --offset=8 --size=2 --mask=0xFF00 \
--region=asia-southeast1

gcloud alpha compute security-policies add-user-defined-field customnetworkedge \
--user-defined-field-name=SIG2_AT_8 \
--base=udp --offset=16 --size=4 --mask=0xFFFFFFFF \
--region=asia-southeast1

gcloud alpha compute security-policies rules create 1000 \
--security-policy=customnetworkedge \
--network-user-defined-fields="SIG1_AT_0;0x1700,SIG2_AT_8;0x12345678" \
--action=allow --region=asia-southeast1

8. セキュリティ ポリシーをターゲット VM にアタッチする

Cloud Shell から、保護された VM にセキュリティ ポリシーをアタッチします。

gcloud alpha compute instances network-interfaces update targetvm \
--security-policy=customnetworkedge \
--security-policy-region=asia-southeast1 \
--network-interface=nic0 \
--zone=asia-southeast1-b

Cloud Shell でターゲット VM の説明を取得すると、securityPolicy がアタッチされていることを確認します。次のテスト用にパブリック IP を記録します。

gcloud alpha compute instances describe targetvm --zone=asia-southeast1-b

networkInterfaces:
- accessConfigs:
  - kind: compute#accessConfig
    name: External NAT
    natIP: 35.240.148.100
    networkTier: PREMIUM
    securityPolicy: https://www.googleapis.com/compute/alpha/projects/<project>/regions/asia-southeast1/securityPolicies/customnetworkedge

保護された VM からセキュリティ ポリシーを Cloud Shell で切断する。

gcloud alpha compute instances network-interfaces update targetvm \
--network-interface=nic0 \
--zone=asia-southeast1-b \
--security-policy= 

9. テストリソースを準備する。

テスト VPC ネットワークを作成する

Cloud Shell から

gcloud compute networks create test --project=$prodproject --subnet-mode=custom

テスト サブネットを作成する

Cloud Shell から

gcloud compute networks subnets create test-asia-southeast1 --project=$prodproject --range=10.0.1.0/24 --network=test --region=asia-southeast1

ファイアウォールを作成する

Cloud Shell で、IAP に VM インスタンスへの接続を許可するファイアウォール ルールを作成します。

gcloud compute firewall-rules create test-iap-prod --network test --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

テスト VM を作成する

Cloud Shell から

gcloud compute instances create test01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=test-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring

10. 確認

VM コンソールにログインし、パケット生成ツール packit をインストールします。

sudo apt install packit

UDP オフセット設計に沿って、packit を使用して UDP パケットを生成します。送信元ポート(-S 10000)を持つインターフェイス(-s ens4)送信元 IP アドレス(-s 10.0.1.2)から、宛先ポート(-D 10000)を持つ targetVM 宛先 IP アドレス(-d 35.240.148.100)への(-t udp)パケットをシミュレートします。パケットの内容が値(-p ‘0x 17 00 00 00 00 00 00 00 12 34 56 78’)と一致します。(-c 4) パケットを送信します。

sudo packit -m inject -t UDP -i ens4 -s 10.0.1.2 -d 35.240.148.100 -S 10000 -D 10000 -p '0x 17 00 00 00 00 00 00 00 12 34 56 78' -c 4

ターゲット VM で tcpdump を実行して UDP パケットをキャプチャします。

sudo tcpdump port 10000 -v -n 

tcpdump: listening on ens4, link-type EN10MB (Ethernet), snapshot length 262144 bytes
06:36:18.434106 IP (tos 0x0, ttl 128, id 17173, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:19.433656 IP (tos 0x0, ttl 128, id 55641, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:20.433935 IP (tos 0x0, ttl 128, id 27161, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12
06:36:21.434150 IP (tos 0x0, ttl 128, id 46782, offset 0, flags [none], proto UDP (17), length 40)
    35.197.157.140.10000 > 10.0.0.2.10000: UDP, length 12

テスト VM のトラフィック パターンを変更すると、ターゲット VM でパケットをキャプチャできなくなります。

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 33 33 00 00 00 00 00 00 12 34 56 78' -c 4

11. テレメトリー

Cloud Metric を開き、以下の MQL を使用して NetworkSercurityPolicy テレメトリー データをクエリします。

fetch networksecurity.googleapis.com/RegionalNetworkSecurityPolicy
| metric 'networksecurity.googleapis.com/l3/external/packet_count'
| filter (resource.policy_name == 'customnetworkedge')
| align rate(1m)
| every 1m
| group_by [metric.blocked], [value_packet_count_mean: mean(value.packet_count)]
| group_by 1m, [value_packet_count_mean_mean: mean(value_packet_count_mean)]
| every 1m

match オフセット コマンドを使用して大量のトラフィックを生成します。

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 17 00 00 00 00 00 00 00 12 34 56 78' -c 1000000 -w 0.001

[result]
Injected: 1000000  Packets/Sec: 10309.27  Bytes/Sec: 412371.13  Errors: 0

unmatch オフセット コマンドを使用して大量のトラフィックを生成します。

sudo packit -m inject -t UDP -i ens4 -s 10.148.0.6 -d 34.87.79.31 -S 10000 -D 10000 -p '0x 11 00 00 00 00 00 00 00 12 34 56 78' -c 1000000 -w 0.001

[result]
Injected: 1000000  Packets/Sec: 10309.27  Bytes/Sec: 412371.13  Errors: 0

テレメトリーは policy_name でフィルタされ、ブロック別にグループ化されます。青い線は、ポリシールールによって許可されたトラフィックを示しています。緑色の線は、トラフィックがポリシールールによってブロックされていることを示しています。

b11ba15d87f99775.png

12. クリーンアップ手順

ターミナルで単一の Cloud Shell からラボのコンポーネントを削除する

gcloud compute instances delete targetvm --zone=asia-southeast1-b

gcloud compute firewall-rules delete ca4nlb-udp10000

gcloud compute firewall-rules delete ca4nlb-iap-prod

gcloud compute networks subnets delete ca4nlb-asia-southeast1 --region=asia-southeast1

gcloud compute networks delete ca4nlb

gcloud alpha compute security-policies delete customnetworkedge --region=asia-southeast1

gcloud alpha compute network-edge-security-services delete caedgepolicy --region=asia-southeast1

gcloud alpha compute security-policies delete ca_advanced_ddos --region=asia-southeast1

gcloud compute instances delete test01 --zone=asia-southeast1-b

gcloud compute firewall-rules delete test-iap-prod

gcloud compute networks subnets delete test-asia-southeast1 --region=asia-southeast1

gcloud compute networks delete test

13. 完了

以上で、この Codelab は完了です。

学習した内容

  • お客様が定義したルールを使用した Cloud Armor セキュリティ ポリシー