目次

  1. 1.はじめに
  2. 2.国・地域別制限ルール
  3. 3.レートベースルール
  4. 4.WafCharm での対応状況
  5. 5.おわりに
  6. 1. はじめに

    Google Cloud Armor 上での二つの特別なルールの作成、利用方法を紹介します。それら2つのルールを活用することで、国内のみのアクセスに絞り込むことで強度なセキュリティを構築することが可能となったり、特定のクライアントを用いて繰り返しアクセスしてくる不審なアクセスを検知・遮断することが可能となります。

    2.国・地域別制限ルール

    国・地域別制限ルールは IP アドレスから確認された国・地域コードを利用した制限になります。
    設定される国・地域コードは ISO 3166-1 alpha-2 に従います。
    origin.region_code というフィールドに2文字の文字列で表現されるので、その文字列をマッチさせることで許可や拒否の設定を行えます。

    よくある制限のパターンとして日本のみのアクセスに絞り込む例で確認していきます。

    以下が日本と一致するというルールになります。

    origin.region_code == 'JP'
    

    これを否定するように以下に変更すると日本以外に一致するということになります。

    origin.region_code != 'JP'
    

    ルールの準備はできましたので登録していきましょう。
    ポリシーの編集画面から「ルールを追加」を選択します。

    詳細モードを選択します。

    出現したエディタにルールを入力して、優先度を設定して、追加を選択して完了です。

    動作を確認してから実際に遮断したい場合はプレビューモードを利用してください。

    複数の特定の国に一致するルールを書きたい場合は以下のようになります。

    origin.region_code == 'RU' || origin.region_code == 'CN'
    

    ただし、カスタム式で利用できる文字数は 2048 という制限があり、1 つのルールに含めることができるサブ式の数も 5 という制限があるため、いくつもの国を追加し続けるという書き方は、ルールを分割する必要が出てくるため注意してください。
    https://cloud.google.com/armor/quotas

    公式情報での案内は確認できませんでしたが、一致するリストを並べて記載する以下の方法も必要に応じて利用してください。

    複数の国にマッチ

    ’[US,CN,RU,GE,MO,FR]'.contains(origin.region_code)
    

    複数の国以外にマッチ

    !('[US,CN,RU,GE,MO,FR]'.contains(origin.region_code))
    

    3. レートベースルール

    レートベースルールはクライアント毎に閾値を設定してアクセス量を制限するためのルールです。
    以下の2パターンで設定が可能です。

    ・スロットル
    利用可能なアクセス量をクライアント単位で設定し、閾値を超えたリクエストだけ破棄する設定。
    ・レートベースの禁止
    設定した閾値をクライアントが超えた場合、構成した期間、一時的にクライアントのアクセスを拒否する設定。

    少しわかりづらいかもしれませんが、どれだけアクセスがあっても指定したリクエスト量だけは許容する設定と、異常なアクセス量が発生した場合は全てのアクセスを拒否してしまうといった違いになります。

    クライアントの単位は以下の4つから選択することができます。

    ・ALL
    リクエストがルールの一致条件を満たすすべてのアクセスがレートベース制約の対象になります。例えば一つのアクセス元から多量のアクセスがあった場合には、他のアクセス元からの通信も影響を受けます。
    ・IP
    リクエストがルールの一致条件を満たすアクセスのうち、 IP アドレスごとレートベース制約の対象になります。IP アドレスが違えば他の送信元から多量のアクセスがあっても影響を受けません。
    ・HTTP-HEADER
    名前が構成された一意の HTTP ヘッダー値ごとにレートベース制約の対象になります。特定のツールによる多量のアクセスを防ぐことに利用できそうです。
    ・XFF-IP
    X-Forwarded-Header で指定されたクライアントの元の送信元 IP アドレスごとにレートベース制約の対象になります。IP の場合に似ています。

    一般的にイメージしやすいものは IP アドレスによる制限かと思います。対象となる個人(端末)を特定したり広げたりする場合は何らかのヘッダー情報を利用できるでしょう。
    公式情報にもいくつか利用例の記載があるので確認してみてください。
    https://cloud.google.com/armor/docs/configure-security-policies#rate-limiting

    では実際に登録してみましょう。
    レートベースルールはコマンドからの登録のみになりますので、まずは Cloud Shell を起動します。

    IP 単位で URI が「/login」に対して日本以外から 120 秒間に 50 回リクエストがあった場合に 300 秒間アクセス拒否されるルールです。HTTPステータスコードは 404 が返る設定です。
    ※拒否されるリクエストは、合致した IP アドレスで URI が「/login」に対して日本以外からのものです。閾値に合致した IP アドレスのリクエストを全て止めるわけではないです。

    gcloud beta compute security-policies rules create 103 \
        --security-policy=<セキュリティポリシー名>     \
        --expression "request.path.startsWith('/login') && origin.region_code != 'JP'"     \
        --action=rate-based-ban                   \
        --rate-limit-threshold-count=50           \
        --rate-limit-threshold-interval-sec=120   \
        --ban-duration-sec=300           \
        --conform-action=allow           \
        --exceed-action=deny-404         \
        --enforce-on-key=IP
    

    ※ 利用する場合、<セキュリティポリシー名>は置き換えてください。

    上記を Cloud Shell で実行すれば完了です。

    ルールの詳細画面でも以下のようにルールの登録は確認できます。
    ただし、ルールの詳細の確認はコマンドで実施する必要があります。
    画像
    セキュリティポリシーに登録されている内容を表示するコマンド

    gcloud beta compute security-policies describe <セキュリティポリシー名>
    

    実行結果の抜粋

    4. WafCharm での対応状況

    国・地域別制限についてはカスタマイズとして対応可能です。
    カスタマイズ対応はビジネスプラン以上のご契約で無償で対応可能です。

    レートベースルールについてはカスタマイズを承っておりません。
    ベータ機能であるため、対応を見送っております。
    お客様自身でカスタムルールを作成してご利用いただくことは問題ございません。

    5. おわりに

    国・地域別制限についてはサイトの特性によっては不要なアクセスを大きく減らせる可能性が高いのでお勧めです。レートベースについては利用方法や閾値の設定がサイトによって異なるのでプレビューモードで試してから利用することを推奨します。