Cloud Armorを徹底解説。GoogleのWAFの実力とは

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

G-genの杉村です。 Google Cloud (GCP) には Cloud Armor というサービスがあります。 Cloud Armor は Google 製のクラウド型 WAF であり、 DDoS 対策の機能も備えています。
当記事では、 Cloud Armor の導入検討に役立つよう、概要や特徴を記載します。

Cloud Armor とは

Cloud Armor の概要

Cloud Armor は Google 製のクラウド型 WAF (Web Application Firewall) です。
WAF とは Web アプリケーションに対する "SQL インジェクション", "クロスサイトスクリプティング" といったアプリケーションレイヤの攻撃を検知し、防御するための仕組みです。

ただし、 Cloud Armor は全ての Web アプリケーションに使えるわけではありません。
Google Cloud のロードバランサーである Cloud Load Balancing の背後にある Web アプリケーションのみ を保護できます。

WAF ルールは Common Expression Language (CEL) をベースとしたカスタムルール言語で記述しますが、簡単な記述で OWASP Top 10 などの攻撃を緩和する事前構成ルールを呼び出すことができるため、複雑なシグネチャを自前で書く必要はありません。

DDoS 保護機能の概要

Managed Protection の概要

Cloud Armor は Managed Protection という機能を備えており、これが DDoS 攻撃からの保護を提供します。

通常版でも一定の DDoS 対策機能は備えていますが、追加料金を支払って Managed Protection Plus サブスクリプションに登録すると、 DDoS 請求対策 といったクラウド利用料金に対する保護や、プレミアムサポートと組み合わせた場合は DDoS 対応サポート チームの支援を受けることができます。

Adaptive Protection の概要

さらに Adaptive Protection という機能も備わっています。
この機能は、 L7 レイヤの DDoS 攻撃について不審なトラフィックパターンを自動分析し、アラートを生成します。
通常版だとアラートのみですが、前述の Managed Protection Plus に登録していると、アラートのみならず、対策ルールを自動生成してくれます。

セキュリティポリシー

セキュリティポリシーとは

Cloud Armor の セキュリティポリシー とは、防御ルールの設定のことです。
セキュリティポリシーを作成して、外部 HTTP(S) ロードバランサの バックエンドサービス にアタッチすることで、ルールが効果を発揮します。

セキュリティポリシーごとに以下のような設定値を持ちます。

  • 個別ルール (IPアドレス範囲リスト / カスタムルール言語)
  • デフォルトアクション (拒否 / 許可)
  • Adaptive Protection の有効 / 無効
  • アタッチ先のバックエンドサービス

セキュリティポリシーをアタッチできる対象

セキュリティポリシーは以下に対してアタッチできます。
つまり VM や GKE など外部 HTTP (S) ロードバランサー を使っているサービスを保護対象にすることができます。

f:id:ggen-sugimura:20211213183710p:plain
セキュリティポリシーの位置づけ

ルールとは

複数の ルール を、セキュリティポリシー内に作成できます。
ルールは優先度順に評価され、ルールに合致するとそれより低い優先度のルールは評価されません。

ルールは IP アドレスで許可 / 拒否を評価する 基本モードCommon Expression Language (CEL) をベースとしたカスタムルール言語で記述する 詳細モード があります。
単純な IP アドレスによる制限であれば基本モードのルールを、 SQL インジェクションなどの L7 攻撃を防ぐには詳細モードのルールを作成します。

詳細モードのルールではカスタムルール言語を使って記述する必要がありますが、 Google が作成する 事前構成されたルール (Preconfigured rules) を呼び出すことで、簡単な記述で防御ルールを作成することができます。

Google 事前構成ルールはオープンソースの ModSecurity Core Rule Set が元になっています。

また、ルールは プレビュー モードにすることができ、実際のアクション (拒否 /許可) を行わずにログ記録だけをさせることもできます。

名前付き IP アドレスリスト

名前付き IP アドレスリストとは、サードパーティの CDN (Contents Delivery Network) プロバイダが管理する IP アドレスのリストです。
2021 年 12 月現在では Fastly, CloudFlare, Imperva が名前付き IP アドレスリストを提供しています。
これらの CDN を利用している場合は、セキュリティポリシーにて名前付き IP アドレスリストを許可対象として指定し、その他をブロックすることで、 CDN 以外からのアクセスをブロックすることができます。

ただし、名前付き IP アドレスリストは通常版では使用できません。追加料金を支払い Managed Protection Plus サブスクリプションに登録する必要があります。

