Ravindra BagaleCourses & study guides English Track your progress

AWS WAF Hands-On: Rate Rules, IP Sets, Geo, SQLi/XSS, Logging आणि Attachments

Hands-on WAF: rate, IP set, geo, SQLi/XSS, custom response, ALB/API GW/CF/AppSync/Cognito attach, S3/CW/Firehose logs, curl 403. CDN setup = survey chapter.

या chapter मध्ये तुम्ही काय शिकाल

  • Rate/IP/geo/SQLi/XSS
  • Attachments
  • Logging
  • curl 403
  • Cleanup

1. रोजचा lab story

Priya Nair (कोची) ALB: office Allow, geo IN+AE, CRS+SQLi, /login rate, 429, S3 logs. Amina Okello = API GW same pattern.

CloudFront attach/HTTPS: survey.

2. Hands-on का?

हे का लागतं?

curl 403 = Block proof. Logs = forensics. Wrong scope = silent fail.

3. काय बनवाल

हे काय आहे?

  1. Office IP set
  2. Geo IN+AE
  3. /login rate
  4. SQLi + CRS
  5. Custom response
  6. Attachments
  7. Logging
  8. Proofs

4. How: IP + geo + rate

कसं करायचं (step by step)

export AWS_REGION=ap-south-1
export NAME=rb-waf-handson-$(date +%s)

aws wafv2 create-ip-set --name $NAME-office --scope REGIONAL --region $AWS_REGION \
  --ip-address-version IPV4 --addresses 203.0.113.10/32 198.51.100.20/32
# note Id + LockToken from output

# rules.json sketch (priorities):
# 100 Allow if IPSetReference office
# 200 Block if NOT GeoMatch [IN, AE]   (careful with travel users)
# 500 Managed SQLi Count override
# 510 Managed CRS Count override
# 900 RateBasedStatement Limit=1000 AggregateKeyType=IP
#     scoped down with ByteMatch /login in ScopeDownStatement

Rate key: IP / forwarded IP / method / query / header / cookie / label. Abuse नुसार निवडा.

5. SQLi आणि XSS

Managed SQLi + CRS XSS > hand regex. Count first. CMS editor = exclusions.

6. Custom responses

# Custom response body on the Web ACL, then reference from a Block action
# Example: 429 with JSON {"error":"slow_down","retry_after":60}
# Console: Web ACL → Custom response bodies → Add
# Or CLI create-web-acl / update-web-acl with CustomResponseBodies map

7. प्रत्येक resource ला attach

ResourceHow
ALBREGIONAL; ALB ARN
API GWREGIONAL; stage/API ARN
CloudFrontus-east-1; WebACLId
AppSyncREGIONAL AppSync
CognitoREGIONAL Cognito
# ALB
aws wafv2 associate-web-acl --web-acl-arn "$WEB_ACL_ARN" --resource-arn "$ALB_ARN" --region $AWS_REGION

# CloudFront (ACL must already exist in us-east-1 with --scope CLOUDFRONT)
aws cloudfront get-distribution-config --id E123 > /tmp/d.json
# set WebACLId to ACL ARN, raise ETag IfMatch, update-distribution

8. Logging

Destinations: S3 / CW Logs / Firehose. Naming aws-waf-logs-* rules पाहा. KMS + lifecycle.

aws wafv2 put-logging-configuration --region $AWS_REGION --logging-configuration \
  ResourceArn=$WEB_ACL_ARN,LogDestinationConfigs=$LOG_BUCKET_ARN,RedactedFields=[]
# Then: aws s3 ls s3://aws-waf-logs-rb-lab/ --recursive | tail

9. curl ने test (200 आणि 403)

# ALLOW — normal homepage
curl -s -o /dev/null -w "%{http_code}\n" https://clinic.example.com/
# 200

