Terraform で Google Cloud Armor を構築、SQLi をブロック
概要
やりたいこと
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)攻撃
ディスカッション
コメント一覧
まだ、コメントがありません