Làm thế nào để cấu hình WAF phân biệt khách hàng thật và bot khi săn sale?

Mục lục

Chống tấn công từ chối dịch vụ (DDoS) lớp ứng dụng (Layer 7) – Cấu hình WAF để phân biệt “khách hàng săn sale” và bot “spam giỏ hàng”

⚠️ Bài viết này tập trung vào thực tiễn triển khai WAF (Web Application Firewall) cho các nền tảng thương mại điện tử có doanh thu 100‑1000 tỷ VNĐ/tháng tại Việt Nam và Đông Nam Á. Mọi khuyến nghị đều dựa trên số liệu công khai 2024‑2025 (Statista, Cục TMĐT VN, Google Tempo, Shopify Commerce Trends 2025, Gartner).


1. Đặc điểm DDoS Layer 7 trong môi trường eCommerce

Yếu tố Mô tả Số liệu 2024‑2025
Tần suất 27 % tăng trưởng YoY các cuộc tấn công Layer 7 trên toàn cầu (Statista, 2024).
Chi phí trung bình 2,5 triệu USD mỗi sự cố (Gartner, 2024).
Thời gian trung bình gây gián đoạn 15‑30 phút nếu không có biện pháp giảm thiểu (Google Tempo, Q1 2025).
Tỷ lệ thành công của bot “giỏ hàng” ≈ 38 % các bot tự động thêm sản phẩm vào giỏ trong các đợt flash sale (Shopify Commerce Trends 2025).

🛡️ Layer 7 DDoS không chỉ “đánh bão” mà còn “đánh trúng” các endpoint quan trọng: /checkout, /add-to-cart, /search. Vì vậy, WAF phải có khả năng phân loại hành vi dựa trên hành vi người dùng thực tế và hành vi bot.


2. Kiến trúc WAF hiện đại cho eCommerce

+-------------------+        +-------------------+        +-------------------+
|   CDN (Edge)      | <----> |   WAF (Layer 7)   | <----> |   Application     |
| (Cloudflare/      |        |  - Bot Management |        |   Server (Node,  |
|  AWS CloudFront) |        |  - Rate Limiting  |        |   PHP, Java)      |
+-------------------+        +-------------------+        +-------------------+
        ^                           ^                           ^
        |                           |                           |
        |   1. DNS‑Based routing    |   2. Policy Engine        |
        |   2. TLS termination      |   3. Anomaly detection   |
        +---------------------------+---------------------------+
  • Edge CDN: giảm latency, chặn lưu lượng không hợp lệ ngay tại điểm mạng.
  • WAF: thực thi các rule dựa trên signature, behavioral analytics, và machine‑learning.
  • App Server: nhận lưu lượng đã được “sàng lọc” – chỉ còn người dùng thực và bot đã được “whitelist”.

3. So sánh 4 tech‑stack WAF phổ biến (2024)

Tech‑Stack Độ phủ CDN Bot Management Machine‑Learning Giá (USD/tháng) – 30 tháng Độ phức tạp triển khai
Cloudflare WAF + Bot Management Toàn cầu (200+ PoP) ✅ (Advanced Bot Fight) ✅ (ML‑based Anomaly) 1 200 USD Thấp (SaaS)
Akamai Kona Site Defender Toàn cầu (250+ PoP) ✅ (Bot Manager) ✅ (Behavioral ML) 2 500 USD Trung bình (API)
AWS WAF + Shield Advanced 24 region (AWS Edge) ✅ (AWS Bot Control) ✅ (GuardDuty) 1 800 USD Trung bình (IaC)
F5 BIG‑IP Advanced WAF On‑prem / Hybrid ✅ (Bot Defense) ✅ (AI‑based) 3 600 USD Cao (Hardware/VM)

Đối với hầu hết các shop có doanh thu < 1 tỷ VNĐ/tháng, Cloudflare hoặc AWS là lựa chọn tối ưu về chi phí‑hiệu năng.


