ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯЪк рдзрдбрд╛ 10 тАФ Security groups: рджреНрд╡рд╛рд░рдкрд╛рд▓рд╛рдЪреА рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЪк рдзрдбрд╛ 10 тАФ Security groups: рджреНрд╡рд╛рд░рдкрд╛рд▓рд╛рдЪреА рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧреЗ: lesson-09-connecting ┬╖ рдкреБрдвреЗ: lesson-11-ebs-snapshots-ami


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

рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рдЪреА firewall тАФ security groups тАФ рдЖрдгрд┐ рддреЗ рдкрдЯрдХрди рд╕рдордЬрд╛рд╡рдгрд╛рд░реЗ рддреАрди рдирд┐рдпрдо. рдЦрд░реА file:

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

рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдХрд╛рд▓рд╛ рдПрдХ рджреНрд╡рд╛рд░рдкрд╛рд▓ ЁЯзН рдорд┐рд│рддреЛ, рдЬреЛ рдХреЛрдгрддреАрд╣реА рдареЛрдард╛рд╡рдгреА рдмрд╛рдХрд╛рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЖрдзреА рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рддрдкрд╛рд╕рддреЛ. рдЖрдкрд▓реА рдпрд╛рджреА (ec2.tf рдордзреВрди) рдЕрд╢реА рдЖрд╣реЗ:

тЬЕ рджрд╛рд░ 22 (SSH) тАФ рдлрдХреНрдд рдорд╛рдЭреНрдпрд╛ рдШрд░реВрди рдЖрд▓реЗрд▓реЗ рдкрд╛рд╣реБрдгреЗ (1.2.3.4/32) тЬЕ рджрд╛рд░ 80 (web) тАФ рдХреБрдареВрдирд╣реА рдЖрд▓реЗрд▓реЗ рдкрд╛рд╣реБрдгреЗ (0.0.0.0/0) тЭМ рдЗрддрд░ рдХреЛрдгрддреЗрд╣реА рджрд╛рд░ тАФ рдпрд╛рджреАрдд рдирд╛рд╣реА = рд╢рд╛рдВрддрддрд╛.

рдпрд╛ рджреНрд╡рд╛рд░рдкрд╛рд▓рд╛рдЪреНрдпрд╛ рддреАрди рд╕рд╡рдпреА:

  1. рдореБрд│рд╛рдд рдЙрддреНрддрд░ рд╢рд╛рдВрддрддрд╛ рдЕрд╕рддреЗ. ЁЯдл Inbound рдпрд╛рджреАрдд рдиреЛрдВрдж рдирд╛рд╣реА = рдмрд╛рдХрд╛рд▓рд╛ рдареЛрдард╛рд╡рдгреА рдРрдХреВрд╣реА рдпреЗрдд рдирд╛рд╣реА. рддреБрдореНрд╣реА рджрд╛рд░реЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдЙрдШрдбрддрд╛; рдЬреЗ рджрд╛рд░ рдХрдзреА рдЙрдШрдбрд▓реЗрдЪ рдирд╛рд╣реА рддреЗ рдмрдВрдж рдХрд░рд╛рдпрд▓рд╛ рддреБрдореНрд╣реА рд╡рд┐рд╕рд░реВ рд╢рдХрдд рдирд╛рд╣реА.
  2. рддреНрдпрд╛рд▓рд╛ рд╕рдВрд╡рд╛рдж рд▓рдХреНрд╖рд╛рдд рд░рд╛рд╣рддрд╛рдд (stateful). рддреНрдпрд╛рдиреЗ рдПрдЦрд╛рджреА request рдЖрдд рдпреЗрдК рджрд┐рд▓реА, рддрд░ рддрд┐рдЪреЗ рдЙрддреНрддрд░ рддреЛ рдЖрдкреЛрдЖрдк рдмрд╛рд╣реЗрд░ рдЬрд╛рдК рджреЗрддреЛ тАФ рдЙрд▓рдЯреНрдпрд╛ рдирд┐рдпрдорд╛рдВрдЪреА рдЧрд░рдЬ рдирд╛рд╣реА.
  3. рддреЛ рдЗрддрд░ рджреНрд╡рд╛рд░рдкрд╛рд▓рд╛рдВрдирд╛ рдУрд│рдЦреВ рд╢рдХрддреЛ. рдПрдЦрд╛рджрд╛ рдирд┐рдпрдо рдореНрд╣рдгреВ рд╢рдХрддреЛ "app-sg badge рдШрд╛рддрд▓реЗрд▓реНрдпрд╛ рдХреЛрдгрд╛рдХрдбреВрдирд╣реА 5432 allow рдХрд░рд╛" тАФ groups groups рдЪрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛рдд. рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ "рдлрдХреНрдд app рдмрд╛рдХрдЪ database рдмрд╛рдХрд╛рдВрд╢реА рдмреЛрд▓реВ рд╢рдХрддрд╛рдд" рд╣реЗ рдПрдХрд╣реА IP рдкрддреНрддрд╛ рди рд╡рд╛рдкрд░рддрд╛ рд▓рд┐рд╣рд┐рд▓реЗ рдЬрд╛рддреЗ. (k8s course рдордзрд▓реА ALB тЖТ node рдЬреЛрдбрдгреА рдиреЗрдордХреА рдЕрд╢реАрдЪ рдЪрд╛рд▓рддреЗ.)

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

