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

ЁЯФС рдзрдбрд╛ 06 тАФ Connecting: рдПрдХ рдЪрд╛рд╡реА, рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рдЪрд╛ рдкрд╛рд╕, рдХрд┐рдВрд╡рд╛ рджрд╛рд░рдЪ рдирд╛рд╣реА

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдорд╛рдЧреЗ: lesson-05-networking ┬╖ рдкреБрдвреЗ: lesson-07-metadata-roles


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

рдзрдбреЗ 01тАУ05, рдЖрдгрд┐ рдбреЗрд╕реНрдХрд╡рд░ shell рдорд┐рд│рд╡рдгреНрдпрд╛рдЪреЗ рддреАрди рдорд╛рд░реНрдЧ тАФ key pair рд╕рд╣ SSH, EC2 Instance Connect рдЖрдгрд┐ Session Manager тАФ рддреНрдпрд╛рдВрдирд╛ рд▓рд╛рдЧрдгрд╛рд░рд╛ port, рд▓рд╛рдЧрдгрд╛рд░реА key, рдЖрдгрд┐ рддреЗ рдорд╛рдЧреЗ рдареЗрд╡рдгрд╛рд░рд╛ audit trail рдпрд╛рдВрдЪреА рддреБрд▓рдирд╛. рдЗрдереЗ рднрд╛рдЧ 1 рд╕рдВрдкрддреЛ: рдбреЗрд╕реНрдХ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрдгреЗ.

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

рдХрд╛рд╣реАрддрд░реА рдмрджрд▓рд╛рдпрд▓рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдбреЗрд╕реНрдХрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛рдпрдЪреЗ рдЖрд╣реЗ. рддреАрди рдорд╛рд░реНрдЧ:

  1. рдзрд╛рддреВрдЪреА рдЪрд╛рд╡реА ЁЯФС (рдПрдХ SSH key pair). рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рджрд╛рд░ (port 22) рдЙрдШрдбреЗ рдареЗрд╡рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ, рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдЪрд╛рд╡реАрдЪреА рдирдХреНрдХрд▓ рдХрд░рдгрд╛рд░рд╛ рдХреЛрдгреАрд╣реА рдЖрдд рдпреЗрддреЛ. рддреА рд╣рд░рд╡рд▓реА рддрд░ рддреБрдореНрд╣реА рдмрд╛рд╣реЗрд░рдЪ рдЕрдбрдХрддрд╛; рддреА рд╡рд╛рдЯрд▓реА рддрд░ рдХреЛрдг рдЖрдд рдЖрд▓реЗ рддреЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдХрд│рдд рдирд╛рд╣реА.
  2. рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рдЪрд╛ рдкрд╛рд╕ ЁЯОл (EC2 Instance Connect). рдкреБрдврдЪреЗ office рдЖрдзреА рддреБрдореНрд╣реА рдХреЛрдг рдЖрд╣рд╛рдд рддреЗ рддрдкрд╛рд╕рддреЗ, рдордЧ рджрд╛рд░рд╛рд╡рд░ 60 рд╕реЗрдХрдВрдж рдЪрд╛рд▓рдгрд╛рд░рд╛ рдирд╡рд╛ рдкрд╛рд╕ рд▓рд╛рд╡рддреЗ. рджрд╛рд░ рддрд░реАрд╣реА рдЙрдШрдбреЗ рдЕрд╕рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ тАФ рдкрдг рд╣рд░рд╡рд╛рдпрд▓рд╛ рдЪрд╛рд╡реА рдирд╛рд╣реА, рдЖрдгрд┐ рдХреЛрдгреА рдорд╛рдЧрд┐рддрд▓реЗ рддреЗ office рд▓рд┐рд╣реВрди рдареЗрд╡рддреЗ.
  3. рджрд╛рд░рдЪ рдирд╛рд╣реА ЁЯУЮ (Session Manager). рдбреЗрд╕реНрдХрд╡рд░ рдПрдХ phone рдЖрд╣реЗ рдЬреЛ рдкреБрдврдЪреНрдпрд╛ office рд▓рд╛ рдмрд╛рд╣реЗрд░ call рдХрд░рддреЛ. рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрдд рдпрд╛рдпрдЪреЗ рдЕрд╕реЗрд▓, рддреЗрд╡реНрд╣рд╛ office рддреБрдордЪрд╛ badge рддрдкрд╛рд╕рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪ line рд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреЛрдбрддреЗ. рдЙрдШрдбреЗ рджрд╛рд░ рдирд╛рд╣реА, рдЪрд╛рд╡реА рдирд╛рд╣реА, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ call рдЪреА рдиреЛрдВрдж рд╣реЛрддреЗ.