# BLOCK — classic SQLi probe (after SQLi rules are in Block mode)
curl -s -o /dev/null -w "%{http_code}\n" \
  "https://clinic.example.com/search?q=1%27%20OR%20%271%27%3D%271"
# 403

# RATE — hammer /login from one IP (lab only)
for i in $(seq 1 1200); do curl -s -o /dev/null https://clinic.example.com/login & done
wait
curl -s -o /dev/null -w "%{http_code}\n" https://clinic.example.com/login
# 403 (once rate key exceeds Limit)

फक्त स्वतःच्या systems

परक्या sites वर SQLi/rate = illegal. Lab hostnames.

10. Multi-industry

  • Fintech: API GW + Firehose
  • Ecommerce: CF + 429
  • SaaS: ALB + CW
  • EdTech: Challenge
  • Gov: ALB+Cognito

11. Lab: ALB WAF + rate + SQLi + logs

Org block नसेल तर ap-south-1 (Mumbai). आधी budget alert.

कसं करायचं (step by step)

  1. Create ACL.
  2. Add rules.
  3. Associate + logs.
  4. 200 + 403.
  5. Count→Block.

Cleanup (billing थांबवा)

  1. Disassociate.
  2. Logs cleanup.
  3. Delete ACL/IP.

12. सामान्य errors आणि fixes

प्रत्येक row = खरी चूक. Panic करण्याआधी fix वाचा.

Error / लक्षणFix
No blocksScope + Count.
False positiveCount + Allow.
Rate silentThreshold + IP source.
Health 403Allow health IPs.
CAPTCHA on APIAPI = Block/rate.
Empty logsARN + bucket policy.
CF associate failus-east-1.
Shield costConfirm pricing.
InvalidResourceTypeScope/ARN.
Rate no 403Limit/URI.
Firehose nameaws-waf-logs-*.

13. Troubleshooting checklist

  1. Scope check.
  2. Sampled requests.
  3. Priority order.
  4. curl -v.
  5. Log ruleId.
  6. CF region.
  7. ALB ARN.
  8. Shield health.

14. FAQ

प्र. WAF = network firewall?

नाही — WAF = L7 HTTP.

प्र. CF असताना WAF?

CF ≠ WAF; L7 rules साठी WAF.

प्र. Count vs Block?

Count शिकण्यासाठी; Block नंतर.

प्र. Standard vs Advanced?

Free L3/L4 vs paid extras.

प्र. एक ACL अनेक ALB?

हो; blast radius.

प्र. CF logs?

us-east-1 ACL logging.

प्र. Redact?

Sensitive fields लपवा.

प्र. AppSync/Cognito?

Docs नुसार ARN.

15. Interview Q&A

प्र. ALB associate CLI?

associate-web-acl.

प्र. Prove Block?

curl 403 + log.

प्र. Rate window?

5 min.

प्र. us-east-1?

Global CF.

प्र. MNC logging?

Firehose+KMS+redact.

प्र. MNC FP?

Count + narrow Allow.

प्र. Custom response?

UX + code.

प्र. Forwarded IP?

Spoof risk.

16. Tips — English, मराठी आणि हिंदी

Ravindra Bagale's Tip (EN)

Always save a 200 and a 403 in the PR. Logging before Block has saved every team I coach.

Ravindra Bagale's Tip (MR)

PR मध्ये 200 आणि 403 save करा. Block आधी logging = बचाव.

Tip (HI)

PR में 200 और 403 दोनों लगाएं। Block से पहले logging चालू करें.

घरी करून बघा

  1. IP+rate 403.
  2. Find log line.
  3. API GW 5 bullets.

थोडक्यात सांगायचं तर

  1. Recipe.
  2. Scope.
  3. Count→403.
  4. Logs.
  5. Survey.

17. ScopeDown आणि nested

ScopeDown = फक्त /login किंवा JSON. AND/OR/NOT काळजीपूर्वक. Labels > deep trees.

