📝

Cloud Load Balancing に reCAPTCHA 機能を設定する

2024/09/17に公開

はじめに

こんにちは、クラウドエースの岸本です。
Google Cloud の公式ブログに、以下のような記載があります。

Google のミッションの根底には、「bot には厳しく、人には優しくあるべき」というものがあります。

ということで、前回の記事で作成した Cloud Load Balancing のバックエンドに対して、reCAPTCHA 機能を設定してみたいと思います。
Cloud Load Balancing に紐づくバックエンドがあれば実装可能ですので、ぜひご活用ください。

【前回の記事】

作成するもの

以下が構成後のイメージです。
構成図

今回使用する主要なサービスは以下の通りです。

Cloud Load Balancing

Cloud Load Balancing とは、アプリケーションの可用性を向上させるため、クライアントからのリクエストを最初に受け取り、その後複数のサーバーに効率よく振り分けるサービスです。
Cloud Load Balancing には、さまざまな種類があります。
今回使用しているのは、Global External Application Load Balancer です。
この Load Balancer は、複数のリージョンにまたがるサービスを提供する際に使用します。
その他の Load Balancer については、公式ドキュメントをご参照ください。

Cloud Armor

Cloud Armor は、Google Cloud が提供する Web Application Firewall (WAF) サービスです。アクセス制御を行うためのルールをまとめたセキュリティポリシーを作成し、そのポリシーに基づいてアクセスを制御します。具体的には、特定の IP アドレスからのアクセスをブロックする、特定のパスにアクセスした場合にリダイレクトするなどの制御が可能です。
今回は、特定のパスにアクセスした場合にリダイレクトする機能を使用し、リダイレクト先として reCAPTCHA を設定しています。
詳しくは、弊社のテックブログまたは、公式ドキュメントをご参照ください。

reCAPTCHA

reCAPTCHA は、スパムや不正行為からサイトを保護し、高度なリスク分析手法を使って人間とボットを区別するサービスです。
これまで、reCAPTCHA は以下のような歴史がありました。
【reCAPTCHA の歴史】
reCAPTCHA
ユーザー ファーストの reCAPTCHA Enterpriseより引用

  • reCAPTCHA v1: 画像に表示された文字を入力することで、ユーザーが人間であることを確認します。2018 年 3 月に終了しました。
  • reCAPTCHA v2: checkbox にチェックを入れることや、ユーザーがサイト上のボタンをクリックしたときに呼び出される Invisible reCAPTCHA などで、ユーザーが人間であることを確認します。
  • reCAPTCHA v3: ユーザーが人間であるかどうかをスコアリングし、ユーザーが人間であるかどうかを判断します。
  • reCAPTCHA Enterprise: これまでの reCAPTCHA v2, v3 の機能に加えて、パスワードの漏洩を検出する機能や、モバイルアプリケーションに対応するなど、エンタープライズ向けの機能が追加されています。詳しくは弊社のテックブログをご参照ください。

料金について

次に、料金について説明します。
大きく分けて以下 3 つのサービスで料金が発生します。

Load Balancer の使用料

Load Balancer は、Regional Internal Application Load Balancer、Cross-region Internal Application Load Balancer と、それ以外の Load Balancer という 3 種類の料金体系があります。
今回は、Global External Application Load Balancer を使用しますのでそれ以外の Load Balancer に該当します。
主に以下の 2 点が課金対象となります。

  • 転送ルール
    Global External Application Load Balancer の東京リージョンでの使用料は、1 時間あたり 0.025 USD です。
    その後は、追加の転送ルールごとに、1 時間あたり 0.01 USD が課金されます。
  • データ転送
    データ転送には、インバウンドトラフィックとアウトバウンドトラフィックがあります。
    インバウンドトラフィックは 1 GB あたり 0.012 USD が課金されます。
    アウトバウンドトラフィックは 1 GB あたり 0.012 USD が課金されます。

Cloud Armor の使用料

Cloud Armor には、大きく Google Cloud Armor Standard と、Cloud Armor Enterprise の 2 つのエディションがあります。
今回は、Google Cloud Armor Standard が課金対象となります。
主に以下の 3 つが料金対象となります。

  • リクエストの数
    100 万件のリクエスト当たり、0.75 USD が課金されます。
  • セキュリティポリシー
    ポリシー 1 件あたり、月額 5 USD が課金されます。
  • ルール
    ルール 1 件あたり、月額 1 USD が課金されます。

今回は、Cloud Armor のセキュリティポリシーを使用して特定のパスにアクセスした場合に reCAPTCHA にリダイレクトするルールを作成します。
また、セキュリティポリシーにはデフォルトで 1 つのルールが含まれています。
そのため、今回の構成では月額 7.75 USD が課金されます。

reCAPTCHA の使用料