рдЦрд▒реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдХрд╛рдорд╛рд╕рд╛рдареА рд╢рд╛рд│рд╛ рдХреНрд░рдорд╛рдВрдХ 3 рдирд┐рд╡рдбрддреЗ.

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

flowchart LR
    you["ЁЯзСтАНЁЯТ╗ you"]
    ssh["ЁЯФС SSH + key pair<br/>port 22 open to your IP ┬╖ a .pem to guard"]
    eic["ЁЯОл EC2 Instance Connect<br/>IAM pushes a 60-second key ┬╖ port 22 still open"]
    ssm["ЁЯУЮ Session Manager<br/>no inbound port ┬╖ IAM decides ┬╖ logged"]
    desk["ЁЯЦея╕П desk"]
    agent["SSM Agent calls out on 443"]
    you -->|"1"| ssh --> desk
    you -->|"2"| eic --> desk
    you -->|"3"| ssm
    agent -->|"outbound only"| ssm
    ssm --> desk

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/ec2/lesson-diagrams.html#l06

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

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг рдЙрдШрдбрд╛ port 22 рд╣реЗ internet рд╡рд░рдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд scan рд╣реЛрдгрд╛рд░реЗ рджрд╛рд░ рдЖрд╣реЗ, рдЖрдгрд┐ shared folder рдордзрд▓реА .pem file рд╣реА incident reviews рдордзрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдиреЗрд╣рдореАрдЪрд╛ "рд╣реЗ рдХреЛрдгреА рдХреЗрд▓реЗ?" рдкреНрд░рд╢реНрди рдЖрд╣реЗ. Session Manager рджреЛрдиреНрд╣реА рдХрд╛рдвреВрди рдЯрд╛рдХрддреЛ: scan рдХрд░рд╛рдпрд▓рд╛ рдХрд╛рд╣реА рдирд╛рд╣реА, рдлреБрдЯрд╛рдпрд▓рд╛ рдХрд╛рд╣реА рдирд╛рд╣реА, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ command рдЪрд╛ log.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

ec2/demo.py рдордзрд▓реЗ connect() рддрд┐рдиреНрд╣реА рдорд╛рд░реНрдЧ рд╢реЗрдЬрд╛рд░реА-рд╢реЗрдЬрд╛рд░реА рдЫрд╛рдкрддреЗ. рдЦрд╛рд▓рдЪрд╛ snippet Session Manager рдЪреА рд░рдЪрдирд╛ рджрд╛рдЦрд╡рдгреНрдпрд╛рд╕рд╛рдареА ec2/sg.py рд╡рд╛рдкрд░рддреЛ: рдПрдХрд╣реА inbound рдирд┐рдпрдо рдирд╕рд▓реЗрд▓рд╛ security group рд╕реБрджреНрдзрд╛ agent рдЪрд╛ outbound call рдЬрд╛рдК рджреЗрддреЛ, рдХрд╛рд░рдг default outbound рдирд┐рдпрдо рддреНрдпрд╛рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 ec2/demo.py connect
python3 - <<'EOF'
import sys; sys.path.insert(0, "ec2")
from sg import SecurityGroup
# the Session Manager desk: NO inbound rules at all тАФ it only calls out on 443
ssm_desk = SecurityGroup("sg-ssm-only", [])
print("SSH from the office:", ssm_desk.receive("tcp", "203.0.113.5", 50123, 22))
print("agent calls out to SSM:", ssm_desk.reply("tcp", "192.0.2.10", 443, 50124))
EOF

рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS credentials рдЖрдгрд┐ рдЪрд╛рд▓реВ instance рд▓рд╛рдЧрддреЛ; Session Manager рд╕рд╛рдареА AWS CLI рдЪрд╛ Session Manager plugin рд╕реБрджреНрдзрд╛ рд▓рд╛рдЧрддреЛ):