# Pseudo rule: rate only on /login POST
RateBasedStatement:
  Limit: 1000
  AggregateKeyType: IP
  ScopeDownStatement:
    AndStatement:
      Statements:
        - ByteMatchStatement: {SearchString: /login, FieldToMatch: UriPath, ...}
        - ByteMatchStatement: {SearchString: POST, FieldToMatch: Method, ...}

18. Bot Control आणि ATP

Bot Control / ATP = add-on cost. Scrapers → Bot Targeted. Stuffing → ATP. Count first.

19. WAF deploy IAM

  • CRUD Web ACL
  • Associate
  • Logging perms
  • Service-linked role
  • Prod delete deny

20. Allow/deny matrix

CaseExpected
Office GET /200 Allow
Foreign GET403 geo
SQLi probe403 SQLi
Rate flood403 rate
Health200 health

21. Publish करण्याआधी WAF checklist

  1. Threat एका वाक्यात.
  2. Global vs regional scope.
  3. Default action.
  4. Priority bands.
  5. Count first.
  6. CAPTCHA for humans.
  7. Logging first.
  8. Allow + 403 tests.
  9. On-call owner.
  10. CF+WAF survey link.

22. Copy-paste WAF CLI runbook

# Region for REGIONAL Web ACL (ALB / API GW). Use --scope CLOUDFRONT + us-east-1 for CDN.
export AWS_REGION=ap-south-1
export NAME=rb-waf-lab-$(date +%s)

# IP set (office allowlist example)
aws wafv2 create-ip-set --name $NAME-office --scope REGIONAL --region $AWS_REGION \
  --ip-address-version IPV4 --addresses 203.0.113.10/32

# Web ACL skeleton (default Allow; add rules in console or JSON)
aws wafv2 create-web-acl --name $NAME --scope REGIONAL --region $AWS_REGION \
  --default-action Allow={} --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=$NAME \
  --rules file://rules.json

# Associate to ALB
aws wafv2 associate-web-acl --web-acl-arn $WEB_ACL_ARN --resource-arn $ALB_ARN --region $AWS_REGION

# Logging
aws wafv2 put-logging-configuration --logging-configuration \
  ResourceArn=$WEB_ACL_ARN,LogDestinationConfigs=$LOG_BUCKET_ARN

# Test
curl -s -o /dev/null -w "%{http_code}\n" https://app.example.com/
# expect 200 for allow path; 403 for blocked path

23. Interview-friendly priority bands

  • 0–99: emergency Block
  • 100–199: Allow exceptions
  • 200–499: geo/bot
  • 500–799: Managed Rules
  • 800–899: custom
  • 900–999: rate-based

छोटा number = उच्च priority. पहिला terminating action जिंकतो. Count terminate होत नाही.

24. Industry story bank

एकच WAF pattern; फक्त IP/geo/URI/rate बदला.

  • Fintech: /login /otp rate + CAPTCHA.
  • Healthcare: geo + SQLi.
  • EdTech: Challenge scrapers.
  • Ecommerce: Bot + 429.
  • Media: search rate.
  • SaaS: webhook allowlist.
  • Logistics: geo + rate.
  • Gov: CRS + CAPTCHA.
  • Gaming: Shield + rate.
  • Travel: geo + card-test block.

25. False-positive unlock runbook

  1. Sampled / logs → rule id.
  2. curl -v reproduce.
  3. Block→Count.
  4. Narrow Allow above.
  5. Label exclusions.
  6. Retest + ticket.
  7. Default Allow + empty नको.

26. PR review checklist

  • Correct scope.
  • Priority table.
  • Count → Block date.
  • Logs encrypted.
  • 200 + 403 proofs.
  • Survey link.
  • Shield decision.
  • CF+WAF survey: chapter
  • Well-Architected — पुढचा.
  • S3 policy projects.

28. Metric आणि alarm starter pack

