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. काय बनवाल
हे काय आहे?
- Office IP set
- Geo IN+AE
- /login rate
- SQLi + CRS
- Custom response
- Attachments
- Logging
- 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
| Resource | How |
|---|---|
| ALB | REGIONAL; ALB ARN |
| API GW | REGIONAL; stage/API ARN |
| CloudFront | us-east-1; WebACLId |
| AppSync | REGIONAL AppSync |
| Cognito | REGIONAL 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)
- Create ACL.
- Add rules.
- Associate + logs.
- 200 + 403.
- Count→Block.
Cleanup (billing थांबवा)
- Disassociate.
- Logs cleanup.
- Delete ACL/IP.
12. सामान्य errors आणि fixes
प्रत्येक row = खरी चूक. Panic करण्याआधी fix वाचा.
| Error / लक्षण | Fix |
|---|---|
| No blocks | Scope + Count. |
| False positive | Count + Allow. |
| Rate silent | Threshold + IP source. |
| Health 403 | Allow health IPs. |
| CAPTCHA on API | API = Block/rate. |
| Empty logs | ARN + bucket policy. |
| CF associate fail | us-east-1. |
| Shield cost | Confirm pricing. |
| InvalidResourceType | Scope/ARN. |
| Rate no 403 | Limit/URI. |
| Firehose name | aws-waf-logs-*. |
13. Troubleshooting checklist
- Scope check.
- Sampled requests.
- Priority order.
- curl -v.
- Log ruleId.
- CF region.
- ALB ARN.
- 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 चालू करें.
घरी करून बघा
- IP+rate 403.
- Find log line.
- API GW 5 bullets.
थोडक्यात सांगायचं तर
- Recipe.
- Scope.
- Count→403.
- Logs.
- 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
| Case | Expected |
|---|---|
| Office GET / | 200 Allow |
| Foreign GET | 403 geo |
| SQLi probe | 403 SQLi |
| Rate flood | 403 rate |
| Health | 200 health |
21. Publish करण्याआधी WAF checklist
- Threat एका वाक्यात.
- Global vs regional scope.
- Default action.
- Priority bands.
- Count first.
- CAPTCHA for humans.
- Logging first.
- Allow + 403 tests.
- On-call owner.
- 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
- Sampled / logs → rule id.
- curl -v reproduce.
- Block→Count.
- Narrow Allow above.
- Label exclusions.
- Retest + ticket.
- Default Allow + empty नको.
26. PR review checklist
- Correct scope.
- Priority table.
- Count → Block date.
- Logs encrypted.
- 200 + 403 proofs.
- Survey link.
- Shield decision.
27. या site वरील related chapters
- 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 वाचन
- Sampled → rule.
- Action/URI/country.
- TP/FP/CAPTCHA.
- Request ids → ticket.
- Samples+logs.
30. Glossary
| Term | Meaning |
|---|---|
| Web ACL | Rules + default |
| Scope | REGIONAL / CLOUDFRONT |
| Managed rule group | AWS/marketplace |
| Label | Downstream tag |
| Rate-based | 5-min threshold |
| SRT | Advanced humans |
| Protection group | Shield bundle |
| Firewall Manager | Org policies |
| Cost protection | Attack bill relief |
| Challenge | Silent JS |
31. 15-minute tabletop
- Scenario inject.
- Classify.
- First clicks + page.
- Comms.
- 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.
- DNS+TLS (Shield).
- Edge WAF.
- Cache.
- Origin + regional WAF.
- ASG serve.
- 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
- Drill 1 Count.
- Drill 2 priority.
- Drill 3 curl.
- Drill 4 Shield.
- Drill 5 runbook.
- Drill 6 region.
- Drill 7 order.
- 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 उघडतो.








अजून cards: Ravi Sir's Cards.
सराव Tasks
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?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
सोपं 403
का: Proof.
काय करायचं: Block HTTP code?
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
सोपं Logs
का: Forensics.
काय करायचं: Logs first तर 1.
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
सोपं Limit
का: 1000.
काय करायचं: 1000.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
सोपं List
का: Lab.
काय करायचं: List ACLs.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम ALB
का: Scope.
काय करायचं: ALB REGIONAL तर 1.
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
मध्यम XFF
का: Aggregate.
काय करायचं: Spoof तर 1.
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
मध्यम SQLi
का: Rollout.
काय करायचं: Count→Block तर 1.
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
मध्यम Aggregate
का: IP.
काय करायचं: IP.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
मध्यम IP sets
का: Office.
काय करायचं: IP sets.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Resources
का: Assoc.
काय करायचं: List resources.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Firehose
का: Naming.
काय करायचं: aws-waf-logs- तर 1.
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
अवघड Health
का: Prio.
काय करायचं: Health Allow तर 1.
- Task मधले numbers लिहून घ्या.
- कागदावर step by step काढा.
- Box मध्ये फक्त final उत्तर लिहा.
- Check answer दाबा.
अवघड Geo
का: India.
काय करायचं: IN.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
अवघड URI
का: Login.
काय करायचं: /login.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
अवघड Logging
का: Logs cfg.
काय करायचं: Get logging.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.