reCAPTCHA には、reCAPTCHA Essentials、reCAPTCHA Standard、reCAPTCHA Enterprise の 3 つのエディションがあります。
今回は、reCAPTCHA Enterprise を使用します。
reCAPTCHA Enterprise の料金は、月 1 万件の認証リクエストまで無料です。
1 万件の認証リクエスト後は、10 万件まで 8 USD が課金されます。
さらに、10 万件を超える認証リクエストに対しては、1000 件あたり 1 USD が課金されます。
今回は、無料枠内で収まるため、料金は発生しません。

構築手順

次に、Cloud Load Balancing に reCAPTCHA 機能を設定する手順を説明します。
今回は、こちらの記事をもとに reCAPTCHA Enterprise を使用して Cloud Load Balancing に reCAPTCHA 機能を設定します。
主な手順は以下の通りです。

  1. reCAPTCHA Enterprise の API 有効化
  2. Cloud Armor の設定
  3. ブラウザでの動作確認

1. reCAPTCHA Enterprise の API 有効化

はじめに、reCAPTCHA Enterprise API を有効化します。
以下のコマンドで API を有効化します。

gcloud beta services enable recaptchaenterprise.googleapis.com \
    --project=PROJECT_ID

// 確認
gcloud services list --enabled --project=PROJECT_ID | grep recaptchaenterprise

// 出力例
NAME: recaptchaenterprise.googleapis.com

2. Cloud Armor の設定

次に、Cloud Armor の設定を行います。
手順としては、以下の通りです。

  • 2-1. Cloud Armor セキュリティポリシーの作成
  • 2-2. Cloud Armor 内のルールの作成
  • 2-3. Cloud Load Balancer への適用

2-1. Cloud Armor ポリシーの作成

まずは、Cloud Armor セキュリティポリシーを作成します。
以下のコマンドでセキュリティポリシーを作成します。

gcloud beta compute security-policies create SECURITY_POLICY_NAME \
    --project=PROJECT_ID
  • SECURITY_POLICY_NAME: 作成するセキュリティポリシーの名前をご自身で設定してください。

2-2. Cloud Armor 内のルールの作成

次に、セキュリティポリシー内にルールを作成します。
今回は、/ にアクセスした場合に reCAPTCHA にリダイレクトするルールを作成します。
以下のコマンドでルールを作成します。

gcloud beta compute security-policies rules create 1000 \
  --security-policy SECURITY_POLICY_NAME \
  --expression "request.path.matches('/')" \
  --action redirect \
  --redirect-type google-recaptcha \
  --project=PROJECT_ID
  • SECURITY_POLICY_NAME : 作成したセキュリティポリシーの名前を指定します。
  • 1000 : ルールの優先度を指定します。優先度は、セキュリティポリシー内のルールの適用順序を決定します。値が小さいルールが優先して適用されます。
  • request.path.matches('/'): / にアクセスした場合に reCAPTCHA を表示するように設定します。これは、Google Cloud Armor カスタムルール言語で記載しており、リクエストした HTTP URL パスに一致するかどうかを評価しています。詳細については公式ドキュメント属性をご参照ください。
  • redirect-type : 上記で設定したアクションが実行された場合のリダイレクト先を指定します。今回は reCAPTCHA を使用してリダイレクトするように設定しています。

2-3. Cloud Load Balancer への適用

最後に、作成したセキュリティポリシーを Cloud Load Balancer に適用します。
Cloud Armor で作成したセキュリティポリシーは、Cloud Load Balancer の構成要素である、バックエンドサービスまたはバックエンドバケットに適用することができます。
今回は、前回作成したバックエンドサービスに適用します。
以下のコマンドでセキュリティポリシーをバックエンドサービスに適用します。

// バックエンドサービスをリスト
gcloud compute backend-services list --project=PROJECT_ID

//出力例
NAME: BACKEND_SERVICE_NAME
BACKENDS: us-central1/networkEndpointGroups/SERVERLESS_NEG_NAME
PROTOCOL: HTTPS

// セキュリティポリシーをバックエンドサービスに適用
gcloud compute backend-services update BACKEND_SERVICE_NAME \
  --security-policy SECURITY_POLICY_NAME \
  --global \
  --project=PROJECT_ID
  • BACKEND_SERVICE_NAME : リストで表示されたバックエンドサービスの名前を指定します。
  • SECURITY_POLICY_NAME : 作成したセキュリティポリシーの名前を指定します。

以上で、Cloud Armor の設定は完了です。

3. ブラウザでの動作確認

最後に、ブラウザでの動作確認を行います。
ブラウザから Cloud Load Balancer の URL にアクセスし、reCAPTCHA が表示されることを確認します。

【reCAPTCHA の表示例】
reCAPTCHA

【reCAPTCHA 後の表示例】
reCAPTCHA

以上で、Cloud Armor の reCAPTCHA 機能の設定手順は完了です。

まとめ

今回は、Cloud Load Balancing に reCAPTCHA 機能を設定する手順について解説しました。
reCAPTCHA を使用することで、ユーザーが人間であるかどうかを確認し、不正アクセスを防ぐことができます。
今後は Cloud Armor の他の機能も活用し、セキュリティを強化していきたいと思います。
最後までお読みいただき、ありがとうございました。

Discussion