ルール記述方法

詳細モードのルールでは前述の通り、カスタムルール言語を使ってルールを記述する必要があります。
この言語を使って、 Google の 事前構成されたルール (Preconfigured rules) を呼び出すのが基本的な使い方となります。

以下は、最も簡単な例です。 SQL インジェクションを防ぐ事前構成ルールを呼んでいます。

evaluatePreconfiguredExpr('sqli-stable')

ただし、この書き方だと、事前構成ルール sqli-stable に含まれている全ての SQL インジェクション対策のシグネチャが反応してしまいます。
偽陽性 (本当は正しいリクエストなのに、不正リクエストとして検知されてしまうこと) が起こりやすい状態です。
偽陽性の可能性を下げるために、感度レベルの高いシグネチャを無効化するよう指定することができます。

# ルール名の後に無効化するシグネチャ名を入力
evaluatePreconfiguredExpr('sqli-stable', ['owasp-crs-v030001-id942421-sqli', 'owasp-crs-v030001-id942432-sqli'])

また || (パイプ×2)を使ってルールをOR条件で繋げることができます。
以下のようにルールを数珠つなぎにしてアクションを ブロック にすれば、1つのルールの中で複数の事前構成ルールを呼び出すことができます。

evaluatePreconfiguredExpr('xss-stable') || 
evaluatePreconfiguredExpr('sqli-stable')

どの攻撃に対してどのルールを追加しなければいけないのか、また感度レベル別のシグネチャ名などは、以下のドキュメントを参照してください。

DDoS 保護機能

通常版 (Standard) の機能

Managed Protection Plus サブスクリプションに登録していない通常版 (Standard) ティアの場合でも、 Cloud Armor には一定の DDoS 対策機能が備わっています。 公式ドキュメントでは グローバルに負荷分散されたインフラストラクチャ全体で、ボリューム型およびプロトコル ベースの DDoS 攻撃を常時阻止できます。 と説明されています。

DDoS 対応サポート

Managed Protection Plus サブスクリプションに登録するのに加え、同時に Google Cloud のプレミアムサポートにも登録している場合、 DDoS 対応サポート を利用することができます。

Google の DDoS 対策チームと連絡を取るためには、コンソールのサポート画面からケースを起票します。
DDoS 対策チームからは サポート、トリアージ、潜在的な回避策の提示 を受けることができます。

DDoS 請求対策

万が一、 Web アプリケーションが DDoS 攻撃を受けてしまい、多大なトラフィックが発生してしまった影響で Cloud Load Balancing, Google Cloud Armor, ネットワーク下り料金などが大量発生してしまった場合、 Google に申請することで該当の利用料金に充当できるクレジットを受けられる場合があります。

詳細は以下を確認してください。

DDoS 請求対策を使うには Managed Protection Plus サブスクリプションに登録する必要があります。

Adaptive Protection

有効化

Adaptive Protection は HTTP Flood などのレイヤ 7 の DDoS 攻撃と思われる怪しい挙動を検知し、機械学習モデルによってアラートを出したり、防御のためのシグネチャを自動生成する機能です。
日本語ドキュメントでは 適応型保護 とも訳されます。

Adaptive Protection のフル機能を利用するためには Managed Protection Plus サブスクリプションに登録する必要があります。
通常版だとアラートのみです。

Adaptive Protection はセキュリティポリシー単位で有効化できます。
有効化後、機械学習によってベースラインが確立され、アラート生成ができるようになるまで最低でも 1 時間のトレーニングが必要とされています。

アラート

トレーニング期間中にトラフィックパターンが学習され、学習後に高頻度または大容量の異常トラフィックが検出されると、 Cloud Logging にアラートが生成されます。
アラートには 信頼度レベル , 攻撃シグネチャ , 推奨ルール , ベースラインのうち影響を受ける割合の予測値 が含まれます。

信頼度レベル とは、機械学習モデルが予測した結果の確からしさ (確率。 0 〜 1 の数値) です。
ベースラインのうち影響を受ける割合の予測値 とは、自動生成されるルールが実際に適用された場合にベースラインのうちどれくらいの割合のトラフィックが影響を受けるか、という予測値です。

自動生成ルールの適用

自動生成ルールを適用するには以下の 2 つの方法があります。

  • Cloud Logging に出力されたアラートにルール名が出るので、それを使ってセキュリティポリシーにルールを書く
  • コンソール画面の Adaptive Protection ダッシュボードから GUI で適用する