chmod 400 school-key.pem
ssh -i school-key.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com
aws ec2-instance-connect send-ssh-public-key --instance-id i-0123456789abcdef0 \
    --instance-os-user ec2-user --ssh-public-key file://$HOME/.ssh/id_ed25519.pub
aws ssm start-session --target i-0123456789abcdef0

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

connect рддреАрди рдУрд│реА рдЫрд╛рдкрддреЗ: SSH with a key pair port: 22 open (to your IP) / key: a .pem you must guard / audit: only the OS log; EC2 Instance Connect a one-minute key pushed by IAM рдЖрдгрд┐ CloudTrail рд╕рд╣; Session Manager port: none тАФ the agent calls out, key: none тАФ IAM decides, audit: CloudTrail + session logs рд╕рд╣ тАФ рдордЧ for anything real: Session Manager, and a security group with no port 22 at all. рддреБрдордЪрд╛ snippet рдЫрд╛рдкрддреЛ SSH from the office: (False, 'sg-ssm-only: no inbound rule matches тАФ dropped (the sender sees a timeout)') рдЖрдгрд┐ agent calls out to SSM: (True, "sg-ssm-only: outbound rule 'default: all out'").

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рд╢реВрдиреНрдп inbound рдирд┐рдпрдо рдЕрд╕рд▓реЗрд▓рд╛ рдбреЗрд╕реНрдХрд╣реА рдкреВрд░реНрдгрдкрдгреЗ рд╕рд╛рдВрднрд╛рд│рддрд╛ рдпреЗрддреЛ: рдЖрдд рдЬрд╛рдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗ рдПрдХ outbound call рдЖрдгрд┐ IAM рдЪрд╛ рдирд┐рд░реНрдгрдп, рдЙрдШрдбреЗ рджрд╛рд░ рдЖрдгрд┐ рдЪрд╛рд╡реА рдирд╛рд╣реА.

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

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЕрдиреЗрдХ рд╕рдВрд╕реНрдерд╛ inbound 22 рдкреВрд░реНрдгрдкрдгреЗ рдмрдВрджрдЪ рдареЗрд╡рддрд╛рдд (AWS Config rules рдЖрдгрд┐ SCPs рдиреЗ рд▓рд╛рдЧреВ рдХреЗрд▓реЗрд▓реЗ) рдЖрдгрд┐ session logging рд╕рд╣ Session Manager рд╡рд╛рдкрд░рддрд╛рдд тАФ engineers IAM рдордзреВрди рдЖрдд рдЬрд╛рддрд╛рдд, рдЖрдгрд┐ auditors рдирд╛ рдкреНрд░рддреНрдпреЗрдХ session рдЪреА рдиреЛрдВрдж рдорд┐рд│рддреЗ.

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

рднрд╛рдЧ 2 рд╕реБрд░реВ рд╣реЛрддреЛ: fleet рдЪрд╛рд▓рд╡рдгреЗ. рдЖрдзреА, рдкреНрд░рддреНрдпреЗрдХ рдбреЗрд╕реНрдХ "рдореА рдХреЛрдг?" рд╡рд┐рдЪрд╛рд░реВ рд╢рдХрддреЛ тАФ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ keys рдРрд╡рдЬреА рдПрдХ badge рдорд┐рд│рддреЛ. Metadata рдЖрдгрд┐ roles.

git checkout lesson-07-metadata-roles

ЁЯФС Lesson 06 тАФ Connecting: a key, a one-minute pass, or no door at all

ЁЯУН You are here: Lesson 06 of 12 ┬╖ Previous: lesson-05-networking ┬╖ Next: lesson-07-metadata-roles


ЁЯУж What's in this branch

Lessons 01тАУ05, plus the three ways to get a shell on a desk тАФ SSH with a key pair, EC2 Instance Connect and Session Manager тАФ compared on the port they need, the key they need, and the audit trail they leave. This ends Part 1: renting a desk.

ЁЯзТ Explain like I'm 5

