ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯЫбя╕П рдзрдбрд╛ 24 тАФ WAF & Shield: gate рд╡рд░рдЪрд╛ bouncer
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЫбя╕П рдзрдбрд╛ 24 тАФ WAF & Shield: gate рд╡рд░рдЪрд╛ bouncer

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 25 рдкреИрдХреА рдзрдбрд╛ 24 ┬╖ рдорд╛рдЧреАрд▓: lesson-23-route53-routing ┬╖ рдкреБрдвреАрд▓: lesson-25-api-gateway


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ24. Reception (рдзрдбрд╛ 15) рдареЛрдард╛рд╡рдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдЖрдд рдШреЗрддреЗ. рдЖрддрд╛ reception рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЖрдзреА рдкрддреНрд░ рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛ рдХреЛрдгрд╛рд▓рд╛ рддрд░реА рдХрд╛рдорд╛рд╡рд░ рдареЗрд╡рдгреНрдпрд╛рдЪреА рд╡реЗрд│. рдЦрд░реА file:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

Security groups (рдзрдбрд╛ 10) рдкрд╛рд╣реБрдгрд╛ рдХреБрдареВрди рдпреЗрддреЛ рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛ рджрд╛рд░рд╛рд╡рд░ рдареЛрдард╛рд╡рддреЛ рддреЗ рддрдкрд╛рд╕рддрд╛рдд тАФ рдкрд╛рд╣реБрдгрд╛ рдХрд╛рдп рдШреЗрдКрди рдЖрд▓рд╛ рдЖрд╣реЗ рддреЗ рддреЗ рдХрдзреАрдЪ рд╡рд╛рдЪрдд рдирд╛рд╣реАрдд. Web Application Firewall (WAF) ЁЯЫбя╕П рдореНрд╣рдгрдЬреЗ reception рд╕рдореЛрд░ рдЙрднрд╛ рдЕрд╕рд▓реЗрд▓рд╛ bouncer, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдХреАрдЯ рдЙрдШрдбрддреЛ:

Bouncer рд▓рд╛ ALB, API Gateway (рдзрдбрд╛ 25), рдХрд┐рдВрд╡рд╛ CloudFront рд▓рд╛ рдЬреЛрдбрд╛ тАФ рдкрд╛рд╣реБрдгреЗ рдпреЗрддрд╛рдд рддреНрдпрд╛ рддреАрди рдЬрд╛рдЧрд╛. рдЖрдгрд┐ рдпрд╛ рд╕рдЧрд│реНрдпрд╛рдЦрд╛рд▓реА, Shield Standard (рдореЛрдлрдд, рдЖрдкреЛрдЖрдк) рдврдХрд▓рд╛рдврдХрд▓реА рдХрд░рдгрд╛рд▒реНрдпрд╛ рдореЛрдареНрдпрд╛ рдЧрд░реНрджреА (network-layer DDoS) рдкрдЪрд╡рддреЗ; Shield Advanced (рд╕рд╢реБрд▓реНрдХ) response team рдЖрдгрд┐ cost protection рдЬреЛрдбрддреЗ, рддреНрдпрд╛ рджрд┐рд╡рд╕рд╛рдВрд╕рд╛рдареА рдЬреЗрд╡реНрд╣рд╛ рд╕рдЧрд│реЗ рдЧрд╛рд╡ рд░рд╛рдЧрд╛рдиреЗ рд▓реЛрдЯрддреЗ.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    net["ЁЯМН internet"]
    waf["ЁЯЫбя╕П WAF web ACL<br/>ЁЯУЛ managed rules ┬╖ тП▒я╕П rate 2k/5min<br/>ЁЯЧ║я╕П geo ┬╖ ЁЯУЗ IP sets"]
    alb["ЁЯЫОя╕П ALB"]
    desks["ЁЯЦея╕П desks"]
    logs["ЁЯз╛ WAF logs тЖТ S3 / CloudWatch"]
    net -->|"1 request"| waf
    waf -->|"2 clean тЖТ forward"| alb --> desks
    waf -->|"тЬЧ SQLi / flood тЖТ 403"| net
    waf -->|"3 every decision"| logs

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рджрд┐рд╡рд╢реАрд╕реБрджреНрдзрд╛ internet 40% bots рдЕрд╕рддреЗ. Bouncer рд╢рд┐рд╡рд╛рдп, reception рдЪрд╛ рджрд┐рд╡рд╕ /wp-admin рд╕рд╛рдареАрдЪреНрдпрд╛ probes рдирд╛ рдЙрддреНрддрд░реЗ рджреЗрдгреНрдпрд╛рдд рдЬрд╛рддреЛ рдЖрдгрд┐ рддреБрдордЪреЗ logs рдореНрд╣рдгрдЬреЗ рдиреБрд╕рддрд╛ рдЧреЛрдВрдЧрд╛рдЯ. WAF рд╕реНрд╡рд╕реНрдд, managed рдЖрд╣реЗ, рдЖрдгрд┐ "рдХрд╛рд▓ рд░рд╛рддреНрд░реА рдЖрдкрд▓реНрдпрд╛рд╡рд░ рд╣рд▓реНрд▓рд╛ рдЭрд╛рд▓рд╛" рдпрд╛рд▓рд╛ рдПрдХрд╛ рдирдЬрд░реЗрдд рдкрд╛рд╣рд╛рдпрдЪреНрдпрд╛ graph рдордзреНрдпреЗ рдмрджрд▓рддреЗ. рдЖрдзреА-count-рдордЧ-block рдЪреА рд╕рд╡рдп рд╣реЗрдЪ рдЦрд░реЗ рдХреМрд╢рд▓реНрдп рдЖрд╣реЗ.

ЁЯФз рдХрд╕реЗ