Day-one alarms. Thresholds = starting points.

  • BlockedRequests spike
  • CountedRequests review
  • ALB 5xx
  • ASG at max
  • DDoSDetected
  • CF error rate
  • R53 unhealthy
  • Log delivery

29. Sampled requests वाचन

  1. Sampled → rule.
  2. Action/URI/country.
  3. TP/FP/CAPTCHA.
  4. Request ids → ticket.
  5. Samples+logs.

30. Glossary

TermMeaning
Web ACLRules + default
ScopeREGIONAL / CLOUDFRONT
Managed rule groupAWS/marketplace
LabelDownstream tag
Rate-based5-min threshold
SRTAdvanced humans
Protection groupShield bundle
Firewall ManagerOrg policies
Cost protectionAttack bill relief
ChallengeSilent JS

31. 15-minute tabletop

  1. Scenario inject.
  2. Classify.
  3. First clicks + page.
  4. Comms.
  5. Gap note.

32. Cost notes

WAF = ACL+rules+requests; Bot/ATP जास्त. Shield Advanced = monthly+usage. Logs = storage. Budgets ठेवा.

33. WAF पलीकडे hygiene

  • No CF bypass.
  • IAM least privilege.
  • Log bucket BPA.
  • Quarterly IP/geo.
  • Redact secrets.
  • Break-glass doc.

34. इतर chapters शी pairing

Origin OAC = S3 projects. Security pillar = Well-Architected. CDN/HTTPS = CF+WAF survey.

35. Request flow deep dive

Browser → R53 → CF → WAF → (ALB WAF) → app. Shield पहातो. Logs → SOC.

  1. DNS+TLS (Shield).
  2. Edge WAF.
  3. Cache.
  4. Origin + regional WAF.
  5. ASG serve.
  6. Metrics/logs/SRT.

36. Rule JSON anatomy

{
  "Name": "RateLogin1000",
  "Priority": 900,
  "Action": {"Block": {"CustomResponse": {"ResponseCode": 429}}},
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "RateLogin1000"
  },
  "Statement": {
    "RateBasedStatement": {
      "Limit": 1000,
      "AggregateKeyType": "IP",
      "ScopeDownStatement": {
        "ByteMatchStatement": {
          "SearchString": "/login",
          "FieldToMatch": {"UriPath": {}},
          "TextTransformations": [{"Priority": 0, "Type": "LOWERCASE"}],
          "PositionalConstraint": "STARTS_WITH"
        }
      }
    }
  }
}

37. Text transformations

  • LOWERCASE
  • URL_DECODE
  • HTML_ENTITY_DECODE
  • CMD_LINE
  • Compress/Strip
  • Ordered transforms

38. Office-hours drills

  1. Drill 1 Count.
  2. Drill 2 priority.
  3. Drill 3 curl.
  4. Drill 4 Shield.
  5. Drill 5 runbook.
  6. Drill 6 region.
  7. Drill 7 order.
  8. Drill 8 redact.

39. Change calendar

  • Day 0
  • Day 1
  • Day 2–3
  • Day 4
  • Day 5
  • Day 7
  • Day 14
  • Day 30

उजळणी, मुलाखत आणि तुलना cards

हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.