flowchart LR
    you["ЁЯзСтАНЁЯТ╗ you<br/>your IP"]
    net["ЁЯМН the internet"]
    subgraph gate["ЁЯзН security group - the guest list"]
        r1["тЬЕ 22 from 1.2.3.4/32"]
        r2["тЬЕ 80 from 0.0.0.0/0"]
        r3["тЭМ everything else: silence"]
    end
    desk["ЁЯЦея╕П the desk<br/>never hears denied knocks"]
    you -->|"1 ssh тЬЕ"| gate
    net -->|"2 port 80 тЬЕ ┬╖ port 22 тЭМ"| gate
    gate --> desk
    desk -.->|"3 replies auto-allowed<br/>(stateful)"| net

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

ЁЯдФ рдХрд╛

SGs рд╣реА рддреБрдореНрд╣реА рдХрдзреАрд╣реА deploy рдХрд░рд╛рд▓ рддреА рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рд╕реБрд░рдХреНрд╖рд╛ рдЖрд╣реЗ: default-deny рдЖрдгрд┐ рд╕реНрдкрд╖реНрдЯ рджрд╛рд░реЗ рдХреЛрдгрддреЗрд╣реА software рдЪрд╛рд▓рдгреНрдпрд╛рдЖрдзреАрдЪ рд╣рд▓реНрд▓реНрдпрд╛рдВрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛рдвреВрди рдЯрд╛рдХрддрд╛рдд. рдЖрдгрд┐ group-references рд╣реЗрддреВ рд╡рд╛рдЪрдиреАрдп рдХрд░рддрд╛рдд тАФ "db app-sg рд▓рд╛ рд╕реНрд╡реАрдХрд╛рд░рддреЛ" рд╣реЗ firewall рдордзреНрдпреЗрдЪ architecture рдЪреЗ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдХрд░рддреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~10 рдорд┐рдирд┐рдЯреЗ, ~1┬в)

cd ec2 && terraform apply -var my_ip=$(curl -s ifconfig.me)/32

IP=$(terraform output -raw public_ip)
curl -m 5 http://$IP                    # door 80: open to all тЖТ answers ЁЯОЙ
nc -zv -w 5 $IP 22                      # door 22 from YOUR IP тЖТ open
nc -zv -w 5 $IP 3306                    # random door тЖТ TIMEOUT, not "refused":
                                        # the gatekeeper never even answered ЁЯдл

# see the live guest list:
aws ec2 describe-security-groups --filters Name=group-name,Values=school-desk-sg \
  --query 'SecurityGroups[0].IpPermissions[].{port:FromPort,from:IpRanges[0].CidrIp}'

# feel "changes apply instantly": remove the port-80 ingress in ec2.tf,
# terraform apply, curl again тЖТ silence. put it back. ЁЯШИ

terraform destroy -var my_ip=$(curl -s ifconfig.me)/32     # ЁЯз╣

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

nc -zv PUBLIC_IP 80 connect рд╣реЛрддреЛ; рджреБрд╕рд▒реНрдпрд╛ IP рд╡рд░реВрди nc -zv PUBLIC_IP 22 time out рд╣реЛрддреЛ (рд╢рд╛рдВрддрддрд╛, рдирдХрд╛рд░ рдирд╛рд╣реА).

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

terraform destroy

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

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

