Terraform で Google Cloud Armor を構築、SQLi をブロック

2021年2月14日

概要

やりたいこと

Web サイトへの SQL Injection や XSS などの攻撃をブロックしたい。
GCP は WAF サービスとして Cloud Armor を提供しているため、これを利用する。

Cloud Armor は LB に紐付けるため、前回構築した環境を流用する。

Cloud Armor とは

Google Cloud Armor は、LB へのアクセスを拒否するリクエストを判定する。

セキュリティポリシーは、受信リクエストの IP アドレス、IP 範囲、リージョン コード、リクエストヘッダーなどの条件に基づいてトラフィックをフィルタリングする。

Terraform

Cloud Armor 基本モード

下記 Terraform テンプレートを使用する(Cloud Armor と一文字も出てこないけど)。

サンプルの 9.9.9.0/24 のアクセスを除外する Cloud Armor ポリシーを作成。

vi armor.tf
resource "google_compute_security_policy" "policy" {
  name = "my-policy"

  rule {
    action   = "deny(403)"
    priority = "1000"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["9.9.9.0/24"]
      }
    }
    description = "Deny access to IPs in 9.9.9.0/24"
  }

  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
}

デプロイ。

terraform apply

「ネットワークセキュリティ」→「セキュリティポリシー」→「my-policy」より、IP 制限を行うポリシーが作成される。

LB へのアタッチは手動で行う必要がある。

Cloud Armor 詳細モード

SQL injection をブロックするルールを作成する。

resource "google_compute_security_policy" "sqli" {
  name = "lb-policy"

  rule {
    action   = "deny(403)"
    priority = "1000"

    match {
      expr {
        expression = "evaluatePreconfiguredExpr('sqli-canary')"
      }
    }
    description = "SQLi"

  }

  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
}

デプロイ

terraform apply

以下のようなポリシーが作成される。

ターゲット(LB) への適用は手動で行う必要がある。

試す

正常アクセス。200 が返る。

curl "http://34.117.94.129/index.html"

SQLi 攻撃。403 が返りブロックされていることを確認できた。

curl "http://34.117.94.129/index.html?var='or'A='A'"

SQLi 以外の WAF ルールはここから確認できる。

  • クロスサイト スクリプティング(XSS)
  • SQL インジェクション(SQLi)攻撃
  • ローカル ファイル インクルード(LFI)攻撃
  • リモート ファイル インクルード(RFI)攻撃
  • リモートコード実行(RCE)攻撃

参考

GCP Cloud ArmorでXSS、SQLインジェクションのWAF導入