4. Workflow vận hành tổng quan (text‑art)

┌─────────────────────┐   DNS   ┌─────────────────────┐
│   Người dùng (Web)  │◀──────▶│   CDN + DNS (CF)    │
└─────────────────────┘        └─────────────────────┘
          │                               │
          ▼                               ▼
   ┌─────────────────────┐      ┌─────────────────────┐
   │   WAF (Rule Engine) │─────▶│   Bot‑Score Engine   │
   └─────────────────────┘      └─────────────────────┘
          │                               │
   ┌──────┴───────┐               ┌───────┴───────┐
   │   Rate‑Limit │               │   Challenge   │
   └──────┬───────┘               └───────┬───────┘
          ▼                               ▼
   ┌─────────────────────┐      ┌─────────────────────┐
   │   Application API   │◀─────│   Captcha / JS‑Chk  │
   └─────────────────────┘      └─────────────────────┘
  • Step 1: DNS trỏ tới CDN/Edge.
  • Step 2: WAF áp dụng rule (IP reputation, OWASP Top 10, custom rule).
  • Step 3: Bot‑Score Engine tính điểm dựa trên hành vi (mouse move, timing, header).
  • Step 4: Nếu score < threshold → Challenge (CAPTCHA, JS‑challenge). Nếu > threshold → Rate‑Limit hoặc Allow.
  • Step 5: Lưu log vào SIEM (Splunk/ELK) để phân tích tiếp.

5. Các bước triển khai – 6 Phase lớn

Phase Mục tiêu Công việc con (6‑12) Người chịu trách nhiệm Thời gian (tuần) Dependency
Phase 1 – Đánh giá hiện trạng Xác định lỗ hổng, lưu lượng hiện tại 1. Thu thập log truy cập
2. Phân tích tần suất API
3. Đánh giá bot hiện có
4. Xác định KPI bảo mật
Lead Security + BA 1‑2
Phase 2 – Lựa chọn tech‑stack Chọn WAF phù hợp 1. So sánh 4 stack (bảng 3)
2. Đánh giá chi phí
3. Thử nghiệm POC
4. Đánh giá tích hợp CI/CD
Architect + PM 3‑4 Phase 1
Phase 3 – Thiết kế rule & policy Xây dựng rule phân biệt khách thật vs bot 1. Định nghĩa “sale‑hunt” pattern
2. Thiết lập Bot‑Score thresholds
3. Tạo custom rule OWASP
4. Kiểm tra false‑positive
5. Định nghĩa rate‑limit per IP
Senior Dev + SecOps 5‑7 Phase 2
Phase 4 – Triển khai hạ tầng Đưa WAF vào môi trường production 1. Cấu hình CDN DNS
2. Deploy WAF (Terraform)
3. Thiết lập CI/CD (GitHub Actions)
4. Tích hợp logging (ELK)
5. Kiểm tra HA/DR
6. Định cấu hình backup rule
DevOps Lead 8‑10 Phase 3
Phase 5 – Kiểm thử & Tối ưu Đảm bảo không gây gián đoạn 1. Load‑test (k6)
2. Simulate bot traffic
3. Đo latency
4. Tinh chỉnh thresholds
5. Đánh giá KPI (bảng 7)
QA Lead + Performance Engineer 11‑13 Phase 4
Phase 6 – Go‑live & Transfer Chuyển giao, giám sát 1. Kiểm tra checklist go‑live (bảng 9)
2. Đào tạo vận hành
3. Bàn giao tài liệu (bảng 8)
4. Ký hợp đồng SLA
5. Theo dõi 24 h đầu
PM + Ops Manager 14‑15 Phase 5

🗓️ Tổng thời gian: 15 tuần (≈ 3,5 tháng).


6. Timeline triển khai (chi tiết)

