Cloud Armor によるエッジ キャッシュの防御

1. はじめに

Google Cloud Armor のエッジ セキュリティ ポリシーを使用すると、Google Cloud CDN と Google Cloud Storage でキャッシュに保存されたオブジェクトへのアクセスを制限できます。たとえば、制限された地域からユーザーがストレージ バケット内のオブジェクトにアクセスできないようにすることや、許可のある地域でメディア配信をフィルタすることなどが挙げられます。

このラボでは、GCS バケットを作成して画像をアップロードし、ロードバランサにバインドしてから、Cloud CDN と Edge のセキュリティ ポリシーを有効にします。

学習内容

  • キャッシュに保存可能なコンテンツのある Cloud Storage バケットを設定する方法
  • コンテンツを保護するエッジ セキュリティ ポリシーの作成方法
  • エッジ セキュリティ ポリシーが想定どおりに機能していることを確認する方法

必要なもの

  • ネットワーキングの基礎と HTTP の知識
  • Unix / Linux コマンドラインに関する基本的な知識

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

bce75f34b2c53987.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

f6ef2b5f13479f3a.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。このラボでの作業はすべて、ブラウザから実行できます。

始める前に

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

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

API を有効にする

必要なサービスをすべて有効にする

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com

3. Cloud Storage バケットを作成する

Cloud コンソールのナビゲーション メニューから、Cloud Storage >ブラウザ。[バケットを作成] をクリックします。

baf3d3c74282ecba.png

バケットの命名規則は次のとおりです。

  • バケットの名前空間はグローバルであり、一般公開されるため、バケット名に機密情報を含めないでください。
  • バケット名に使用できる文字は、小文字、数字、ダッシュ(-)、アンダースコア(_)、ドット(.)のみです。ドットを使用している名前には確認が必要です。
  • バケット名の先頭と末尾は、数字または文字にする必要があります。
  • バケット名の長さは 3~63 文字にする必要があります。ドットを使用している名前には最大 222 文字を使用できますが、ドットで区切られている各要素は 63 文字以下である必要があります。
  • バケット名はドット記法(たとえば、192.168.5.4)の IP アドレス形式で表すことはできません。
  • バケット名の先頭に接頭辞「goog」は使用できません。
  • バケット名に「google」または「google」と類似する表記を含めることはできません。
  • また、DNS の基準に準拠し、将来的な互換性を確保するため、アンダースコア(_)を使用したり、ドットを連続して使用したり、ドットとダッシュを隣同士で使用したりしないでください。たとえば、「..」、「-.」、「.-」は DNS 名では無効です。

[続行] をクリックします。

ロケーション タイプ: region

ロケーション: 遠く離れたリージョンを選択します。

[続行] をクリックします。

デフォルトのストレージ クラス: Standard

[続行] をクリックします。

[公開アクセスの防止] の [このバケットに対する公開アクセス禁止を適用する] チェックボックスをオフ にします。

[アクセス制御] で [きめ細かい管理] を選択します。

[続行] をクリックします。

バケットを構成したら、[作成] をクリックします。

これで Cloud Storage バケットの作成は完了です。

4. バケットにオブジェクトをアップロードする

次に、バケットにオブジェクトをアップロードします。

まず、この画像を Cloud Shell の一時インスタンスにダウンロードします。以下の例では、Google ホームページの Google 画像を使用しています。

Cloud Shell から

wget --output-document google.png https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png

gsutil cp コマンドを使用して、画像を保存した場所から、作成したバケットにアップロードします。

Cloud Shell から

gsutil cp google.png gs://YOUR-BUCKET-NAME

ここで、ダウンロードした画像を削除しておきます。

Cloud Shell から

rm google.png

オブジェクトを見つけて右側のその他アイコンをクリックし、権限を [公開] に変更します。

821aad82d8633922.png

30a975d3ad22d33d.png

5. ロードバランサを作成する

