ЁЯФС рдзрдбрд╛ 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 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрд╛рд╣реАрддрд░реА рдмрджрд▓рд╛рдпрд▓рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдбреЗрд╕реНрдХрдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╛рдпрдЪреЗ рдЖрд╣реЗ. рддреАрди рдорд╛рд░реНрдЧ:
- рдзрд╛рддреВрдЪреА рдЪрд╛рд╡реА ЁЯФС (рдПрдХ SSH key pair). рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рджрд╛рд░ (port 22) рдЙрдШрдбреЗ рдареЗрд╡рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ, рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдЪрд╛рд╡реАрдЪреА рдирдХреНрдХрд▓ рдХрд░рдгрд╛рд░рд╛ рдХреЛрдгреАрд╣реА рдЖрдд рдпреЗрддреЛ. рддреА рд╣рд░рд╡рд▓реА рддрд░ рддреБрдореНрд╣реА рдмрд╛рд╣реЗрд░рдЪ рдЕрдбрдХрддрд╛; рддреА рд╡рд╛рдЯрд▓реА рддрд░ рдХреЛрдг рдЖрдд рдЖрд▓реЗ рддреЗ рдХреЛрдгрд╛рд▓рд╛рдЪ рдХрд│рдд рдирд╛рд╣реА.
- рдПрдХрд╛ рдорд┐рдирд┐рдЯрд╛рдЪрд╛ рдкрд╛рд╕ ЁЯОл (EC2 Instance Connect). рдкреБрдврдЪреЗ office рдЖрдзреА рддреБрдореНрд╣реА рдХреЛрдг рдЖрд╣рд╛рдд рддреЗ рддрдкрд╛рд╕рддреЗ, рдордЧ рджрд╛рд░рд╛рд╡рд░ 60 рд╕реЗрдХрдВрдж рдЪрд╛рд▓рдгрд╛рд░рд╛ рдирд╡рд╛ рдкрд╛рд╕ рд▓рд╛рд╡рддреЗ. рджрд╛рд░ рддрд░реАрд╣реА рдЙрдШрдбреЗ рдЕрд╕рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ тАФ рдкрдг рд╣рд░рд╡рд╛рдпрд▓рд╛ рдЪрд╛рд╡реА рдирд╛рд╣реА, рдЖрдгрд┐ рдХреЛрдгреА рдорд╛рдЧрд┐рддрд▓реЗ рддреЗ office рд▓рд┐рд╣реВрди рдареЗрд╡рддреЗ.
- рджрд╛рд░рдЪ рдирд╛рд╣реА ЁЯУЮ (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
тЭУ рдХрд╛рдп
- Key pair тАФ AWS public key рдареЗрд╡рддреЗ рдЖрдгрд┐ launch рд╡реЗрд│реА рддреА instance рд╡рд░
рдЯрд╛рдХрддреЗ; private key рддреБрдореНрд╣реА рдареЗрд╡рддрд╛ (
.pem,chmod 400). Login user AMI рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ: Amazon Linux рд╡рд░ec2-user, Ubuntu рд╡рд░ubuntu. рддреНрдпрд╛рд╕рд╛рдареА network path рдЖрдгрд┐ SG рд╡ NACL рдордзреНрдпреЗ port 22 рдЙрдШрдбрд╛ рдЕрд╕рд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ. - EC2 Instance Connect тАФ IAM рдирд┐рдпрдВрддреНрд░рд┐рдд: API рдПрдХ public key рдЯрд╛рдХрддреЗ рдЬреА 60 рд╕реЗрдХрдВрдж рдЪрд╛рд▓рддреЗ, рдордЧ рддреБрдореНрд╣реА рдиреЗрд╣рдореАрд╕рд╛рд░рдЦреЗ SSH рдХрд░рддрд╛. рддрд░реАрд╣реА port 22 рд▓рд╛рдЧрддреЛ (browser console рд╕рд╛рдареА: AWS рдЪреНрдпрд╛ EC2 Instance Connect address range рд╕рд╛рдареА рдЙрдШрдбрд╛). EC2 Instance Connect Endpoint public IP рдирд╕рд▓реЗрд▓реНрдпрд╛ private subnets рдордзрд▓реНрдпрд╛ instances рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЛ.
- Session Manager (AWS Systems Manager рдЪрд╛ рднрд╛рдЧ) тАФ instance рд╡рд░рдЪрд╛ SSM Agent
(Amazon Linux 2023 рдЖрдгрд┐ рдЕрдиреЗрдХ AMIs рд╡рд░ рдЖрдзреАрдЪ installed) Systems Manager рдХрдбреЗ
outbound HTTPS connection рдХрд░рддреЛ. рддреБрдореНрд╣рд╛рд▓рд╛
AmazonSSMManagedInstanceCorepolicy рдЕрд╕рд▓реЗрд▓реЗ instance profile рд▓рд╛рдЧрддреЗ (рдзрдбрд╛ 07), рдЖрдгрд┐ SSM endpoints рдХрдбреЗ outbound 443 (рдХрд┐рдВрд╡рд╛ private subnets рд╕рд╛рдареА VPC endpoints). Inbound рдирд┐рдпрдо рдирд╛рд╣реА, key рдирд╛рд╣реА. Sessions рдирд╛ IAM рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ, CloudTrail рдордзреНрдпреЗ рдиреЛрдВрдж рд╣реЛрддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреЗ S3 рдХрд┐рдВрд╡рд╛ CloudWatch рдордзреНрдпреЗ log рдареЗрд╡рддрд╛ рдпреЗрддрд╛рдд. рддреЗ port forwarding рд╕реБрджреНрдзрд╛ рдХрд░рддреЗ. - EC2 Serial Console тАФ networking рдХрд┐рдВрд╡рд╛ boot рдЪ рдмрд┐рдШрдбрд▓реЗрд▓реЗ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪрд╛ рд╢реЗрд╡рдЯрдЪрд╛ рдЙрдкрд╛рдп; default рдиреБрд╕рд╛рд░ рдмрдВрдж, рдкреНрд░рддреНрдпреЗрдХ account рд╕рд╛рдареА рдЪрд╛рд▓реВ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдЙрдШрдбрд╛ 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 рдЪрд╛ рдирд┐рд░реНрдгрдп, рдЙрдШрдбреЗ рджрд╛рд░ рдЖрдгрд┐ рдЪрд╛рд╡реА рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдПрдХрдЪ
.pemрдЕрдиреЗрдХ рд▓реЛрдХрд╛рдВрдордзреНрдпреЗ рд╡рд╛рдЯрдгреЗ тАФ рдХреЛрдгрд╛рд▓рд╛рдЪ рдХрд╛рдврддрд╛ рдпреЗрдд рдирд╛рд╣реА рдЖрдгрд┐ рдХреЛрдгреАрдЪ рдЬрдмрд╛рдмрджрд╛рд░ рд░рд╛рд╣рдд рдирд╛рд╣реА - рдЪреБрдХреАрдЪреНрдпрд╛ user рдиреЗ
sshрдХрд░рдгреЗ (root, рдХрд┐рдВрд╡рд╛ Ubuntu рд╡рд░ec2-user) тЖТPermission denied (publickey) - Session Manager "рдЪрд╛рд▓рдд рдирд╛рд╣реА" рдХрд╛рд░рдг instance рд▓рд╛
AmazonSSMManagedInstanceCoreрдЕрд╕рд▓реЗрд▓рд╛ role рдирд╛рд╣реА, рдХрд┐рдВрд╡рд╛ SSM endpoints рдХрдбреЗ outbound рдорд╛рд░реНрдЧ рдирд╛рд╣реА - "рдлрдХреНрдд test рд╕рд╛рдареА" 22
0.0.0.0/0рд╕рд╛рдареА рдЙрдШрдбрдгреЗ рдЖрдгрд┐ рддреЛ рдХрдзреАрдЪ рдмрдВрдж рди рдХрд░рдгреЗ - instance рдЪреА рдПрдХрдореЗрд╡ private key рд╣рд░рд╡рдгреЗ тАФ recovery рдЪреА рдпреЛрдЬрдирд╛ рдХрд░рд╛ (Session Manager, рдХрд┐рдВрд╡рд╛ stop рдЖрдгрд┐ volume swap рдХрд░реВрди рдирд╡реА key)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЕрдиреЗрдХ рд╕рдВрд╕реНрдерд╛ 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