このように簡単にルールを適用することができますが、実際にはプレビューモードで試運転することが推奨されます。
いきなり実稼働させると、正しいトラフィックにまで予想外の影響が出る可能性があるためです。

プレビュー版の機能

Bot 管理

2021 年 12 月現在ではプレビュー版ですが、 reCAPTCHA Enterprise との統合により bot 対策ができる機能があります。

トラフィックを reCAPTCHA の確認画面 (私はロボットではありません など) へリダイレクトするなどして bot を弾くことができます。
詳細は、以下を参照してください。

レート制限

2021 年 12 月現在ではプレビュー版ですが、 レート制限機能 があります。
この機能では、少数のクライアントからの大量アクセスを検知して、 スロットル (アクセス数上限) をかけたり、そのクライアントを Ban (禁止) したりできます。

例えば、 20 分間で 2000 リクエスト という上限をルールに設定し、それを超えた場合はアクセス数を制限したり、あるいはそのクライアントを指定した秒数の間、アクセス禁止にすることができます。

ルールの作成方法は以下を参照してください。

運用と注意点

WAF の運用作業

Cloud Armor に限らず、 WAF 製品には運用が必要です。
例として、以下のような作業があるでしょう。

  • 誤検知 (偽陽性) 対応
  • 新たに見つかった脆弱性の対応

前者は、例えば Web アプリケーションの仕様変更により、これまで引っかからなかったトラフィックが不正アクセスとして WAF にブロックされてしまうようなときに、明示的に許可したり誤検知しているルールを無効化したりする作業です。
ブロックされた場合は Cloud Logging に DENY された旨と、その原因になったシグネチャが記録されますので、それを確認します。

また後者では、脆弱性に関する情報収集を適切に行い、ルールを管理していきます。
事前構成ルールを使用していれば基本的にはルールが自動的に更新されていきます。
しかし、世の中を揺るがすような深刻な脆弱性が発生した際には、手動でルールを追加する必要性が出てくるかもしれません。

例として 2021 年 12 月には、広く利用されている Java 用のログ出力ライブラリである log4j の脆弱性が見つかり、各社は対応に追われました。
そのときには Google が新しい事前構成ルール cve-canary を迅速に開発・アップデートしたため、対策を行うことができました。
その際の対応方法は、以下のブログ投稿をご参照ください。

medium.com

構築時の注意点

なお、 WAF の前述のようなブロックログを見るためには Cloud Load Balancing 側でログを有効化 する必要がある点に注意してください。
デフォルトで Cloud Armor 自体の監査ログは出力されます。しかし、これにはセキュリティポリシーの設定変更など管理的なログが記録されるだけで、 トラフィックがブロックされた場合のログなどは出力されません

料金

通常版 (Standard Tier)

Cloud Armor は通常版では以下の 3 軸で料金が計算される、従量課金制です。

  • 処理するリクエスト数 ($0.75/100 万件)
  • セキュリティポリシー数 ($5 / 件)
  • ルール数 ($1 / 件)

カッコ内の料金は 2021 年 12 月現在の金額です。
最新の料金は、以下の公式ドキュメントをご参照ください。

cloud.google.com

Managed Protection Plus Tier

前述の通り、 Cloud Armor では追加料金を支払って Managed Protection Plus サブスクリプションに登録することができます。
月額で固定の料金が発生する代わりに、ルールごと / セキュリティポリシーごと / リクエストごとの従量課金が無くなります。
最低契約期間は 1 年間です。

通常版の機能に加えて、以下の機能が使えるようになります。

  • 名前付き IP アドレスリスト
  • Adaptive Protection のルール自動生成
  • DDoS 対応サポート (プレミアムサポートにも同時に加入している場合のみ)
  • DDoS 請求対策

サブスクリプション料金は 2021 年 12 月現在、 $ 3,000 /月 です。

これに加えて、 下りのデータ処理量に応じた従量料金 も発生します。
Cloud Load Balancing の場合は $0.05 /TB です (0〜100TB まで。それ以上は徐々に安くなる) 。

最新の料金や課金方法の詳細は、前述の公式ドキュメントをご参照ください。

杉村 勇馬 (記事一覧)

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

クラウド管理運用やネットワークに知見あり。AWSの全12資格をコンプリートしたので、次はGoogle Cloudの認定資格を狙っている。現在、Google Cloud認定資格は4冠。

2022年1月現在、ハマっているものはディズニープラスで見られるマーベルのドラマシリーズ。

(Wantedlyプロフィール)