# what the bouncer has been doing (top blocked rules, last hour):
aws wafv2 get-sampled-requests --web-acl-arn $ACL --rule-metric-name RateLimit \
  --scope REGIONAL --time-window StartTime=$(date -u -v-1H +%s),EndTime=$(date -u +%s) --max-items 20

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~15 рдорд┐рдирд┐рдЯреЗ, ~5┬в тАФ рдзрдбрд╛ 15 рдЪреНрдпрд╛ ALB рд▓рд╛ рдЬреЛрдбрддреЗ, рджреЛрдиреНрд╣реА destroy рдХрд░рд╛)

cd waf && terraform apply -var alb_arn=$ALB_ARN   # common rules (count) + rate limit (block)
for i in $(seq 1 3000); do curl -s -o /dev/null $ALB_URL/ & done; wait   # the refresh kid
curl -i $ALB_URL/                                  # тЖТ 403 from the bouncer, for a while
terraform destroy

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

curl -i ALB_URL 200 рджреЗрддреЛ; flood loop рдирдВрддрд░ рдХрд╛рд╣реА рд╡реЗрд│ рддреЛ 403 рджреЗрддреЛ; WAF sampled requests rate рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддрд╛рдирд╛ рджрд╛рдЦрд╡рддрд╛рдд.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛

рдЗрдереЗ terraform destroy рдХрд░рд╛ рдЖрдгрд┐ рдзрдбрд╛ 15 рдЪрд╛ ALB рд╕реБрджреНрдзрд╛ тАФ рджреЛрдиреНрд╣реА рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ bill рдХрд░рддрд╛рдд

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

Websites рдирд╛ reception рдЖрд╣реЗ. APIs рдирд╛ рддреНрдпрд╛рдВрдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ front desk рд╣рд╡реЗ тАФ рдЬреЗ рддрд┐рдХрд┐рдЯреЗ рдореЛрдЬрддреЗ, рдУрд│рдЦрдкрддреНрд░реЗ рддрдкрд╛рд╕рддреЗ, рдЖрдгрд┐ рдХрд╛рдореЗ рдереЗрдЯ Lambda рдХрдбреЗ рд╕реЛрдкрд╡рддреЗ. рдзрдбрд╛ 25: API Gateway.

ЁЯЫбя╕П Lesson 24 тАФ WAF & Shield: the bouncer at the gate

ЁЯУН You are here: Lesson 24 of 25 ┬╖ Previous: lesson-23-route53-routing ┬╖ Next: lesson-25-api-gateway


ЁЯУж What's in this branch

Lessons 01тАУ24. Reception (lesson 15) lets everyone in who knocks. Time to hire someone who reads the letter before it reaches reception. Real file:

ЁЯзТ Explain like I'm 5

Security groups (lesson 10) check where a visitor comes from and which door they knock on тАФ they never read what the visitor is carrying. The Web Application Firewall (WAF) ЁЯЫбя╕П is the bouncer standing in front of reception who opens every envelope:

Attach the bouncer to the ALB, API Gateway (lesson 25), or CloudFront тАФ the three places visitors arrive. And under it all, Shield Standard (free, automatic) absorbs the big shoving crowds (network-layer DDoS); Shield Advanced (paid) adds a response team and cost protection for the days the whole town shows up angry.

ЁЯЧ║я╕П Diagram

flowchart LR
    net["ЁЯМН internet"]
    waf["ЁЯЫбя╕П WAF web ACL<br/>ЁЯУЛ managed rules ┬╖ тП▒я╕П rate 2k/5min<br/>ЁЯЧ║я╕П geo ┬╖ ЁЯУЗ IP sets"]
    alb["ЁЯЫОя╕П ALB"]
    desks["ЁЯЦея╕П desks"]
    logs["ЁЯз╛ WAF logs тЖТ S3 / CloudWatch"]
    net -->|"1 request"| waf
    waf -->|"2 clean тЖТ forward"| alb --> desks
    waf -->|"тЬЧ SQLi / flood тЖТ 403"| net
    waf -->|"3 every decision"| logs

тЭУ What

ЁЯдФ Why

The internet is 40% bots on a good day. Without a bouncer, reception spends its day answering probes for /wp-admin and your logs are noise. WAF is cheap, managed, and turns "we got hammered last night" into a graph you glance at. The count-then-block habit is the real skill.

ЁЯФз How

# what the bouncer has been doing (top blocked rules, last hour):
aws wafv2 get-sampled-requests --web-acl-arn $ACL --rule-metric-name RateLimit \
  --scope REGIONAL --time-window StartTime=$(date -u -v-1H +%s),EndTime=$(date -u +%s) --max-items 20

ЁЯзк Try it (~15 min, ~5┬в тАФ attaches to lesson 15's ALB, destroy both)

cd waf && terraform apply -var alb_arn=$ALB_ARN   # common rules (count) + rate limit (block)
for i in $(seq 1 3000); do curl -s -o /dev/null $ALB_URL/ & done; wait   # the refresh kid
curl -i $ALB_URL/                                  # тЖТ 403 from the bouncer, for a while
terraform destroy

тЬЕ Verify тАФ what you should see

curl -i ALB_URL returns 200; after the flood loop it returns 403 for a while; the WAF sampled requests show the rate rule firing.

ЁЯз╣ Clean up тАФ do not leave running

terraform destroy here AND lesson 15's ALB тАФ both bill hourly

тЪая╕П Common mistakes

тПня╕П Next

Websites have reception. APIs deserve their own front desk тАФ one that counts tickets, checks IDs, and hands errands straight to Lambda. Lesson 25: API Gateway.

тЖР Previousroute53 routingNext тЖТapi gateway

This page is the lesson's README from the lesson-24-waf-shield branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.