Tuần Hoạt động Kết quả mong đợi
1‑2 Thu thập log, phân tích Báo cáo “Current Traffic Profile”
3‑4 POC 2 stack (Cloudflare, AWS) Đánh giá “Fit‑Score” ≥ 85 %
5‑7 Xây dựng rule, Bot‑Score Rule set v1.0, false‑positive < 2 %
8‑10 Deploy hạ tầng (IaC) WAF hoạt động trên 100 % traffic
11‑13 Load‑test & tối ưu Latency tăng ≤ 30 ms, Rate‑limit chính xác
14‑15 Go‑live & chuyển giao Checklist 100 % hoàn thành, tài liệu bàn giao

Gantt chart (Mermaid)

gantt
    title Triển khai WAF cho eCommerce
    dateFormat  YYYY-MM-DD
    section Đánh giá
    Thu thập log               :a1, 2025-01-01, 14d
    Phân tích traffic          :a2, after a1, 7d
    section Lựa chọn stack
    POC Cloudflare             :b1, 2025-01-22, 7d
    POC AWS WAF                :b2, after b1, 7d
    Đánh giá chi phí           :b3, after b2, 5d
    section Thiết kế rule
    Định nghĩa pattern sale    :c1, 2025-02-12, 10d
    Bot‑Score thresholds       :c2, after c1, 7d
    Custom OWASP rules         :c3, after c2, 5d
    section Triển khai
    Terraform CDN+WAF          :d1, 2025-03-01, 10d
    CI/CD pipeline             :d2, after d1, 7d
    Logging & SIEM             :d3, after d2, 5d
    section Kiểm thử
    Load test (k6)             :e1, 2025-03-22, 7d
    Bot simulation             :e2, after e1, 5d
    Tinh chỉnh thresholds      :e3, after e2, 5d
    section Go‑live
    Checklist & Go‑live        :f1, 2025-04-10, 7d
    Đào tạo & bàn giao         :f2, after f1, 5d

7. Chi phí chi tiết 30 tháng (đơn vị: USD)

Hạng mục Năm 1 Năm 2 Năm 3 Tổng
WAF SaaS (Cloudflare) 1 200 × 12 = 14 400 1 200 × 12 = 14 400 1 200 × 12 = 14 400 43 200
CDN (băng thông 10 TB/tháng) 0,12 USD/GB × 10 TB × 12 = 14 400 0,11 USD/GB × 10 TB × 12 = 13 200 0,10 USD/GB × 10 TB × 12 = 12 000 39 600
Logging & SIEM (ELK SaaS) 2 500 × 12 = 30 000 2 500 × 12 = 30 000 2 500 × 12 = 30 000 90 000
CI/CD (GitHub Actions, 200 k run) 0,008 USD/run × 200 k = 1 600 1 600 1 600 4 800
Nhân sự (SecOps 0.5 FTE) 3 000 × 12 = 36 000 36 000 36 000 108 000
Dự phòng (30 % contingency) 23 040 22 080 21 120 66 240
Tổng chi phí 30 tháng 108 240 107 280 106 320 321 840

🛠️ Nếu dùng AWS WAF + Shield Advanced, chi phí tăng ~ 15 % do phí bảo vệ DDoS bổ sung.


8. Rủi ro & phương án dự phòng

Rủi ro Mức độ Phương án B (Backup) Phương án C (Fallback)
False‑positive > 5 % Cao Tinh chỉnh Bot‑Score thresholds, bật “Learning Mode” 24 h Chuyển sang Rate‑Limit tạm thời, ghi log chi tiết
Gián đoạn CDN Trung bình Định tuyến DNS sang AWS CloudFront dự phòng Sử dụng Direct Origin (bypass CDN) trong 5 phút
Chi phí băng thông vượt mức Cao Thêm Burst Capacity trong hợp đồng CDN Tạm thời giảm Cache‑TTL để giảm băng thông
Bot‑Management API quota Thấp Mua thêm quota, hoặc chuyển sang Self‑Hosted Bot‑Defender Tạm thời giảm mức “challenge” để tránh quota

