概要
やりたいこと
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)攻撃
コメント