उजळणी card: Rate-based आणि IP sets. /login floods. 5-min Limit; IP sets. IP → rate → associate → 403. Clinic rate 1000.
उजळणी card: Rate-based आणि IP sets · PNG download करा · Card page उघडा
उजळणी card: Logging आणि attachments. No logs = blind. Logs + correct scope. Logs → attach → 200/403 → ruleId. ruleId in Firehose.
उजळणी card: Logging आणि attachments · PNG download करा · Card page उघडा
तुलना: REGIONAL Web ACL vs CLOUDFRONT Web ACL. REGIONAL Web ACL: Regional resources. CLOUDFRONT Web ACL: CF in us-east-1.
तुलना: REGIONAL Web ACL vs CLOUDFRONT Web ACL · PNG download करा · Card page उघडा
तुलना: S3 WAF logs vs Firehose WAF logs. S3 WAF logs: Durable lake. Firehose WAF logs: SIEM stream.
तुलना: S3 WAF logs vs Firehose WAF logs · PNG download करा · Card page उघडा
मुलाखत card: ALB associate?. CLI. associate-web-acl. Scope must match.
मुलाखत card: ALB associate? · PNG download करा · Card page उघडा
मुलाखत card: Rate-based explain. Abuse. 5-min + key + ScopeDown. curl → 403.
मुलाखत card: Rate-based explain · PNG download करा · Card page उघडा
मुलाखत card: WAF logs कुठे?. Forensics. S3/CW/Firehose. Redact + encrypt.
मुलाखत card: WAF logs कुठे? · PNG download करा · Card page उघडा
मुलाखत card: Block सिद्ध करा. Evidence. curl 403 + ruleId. 200 + 403 in PR.
मुलाखत card: Block सिद्ध करा · PNG download करा · Card page उघडा

अजून cards: Ravi Sir's Cards.

सराव Tasks

या scenario बद्दल

Vidarbha Cotton Mills हा नागपूर मधला वस्त्रोद्योग व्यवसाय आहे. Ganesh Wankhede त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.

0 / 16

सोपं 5 min

का: Window.

काय करायचं: Rate window minutes?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

सोपं 403

का: Proof.

काय करायचं: Block HTTP code?

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

सोपं Logs

का: Forensics.

काय करायचं: Logs first तर 1.

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

सोपं Limit

का: 1000.

काय करायचं: 1000.

कसं करायचं:
  1. Task मधल्या top-level keys पासून सुरू करा.
  2. Child keys 2 spaces ने indent करा (tabs नकोत).
  3. प्रत्येक property मध्ये task मधली value भरा.
  4. Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.

सोपं List

का: Lab.

काय करायचं: List ACLs.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम ALB

का: Scope.

काय करायचं: ALB REGIONAL तर 1.

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

मध्यम XFF

का: Aggregate.

काय करायचं: Spoof तर 1.

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

मध्यम SQLi

का: Rollout.

काय करायचं: Count→Block तर 1.

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

मध्यम Aggregate

का: IP.

काय करायचं: IP.

कसं करायचं:
  1. Task मधल्या top-level keys पासून सुरू करा.
  2. Child keys 2 spaces ने indent करा (tabs नकोत).
  3. प्रत्येक property मध्ये task मधली value भरा.
  4. Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.

मध्यम IP sets

का: Office.

काय करायचं: IP sets.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

मध्यम Resources

का: Assoc.

काय करायचं: List resources.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.

अवघड Firehose

का: Naming.

काय करायचं: aws-waf-logs- तर 1.

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

अवघड Health

का: Prio.

काय करायचं: Health Allow तर 1.

कसं करायचं:
  1. Task मधले numbers लिहून घ्या.
  2. कागदावर step by step काढा.
  3. Box मध्ये फक्त final उत्तर लिहा.
  4. Check answer दाबा.

अवघड Geo

का: India.

काय करायचं: IN.

कसं करायचं:
  1. Task मधल्या top-level keys पासून सुरू करा.
  2. Child keys 2 spaces ने indent करा (tabs नकोत).
  3. प्रत्येक property मध्ये task मधली value भरा.
  4. Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.

अवघड URI

का: Login.

काय करायचं: /login.

कसं करायचं:
  1. Task मधल्या top-level keys पासून सुरू करा.
  2. Child keys 2 spaces ने indent करा (tabs नकोत).
  3. प्रत्येक property मध्ये task मधली value भरा.
  4. Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.

अवघड Logging

का: Logs cfg.

काय करायचं: Get logging.

कसं करायचं:
  1. Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
  2. aws लिहा, मग service चं नाव, मग operation (action शब्द).
  3. प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
  4. Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.