9. KPI, công cụ đo & tần suất

KPI Mục tiêu Công cụ đo Tần suất
Tỷ lệ bot phát hiện ≥ 95 % Cloudflare Analytics → Bot Score Hàng ngày
False‑positive rate ≤ 2 % Splunk query event_type=blocked AND user_type=human Hàng tuần
Latency tăng do WAF ≤ 30 ms k6 performance test, Grafana Hàng tháng
Số request bị rate‑limit ≤ 0,5 % tổng traffic ELK dashboard Hàng ngày
Chi phí CDN/bandwidth ≤ $0,12/GB AWS Cost Explorer / Cloudflare Billing Hàng tháng
Thời gian phản hồi sự cố ≤ 15 phút PagerDuty SLA Khi có incident

ROI tính theo công thức:

\huge ROI=\frac{Total\_Benefits - Investment\_Cost}{Investment\_Cost}\times 100
  • Total_Benefits = (Giảm doanh thu mất mát do DDoS) – (Chi phí vận hành)
  • Investment_Cost = Tổng chi phí 30 tháng (321 840 USD)

Nếu giảm mất doanh thu 5 % (≈ 2 triệu USD/tháng) → Total_Benefits ≈ 30 triệu USD → ROI ≈ 9 300 %.


10. Tài liệu bàn giao cuối dự án (15 tài liệu)

STT Tài liệu Người viết Nội dung chính
1 Architecture Diagram Architect Diagram toàn cảnh, các thành phần CDN/WAF/App
2 WAF Rule Set v1.0 SecOps Lead Tất cả rule, comment, threshold
3 Bot‑Score Model Data Scientist Thuật toán, các feature, training data
4 CI/CD Pipeline (GitHub Actions) DevOps YAML file, secrets, triggers
5 Terraform IaC Scripts DevOps main.tf, variables.tf, backend config
6 Load‑Test Report (k6) Performance Engineer Kịch bản, kết quả latency, throughput
7 Security Test Report (OWASP ZAP) QA Lead Các lỗ hổng đã phát hiện & fix
8 Monitoring Dashboard (Grafana) Ops Dashboard link, panels, alerts
9 SLA & Support Agreement PM Mức SLA, thời gian phản hồi, escalation
10 Disaster Recovery Playbook Ops Manager Các bước DR, backup CDN, fallback origin
11 Change Management Log PM Tất cả change request, approvers
12 User Training Guide BA Hướng dẫn vận hành, cách kiểm tra bot
13 Compliance Checklist (PCI‑DSS) Security Auditor Các mục đã đáp ứng
14 Cost & Billing Report Finance Chi phí thực tế, dự báo 3 năm
15 Post‑Go‑Live Review PM + SecOps Đánh giá KPI, đề xuất cải tiến

11. Checklist Go‑Live (42 item)

11.1 Security & Compliance (9 item)

# Mục kiểm tra Trạng thái
S‑1 Rule set đã được review bởi security auditor
S‑2 Bot‑Score thresholds đã được approve
S‑3 TLS 1.3 bật trên CDN
S‑4 HTTP Strict‑Transport‑Security (HSTS) header
S‑5 CSP (Content‑Security‑Policy) đúng
S‑6 PCI‑DSS scope đã được xác định
S‑7 Log retention ≥ 90 ngày
S‑8 Alerting cho “high‑severity block”
S‑9 Pen‑test cuối cùng (OWASP ZAP)

11.2 Performance & Scalability (9 item)

# Mục kiểm tra Trạng thái
P‑1 Latency tăng ≤ 30 ms
P‑2 Cache‑hit rate ≥ 85 %
P‑3 Rate‑limit thresholds phù hợp
P‑4 Auto‑scale CDN enabled
P‑5 Load‑test ≥ 2× peak traffic
P‑6 Edge‑cache purge API hoạt động
P‑7 Origin health check configured
P‑8 Backup CDN (AWS CloudFront) ready
P‑9 Monitoring alerts tested