You need to get to your desk to change something. Three ways:

  1. A metal key ЁЯФС (an SSH key pair). The door (port 22) must stay open for you, and anyone who copies your key gets in too. Lose it and you are locked out; share it and nobody knows who came in.
  2. A one-minute pass ЁЯОл (EC2 Instance Connect). The front office checks who you are, then pins a fresh pass on the door that works for 60 seconds. The door still has to be open тАФ but there is no key to lose, and the office writes down who asked.
  3. No door at all ЁЯУЮ (Session Manager). The desk has a phone that calls out to the front office. When you want in, the office checks your badge and puts you through on that line. No open door, no key, and every call is recorded.

For anything real, the school picks number 3.

ЁЯЧ║я╕П Diagram

flowchart LR
    you["ЁЯзСтАНЁЯТ╗ you"]
    ssh["ЁЯФС SSH + key pair<br/>port 22 open to your IP ┬╖ a .pem to guard"]
    eic["ЁЯОл EC2 Instance Connect<br/>IAM pushes a 60-second key ┬╖ port 22 still open"]
    ssm["ЁЯУЮ Session Manager<br/>no inbound port ┬╖ IAM decides ┬╖ logged"]
    desk["ЁЯЦея╕П desk"]
    agent["SSM Agent calls out on 443"]
    you -->|"1"| ssh --> desk
    you -->|"2"| eic --> desk
    you -->|"3"| ssm
    agent -->|"outbound only"| ssm
    ssm --> desk

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/ec2/lesson-diagrams.html#l06

тЭУ What

ЁЯдФ Why

Because an open port 22 is the most-scanned door on the internet, and a .pem file in a shared folder is the most common "who did this?" in incident reviews. Session Manager removes both: nothing to scan, nothing to leak, and a log of every command.

ЁЯФз How (in this repo)

connect() in ec2/demo.py prints the three ways side by side. The snippet below uses ec2/sg.py to show the Session Manager shape: a security group with no inbound rules at all still lets the agent's outbound call through, because the default outbound rule allows it.

ЁЯзк Try it

python3 ec2/demo.py connect
python3 - <<'EOF'
import sys; sys.path.insert(0, "ec2")
from sg import SecurityGroup
# the Session Manager desk: NO inbound rules at all тАФ it only calls out on 443
ssm_desk = SecurityGroup("sg-ssm-only", [])
print("SSH from the office:", ssm_desk.receive("tcp", "203.0.113.5", 50123, 22))
print("agent calls out to SSM:", ssm_desk.reply("tcp", "192.0.2.10", 443, 50124))
EOF

On a real account (needs AWS credentials and a running instance; Session Manager also needs the Session Manager plugin for the AWS CLI):

chmod 400 school-key.pem
ssh -i school-key.pem ec2-user@ec2-203-0-113-25.compute-1.amazonaws.com
aws ec2-instance-connect send-ssh-public-key --instance-id i-0123456789abcdef0 \
    --instance-os-user ec2-user --ssh-public-key file://$HOME/.ssh/id_ed25519.pub
aws ssm start-session --target i-0123456789abcdef0

тЬЕ Verify тАФ what you should see

connect prints three rows: SSH with a key pair port: 22 open (to your IP) / key: a .pem you must guard / audit: only the OS log; EC2 Instance Connect with a one-minute key pushed by IAM and CloudTrail; Session Manager with port: none тАФ the agent calls out, key: none тАФ IAM decides, audit: CloudTrail + session logs тАФ then for anything real: Session Manager, and a security group with no port 22 at all. Your snippet prints SSH from the office: (False, 'sg-ssm-only: no inbound rule matches тАФ dropped (the sender sees a timeout)') and agent calls out to SSM: (True, "sg-ssm-only: outbound rule 'default: all out'").

ЁЯПБ What you just proved

A desk can be fully manageable with zero inbound rules: the way in is an outbound call plus an IAM decision, not an open door and a key.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: many organisations forbid inbound 22 entirely (enforced by AWS Config rules and SCPs) and use Session Manager with session logging тАФ engineers get in through IAM, and auditors get a record of every session.

тПня╕П Next

Part 2 begins: running a fleet. First, every desk can ask "who am I?" тАФ and gets a badge instead of keys. Metadata and roles.

git checkout lesson-07-metadata-roles
тЖР PreviousnetworkingNext тЖТmetadata roles

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