次に、HTTP ロードバランサを作成します。

[ネットワーキング >>ネットワーク サービス >>ロード バランシング >>ロードバランサを作成する >>HTTP ロードバランサ >>インターネットから VM へ >>従来の HTTP(S) ロードバランサ

まず、作成するロードバランサの名前を作成します。

バックエンド バケットを作成

先ほど作成したバケットで新しいバックエンド バケットを作成し、[有効な CDN と静的コンテンツのキャッシュ] を選択します。[作成] をクリックします。

ed392a56538d499e.png

ホストとパスのルールを作成する

左側の [ホストとパスのルール] に移動します。単純なホスト/パスルールを使用して、すべてのリクエストをバケットに送信します。

7c1a664e0d1f15b0.png

フロントエンド構成を作成する

フロントエンド構成を選択します。フロントエンドの構成には HTTP(証明書がある場合は HTTPS も使用できます)とエフェメラル IP アドレスを使用します。必ずプレミアム ティアのネットワークを選択するようにしてください。

2597a5e63d618622.png

[作成] をクリックする

ロードバランサの IP を取得する

プロジェクトのロードバランサのリストでロードバランサ名をクリックして、ロードバランサ IP をコンソールから取得します。

9b757362d806e835.png

ロードバランサにクエリを実行する

数分後、アップロードしたオブジェクトのロードバランサへのクエリを試行します。ロードバランサの IP アドレスとイメージの名前が必要になります。このコマンドの構造は次のとおりです。

ターミナルから

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

出力

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtoILI76KVsvBvdVGvSfzaxys1m3zYqCepBrmJxAI48ni24cWCRIdNu-53PX3DS6iycxp6xwFbMpwtcHHZQUQmEBxAgng
< Expires: Mon, 13 Dec 2021 22:58:26 GMT
< Date: Mon, 13 Dec 2021 21:58:26 GMT
< Cache-Control: public, max-age=3600
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer

CDN またはロード バランシングのモニタリングを介して、コンテンツが CDN から配信されていることを確認します。100% に近いヒット率を達成できるはずです。クエリを実行する必要がある場合は、次の操作を行います。

ターミナルから

#for i in `seq 1 50`; do curl http://%loadbalncer-IP%/google.png; done

Cloud CDN から配信されたコンテンツを確認する

CDN からトラフィックが配信されていることを確認するには、[Network Services] >>CDN

a52d0ba4c084aa05.png

6. GCS からオブジェクトを削除する

キャッシュにデータが入力されたので、ポリシーをバックエンドではなくキャッシュに適用するために、バケットからオブジェクトを削除しましょう。

[Cloud Storage] >>%bucket name% >>オブジェクト

画像を選択して削除します。

a1cc1bb9a0ff41df.png

7. CDN キャッシュ用のエッジ セキュリティ ポリシーの作成

[ネットワーク セキュリティ >>[ポリシーの作成] をクリックします。

以下を選択してください

ポリシータイプ: Edge Security Policy

デフォルトのアクション: 拒否

7a12374be33026fd.png

b7c4efc091272358.png

77ddbcddd07b65d2.png

ポリシーをバックエンド バケットに適用します。

8. エッジ セキュリティ ポリシーを検証する

バックエンド バケットの前にエッジ セキュリティ ポリシーを作成できたので、期待どおりに機能しているか検証しましょう。

セキュリティ ポリシーを確認する

数分後、Cloud Armor ポリシーが実行されていることを確認できます。コマンドラインから次のコマンドを実行すると、403

ターミナルから

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

出力

curl -svo /dev/null http://34.98.81.123/google.png
*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 403 Forbidden
< X-GUploader-UploadID: ADPycdtS6FtJOGIsiWYDrAAE8VFeQuNutcvbGoQe2t8EZxsuspVtmCjyiTv_P3CNktroHMOGFXkTCfG-Jj-rUO60ZGPpEbpqcw
< Content-Type: application/xml; charset=UTF-8
< Content-Length: 111
< Date: Mon, 13 Dec 2021 23:09:35 GMT
< Expires: Mon, 13 Dec 2021 23:09:35 GMT
< Cache-Control: private, max-age=0
< Server: UploadServer
<

ログを調査する

次に、ログで、適用されているエッジ セキュリティ ポリシーを確認します。[オペレーション >>] に移動します。ロギング >>ログ エクスプローラ

以下のスニペットをクエリに入力して、[実行] をクリックします。

14972af5ae6c182a.png

resource.type:(http_load_balancer) AND jsonPayload.enforcedEdgeSecurityPolicy.name:(%SECURITY_POLICY_NAME%)

403 レスポンスと適用されているセキュリティ ポリシーを確認する

cddc48ca93ad79ca.png

セキュリティ ポリシーを削除する

セキュリティ ポリシーを削除し、キャッシュからオブジェクトをクエリします。

[ネットワーク セキュリティ >>Cloud Armor >>%ポリシー名% >>ターゲット バケットを削除する。

350655729a89eb33.png

ポリシーが削除されたことを確認する

数分経過したら、Storage バケット内のリソースに別の curl を送信します。今回は 200 レスポンスが返されます。

ターミナルから

curl -svo /dev/null http://LOAD_BALANCER_IP/google.png

出力

armanrye-macbookpro% curl -svo /dev/null http://34.98.81.123/google.png

*   Trying 34.98.81.123...
* TCP_NODELAY set
* Connected to 34.98.81.123 (34.98.81.123) port 80 (#0)
> GET /google.png HTTP/1.1
> Host: YOUR_IP
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< X-GUploader-UploadID: ADPycdtI7f49P3MSuZSZ8vl6RwfwmnIDJ59EeSKp7UPvLPawdaiRHXiNWLtseQTxUxceWOvSLvpYmT3pWVkV4qeIP7M
< Date: Mon, 13 Dec 2021 23:06:46 GMT
< Last-Modified: Mon, 13 Dec 2021 21:45:57 GMT
< ETag: "8f9327db2597fa57d2f42b4a6c5a9855"
< x-goog-generation: 1639431957957903
< x-goog-metageneration: 2
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 5969
< Content-Type: image/png
< x-goog-hash: crc32c=TeiHTA==
< x-goog-hash: md5=j5Mn2yWX+lfS9CtKbFqYVQ==
< x-goog-storage-class: STANDARD
< Accept-Ranges: bytes
< Content-Length: 5969
< Server: UploadServer
< Age: 1621
< Cache-Control: public,max-age=3600
<
{ [775 bytes data]
* Connection #0 to host 34.98.81.123 left intact
* Closing connection 0

これで、Cloud Armor Edge セキュリティ ポリシーに関するこのラボはこれで完了です。

©2020 Google LLC All rights reserved.Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。

9. ラボのクリーンアップ

[ネットワーク セキュリティ >>Cloud Armor >>%POLICY NAME% を選択し、[削除] を選択します。

21eefb5f375e8fee.png

Cloud Storage に移動し、作成したバケットを選択して [削除] をクリックします。

ef2fa8d45c1d3452.png

[ネットワーキング >>ネットワーク サービス >>ロード バランシング。作成したロードバランサを選択し、[削除] をクリックします。

ee2e78c10f4104eb.png

10. 完了

「Cloud Armor によるエッジ キャッシュの保護」Codelab を完了しました。

学習した内容

  • Cloud Storage バケットと関連するクラウド ロードバランサを設定する方法
  • Cloud Armor Edge セキュリティ ポリシーの作成方法
  • エッジ セキュリティ ポリシーが意図したとおりに機能していることを検証する方法。

次のステップ

  • Compute Engine リソースからのキャッシュ ヒットを使用するエッジ セキュリティ ポリシーの設定を試します。