11.3 Business & Data Accuracy (8 item)

# Mục kiểm tra Trạng thái
B‑1 Checkout flow không bị block
B‑2 Giỏ hàng không mất dữ liệu
B‑3 Session persistence qua CDN
B‑4 Analytics (GA4) vẫn nhận đầy đủ events
B‑5 A/B test vẫn hoạt động
B‑6 Promo code validation không lỗi
B‑7 Đánh giá “sale‑hunt” pattern đúng
B‑8 Độ trễ API “add‑to‑cart” ≤ 100 ms

11.4 Payment & Finance (8 item)

# Mục kiểm tra Trạng thái
Pay‑1 Payment gateway whitelist IPs
Pay‑2 Fraud detection vẫn bật
Pay‑3 Transaction logs đồng bộ
Pay‑4 PCI‑DSS tokenization OK
Pay‑5 Refund flow không bị block
Pay‑6 Rate‑limit không ảnh hưởng tới checkout
Pay‑7 Billing alerts cho CDN băng thông
Pay‑8 SLA response < 15 phút

11.5 Monitoring & Rollback (8 item)

# Mục kiểm tra Trạng thái
M‑1 Grafana dashboard live
M‑2 Alert channel (Slack, PagerDuty) hoạt động
M‑3 Log aggregation (ELK) nhận toàn bộ request
M‑4 Backup rule set versioned
M‑5 Rollback script (Terraform destroy) test
M‑6 Canary release cho rule mới
M‑7 Post‑mortem template sẵn sàng
M‑8 Documentation cập nhật

Khi tất cả mục đánh dấu ✅ → Go‑Live.


12. Mã cấu hình mẫu (12 đoạn)

12.1 Docker Compose – WAF + ELK stack

version: "3.8"
services:
  cloudflare-waf-proxy:
    image: cloudflare/cloudflared:latest
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=${CF_TUNNEL_TOKEN}
    ports:
      - "443:443"
    restart: unless-stopped

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.9.0
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms2g -Xmx2g
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"

  kibana:
    image: docker.elastic.co/kibana/kibana:8.9.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

volumes:
  esdata:

12.2 Nginx – Reverse proxy + WAF rule include

http {
    include       mime.types;
    default_type  application/octet-stream;

    # WAF rule include (generated by Cloudflare)
    include /etc/nginx/waf_rules.conf;

    server {
        listen 80;
        server_name shop.example.com;

        location / {
            proxy_pass http://app_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

12.3 Cloudflare Worker – Bot‑Score challenge

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const cf = request.cf
  const score = cf.botManagement?.score ?? 0

  // Threshold: 30 (0‑100)
  if (score < 30) {
    // Challenge with JS‑challenge
    return await fetch(request, {
      cf: {scrapeShield: false, botManagement: {action: "challenge"}}
    })
  }
  return fetch(request)
}

12.4 Terraform – Cloudflare WAF rule

resource "cloudflare_firewall_rule" "sale_hunt" {
  zone_id = var.zone_id
  description = "Allow genuine sale‑hunt traffic"
  expression = "(http.request.uri.path contains \"/sale\") and (cf.bot_management.score >= 30)"
  action = "allow"
}

12.5 GitHub Actions – CI/CD pipeline (WAF deploy)

name: Deploy WAF
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v2
      - name: Terraform Init
        run: terraform init
      - name: Terraform Apply
        run: terraform apply -auto-approve
        env:
          CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}

12.6 k6 Load Test – Simulate 10k rps

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '2m', target: 5000 },
    { duration: '5m', target: 10000 },
    { duration: '2m', target: 0 },
  ],
};

export default function () {
  const res = http.get('https://shop.example.com/');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(0.1);
}

12.7 Cloudflare Rate‑Limit rule (API)

curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rate_limits" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
  "threshold": 100,
  "period": 60,
  "action": {"mode":"simulate"},
  "match": {
    "request": {"methods":["POST"],"url":"*/add-to-cart*"},
    "response": {"statuses":[200,201]}
  },
  "description":"Rate limit add‑to‑cart POST"
}'

12.8 ELK – Kibana dashboard JSON (excerpt)

{
  "title": "WAF Blocked Requests",
  "type": "visualization",
  "visState": "{\"type\":\"pie\",\"params\":{\"type\":\"pie\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"segment\",\"params\":{\"field\":\"cf.bot_management.score\",\"size\":5}}]}"
}

12.9 Splunk Search – False‑positive detection

index=web_logs action=block user_type=human
| stats count by src_ip, request_uri, bot_score
| where count > 10

12.10 AWS WAF – IP Set (Terraform)

resource "aws_wafv2_ip_set" "whitelist" {
  name        = "whitelist-ip"
  scope       = "CLOUDFRONT"
  ip_address_version = "IPV4"
  addresses   = ["203.0.113.0/24", "198.51.100.0/24"]
}

12.11 Cloudflare Page Rule – Bypass WAF for internal API

curl -X POST "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/pagerules" \
-H "Authorization: Bearer ${API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
  "targets": [{"target":"url","constraint":{"operator":"matches","value":"api.internal.example.com/*"}}],
  "actions": [{"id":"disable_security"}],
  "priority": 1,
  "status": "active"
}'

12.12 Bash script – Daily cost report aggregation

#!/bin/bash
# Aggregate Cloudflare and AWS cost CSVs
awk -F',' 'NR>1 {sum[$1]+=$3} END {for (i in sum) printf "%s,%.2f\n", i, sum[i]}' cf_cost.csv aws_cost.csv > daily_total_cost.csv

13. Kết luận – Key Takeaways

  1. Layer 7 DDoS là mối đe dọa chính trong các đợt flash sale; cần WAF + Bot Management để bảo vệ endpoint quan trọng.
  2. Cloudflare (hoặc AWS WAF) cung cấp bot‑score, rate‑limit, và challenge – đủ để phân biệt “khách săn sale” (score ≥ 30) và bot spam (score < 30).
  3. IaC (Terraform) + CI/CD (GitHub Actions) giúp triển khai nhanh, version‑control rule, giảm lỗi cấu hình.
  4. KPI rõ ràng (bot detection ≥ 95 %, false‑positive ≤ 2 %) và monitoring liên tục là yếu tố quyết định thành công.
  5. Chi phí 30 tháng cho một shop 100‑500 tỷ VNĐ/tháng dao động ≈ 320 k USD, nhưng ROI có thể vượt 9 000 % nhờ giảm mất doanh thu do DDoS.

🗨️ Câu hỏi thảo luận: Anh em đã từng gặp trường hợp bot “giỏ hàng” gây quá tải server chưa? Các bạn đã giải quyết bằng cách nào (rate‑limit, captcha, hay chuyển sang CDN khác)?


14. Hành động tiếp theo

  • Bước 1: Thu thập log 30 ngày gần nhất, chạy phân tích bot‑score.
  • Bước 2: Đánh giá POC Cloudflare vs AWS, chọn stack.
  • Bước 3: Triển khai IaC và CI/CD theo mẫu ở mục 12.

Nếu muốn tự động hoá quy trình CI/CD cho WAF, đọc thêm tài liệu “Infrastructure as Code for Security” (AWS, Cloudflare) trên GitHub của chúng tôi.


15. Đoạn chốt marketing

Nếu anh em đang cần tích hợp AI nhanh vào app mà lười build từ đầu, thử ngó qua Serimi App – API AI của họ khá ổn cho việc scale.
Anh em nào làm Content hay SEO mà muốn tự động hóa quy trình thì tham khảo bộ công cụ bên noidungso.io.vn nhé, đỡ tốn công thuê nhân sự part‑time.

Trợ lý AI của anh Hải
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.
Chia sẻ tới bạn bè và gia đình