рдмрд╛рдХ рдирд┐рдШреВрди рдЧреЗрд▓рд╛ рдХреА рдмрд╛рдХрд╛рдЪреНрдпрд╛ рд╕рд╛рдорд╛рдирд╛рдЪреЗ рдХрд╛рдп рд╣реЛрддреЗ? рдбреНрд░реЙрд╡рд░, photocopies, рдЖрдгрд┐ рдмрд╛рдХрд╛рдВрдЪреЗ templates: EBS, snapshots & AMIs.

git checkout lesson-11-ebs-snapshots-ami

ЁЯЪк Lesson 10 тАФ Security groups: the gatekeeper's guest list

ЁЯУН You are here: Lesson 10 of 12 ┬╖ Previous: lesson-09-connecting ┬╖ Next: lesson-11-ebs-snapshots-ami


ЁЯУж What's in this branch

Lessons 01тАУ09, plus: the per-desk firewall тАФ security groups тАФ and the three rules that make them click. Real file:

ЁЯзТ Explain like I'm 5

Every desk gets a gatekeeper ЁЯзН who checks a guest list before any knock reaches the desk. Ours (from ec2.tf) reads:

тЬЕ door 22 (SSH) тАФ only visitors from my house (1.2.3.4/32) тЬЕ door 80 (web) тАФ visitors from anywhere (0.0.0.0/0) тЭМ any other door тАФ not on the list = silence.

Three habits of this gatekeeper:

  1. The default answer is silence. ЁЯдл No inbound list entry = the desk never even hears the knock. You open doors explicitly; you can't forget to close a door you never opened.
  2. He remembers conversations (stateful). If he let a request IN, he lets its reply back OUT automatically тАФ no mirror rules needed.
  3. He can recognize other gatekeepers. A rule may say "allow 5432 from anyone wearing the app-sg badge" тАФ groups referencing groups. That's how "only the app desks may talk to the database desks" is written without a single IP address. (The k8s course's ALB тЖТ node wiring works exactly like this.)

ЁЯЧ║я╕П Diagram

flowchart LR
    you["ЁЯзСтАНЁЯТ╗ you<br/>your IP"]
    net["ЁЯМН the internet"]
    subgraph gate["ЁЯзН security group - the guest list"]
        r1["тЬЕ 22 from 1.2.3.4/32"]
        r2["тЬЕ 80 from 0.0.0.0/0"]
        r3["тЭМ everything else: silence"]
    end
    desk["ЁЯЦея╕П the desk<br/>never hears denied knocks"]
    you -->|"1 ssh тЬЕ"| gate
    net -->|"2 port 80 тЬЕ ┬╖ port 22 тЭМ"| gate
    gate --> desk
    desk -.->|"3 replies auto-allowed<br/>(stateful)"| net

тЭУ What

ЁЯдФ Why

SGs are the cheapest security you'll ever deploy: default-deny plus explicit doors removes whole attack classes before any software runs. And group-references make intent readable тАФ "db accepts app-sg" documents the architecture in the firewall itself.

ЁЯзк Try it (~10 min, ~1┬в)

cd ec2 && terraform apply -var my_ip=$(curl -s ifconfig.me)/32

IP=$(terraform output -raw public_ip)
curl -m 5 http://$IP                    # door 80: open to all тЖТ answers ЁЯОЙ
nc -zv -w 5 $IP 22                      # door 22 from YOUR IP тЖТ open
nc -zv -w 5 $IP 3306                    # random door тЖТ TIMEOUT, not "refused":
                                        # the gatekeeper never even answered ЁЯдл

# see the live guest list:
aws ec2 describe-security-groups --filters Name=group-name,Values=school-desk-sg \
  --query 'SecurityGroups[0].IpPermissions[].{port:FromPort,from:IpRanges[0].CidrIp}'

# feel "changes apply instantly": remove the port-80 ingress in ec2.tf,
# terraform apply, curl again тЖТ silence. put it back. ЁЯШИ

terraform destroy -var my_ip=$(curl -s ifconfig.me)/32     # ЁЯз╣

тЬЕ Verify тАФ what you should see

nc -zv PUBLIC_IP 80 connects; nc -zv PUBLIC_IP 22 from a different IP times out (silence, not refusal).

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

terraform destroy

тЪая╕П Common mistakes

тПня╕П Next

What happens to the desk's stuff when the desk goes away? Drawers, photocopies, and desk templates: EBS, snapshots & AMIs.

git checkout lesson-11-ebs-snapshots-ami
тЖР PreviousconnectingNext тЖТebs snapshots ami

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