ЁЯФС рдзрдбрд╛ 09 тАФ Connecting: рджрд╛рд░рд╛рдЪреА рдЪрд╛рд╡реА рд╡рд┐рд░реБрджреНрдз рд╕реЛрдмрддреАрдиреЗ рдХреЗрд▓реЗрд▓реА рднреЗрдЯ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреЗ: lesson-08-types-pricing ┬╖ рдкреБрдвреЗ: lesson-10-security-groups
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: рддреБрдордЪреНрдпрд╛ рдмрд╛рдХрд╛рд╡рд░ shell рдорд┐рд│рд╡рдгреЗ тАФ рдХреНрд▓рд╛рд╕рд┐рдХ рдорд╛рд░реНрдЧ (SSH + key pairs) рдЖрдгрд┐ рдЖрдзреБрдирд┐рдХ рдорд╛рд░реНрдЧ (SSM Session Manager).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рддреБрдордЪреНрдпрд╛ рдмрд╛рдХрд╛рд▓рд╛ screen рдирд╛рд╣реА тАФ рдордЧ рддреБрдореНрд╣реА рддреНрдпрд╛рд╡рд░ рдмрд╕рдгрд╛рд░ рдХрд╕реЗ? рдЗрдорд╛рд░рддреАрдд рдЬрд╛рдгреНрдпрд╛рдЪреЗ рджреЛрди рдорд╛рд░реНрдЧ:
рдорд╛рд░реНрдЧ 1 тАФ рджрд╛рд░рд╛рдЪреА рдЪрд╛рд╡реА ЁЯФС (SSH). рдмрд╛рдХ рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд╛рдирд╛ рддреБрдореНрд╣реА AWS рд▓рд╛ рдПрдХ рдХреБрд▓реВрдк рджреЗрддрд╛ (рддреБрдордЪреА public key); AWS рддреЗ рдмрд╛рдХрд╛рд▓рд╛ рдкрдХреНрдХреЗ рдмрд╕рд╡рддреЗ. рддреНрдпрд╛рд▓рд╛ рдЬреБрд│рдгрд╛рд░реА рдЪрд╛рд╡реА (рддреБрдордЪреА private key) рддреБрдордЪрд╛ рдЦрд┐рд╕рд╛ рдХрдзреАрдЪ рд╕реЛрдбрдд рдирд╛рд╣реА. рджрд╛рд░ 22 рд╡рд░ рдпрд╛, рддреБрдордЪреА рдЪрд╛рд╡реА рддреБрдордЪреНрдпрд╛ рдХреБрд▓рдкрд╛рд▓рд╛ рдмрд╕рддреЗ, рддреБрдореНрд╣реА рдЖрдд.
рд▓реЛрдХрд╛рдВрдирд╛ рдЪрд╛рд╡рдгрд╛рд▒реНрдпрд╛ рдмрд╛рд░реАрдХ рдЕрдЯреА:
- Private key рд╣рд░рд╡рд▓реА тЖТ рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЛрдгреАрдЪ рдЖрдд рдШреЗрдК рд╢рдХрдд рдирд╛рд╣реА ("forgot password" рдирд╛рд╣реА).
- рддреА рд╕рд╣рдХрд╛рд▒реНрдпрд╛рд▓рд╛ рджрд┐рд▓реА тЖТ рдзрдбрд╛ 01 рдордзрд▓рд╛ shared-card рдЪрд╛ рдЖрдЬрд╛рд░ рдкрд░рдд рдпреЗрддреЛ.
- рдЖрдгрд┐ рджрд╛рд░ 22 рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдЙрдШрдбреЗ рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ (рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдпрд╛рджреАрддреАрд▓ рдПрдХ рдиреЛрдВрдж тАФ рдзрдбрд╛ 10), рдореНрд╣рдгрдЬреЗ рд╕рдВрдкреВрд░реНрдг internet рд▓рд╛ рдареЛрдард╡рд╛рдпрд▓рд╛ рдЖрд╡рдбрдгрд╛рд░реЗ рдЖрдгрдЦреА рдПрдХ рджрд╛рд░.
рдорд╛рд░реНрдЧ 2 тАФ рд╕реЛрдмрддреАрдиреЗ рдХреЗрд▓реЗрд▓реА рднреЗрдЯ ЁЯЫЧ (SSM Session Manager). рдЙрдШрдбреЗ рджрд╛рд░рдЪ рдирд╛рд╣реА. рддреБрдореНрд╣реА рдкреБрдврдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░рддрд╛ (AWS рдЪрд╛ API, рдЬреЛ рддреБрдордЪреЗ IAM рдХрд╛рд░реНрдб рддрдкрд╛рд╕рддреЛ); рдХрд╛рд░реНрдпрд╛рд▓рдп рдмрд╛рдХрд╛рдЪреНрдпрд╛ рдЕрдВрдЧрднреВрдд рд╕рд╣рд╛рдпреНрдпрдХрд╛рд▓рд╛ рдлреЛрди рдХрд░рддреЗ (SSM agent, рдЬреНрдпрд╛рд▓рд╛ рдзрдбрд╛ 05 рдордзрд▓реА рдмрд╛рдХрд╛рдЪреА рдЯреЛрдкреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ); рд╕рд╣рд╛рдпреНрдпрдХ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдЪреНрдпрд╛ corridor рдордзреВрди рдЖрдд рдШреЗрдКрди рдЬрд╛рддреЛ. Port рдирд╛рд╣реА, key file рдирд╛рд╣реА, рдЖрдгрд┐ рдиреЛрдВрджрд╡рд╣реА рд╕рдВрдкреВрд░реНрдг рднреЗрдЯ рдиреЛрдВрджрд╡рддреЗ тАФ рд╢рд╛рд│реЗрд▓рд╛ рд╣рд╡реЗ рдЕрд╕реЗрд▓ рддрд░ keystrokes рд╕реБрджреНрдзрд╛.
рдЖрдзреБрдирд┐рдХ default: SSM. рдЭрдЯрдкрдЯ рд╡реИрдпрдХреНрддрд┐рдХ labs рд╕рд╛рдареА (рддреБрдордЪреНрдпрд╛ IP рдкреБрд░рддреЗ рдорд░реНрдпрд╛рджрд┐рдд) рдЖрдгрд┐ рднрд░рдкреВрд░ file-copy рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдХрд╛рдорд╛рдВрд╕рд╛рдареА SSH рдЙрддреНрддрдордЪ рд░рд╛рд╣рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph ssh["ЁЯФС way 1: SSH"]
key["private key - your pocket<br/>public key - on the desk"]
p22["ЁЯЪк port 22 open<br/>(only to YOUR IP!)"]
end
subgraph ssm["ЁЯЫЧ way 2: SSM"]
api["front office: AWS API<br/>checks your IAM card"]
agent["desk assistant: SSM agent<br/>authorized by the desk's hat ЁЯОй"]
end
desk["ЁЯЦея╕П a shell on the desk"]
key --> p22 -->|"1 classic"| desk
api --> agent -->|"2 no open door, audited"| desk
тЭУ рдХрд╛рдп
- Key pair = asymmetric crypto: public key (share рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реА, instance рд╡рд░), private key (рдЧреБрдкреНрдд, рддреБрдордЪреА). рддреБрдордЪреА private key AWS рдХрдбреЗ рдХрдзреАрдЪ рдирд╕рддреЗ.
- SSM рд▓рд╛ рд▓рд╛рдЧрддреЗ: agent (Amazon Linux рд╡рд░ рдЖрдзреАрдЪ installed) + SSM рд▓рд╛ рдкрд░рд╡рд╛рдирдЧреА
рджреЗрдгрд╛рд░рд╛ instance role (
AmazonSSMManagedInstanceCore) + рддреБрдордЪреА IAM рдкрд░рд╡рд╛рдирдЧреА. рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛: рджреЛрдиреНрд╣реА рдмрд╛рдЬреВ IAM рдиреЗ authorize рд╣реЛрддрд╛рдд тАФ рднрд╛рдЧ 1 рдЪреЗ рдлрд│ рдорд┐рд│рддреЗ. - SSM рдЪреЗ рдмреЛрдирд╕: public IP рдирд╕рд▓реЗрд▓реНрдпрд╛ рдмрд╛рдХрд╛рдВрд╡рд░ рдЪрд╛рд▓рддреЗ, bastion hosts рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрддреЗ, corridor рдордзреВрди port-forward рдХрд░рддреЗ, sessions рдиреЛрдВрджрд╡рддрд╛ рдпреЗрддрд╛рдд.
ЁЯдФ рдХрд╛
"рдЬрдЧрд╛рд╕рд╛рдареА port 22 рдЙрдШрдбрд╛ + shared pem file" рд╣реЗ internet рд╡рд░рдЪреЗ рд╕рд░реНрд╡рд╛рдд рдЬрд╛рд╕реНрдд рд╣рд▓реНрд▓реЗ рд╣реЛрдгрд╛рд░реЗ рджрд╛рд░ рдЖрд╣реЗ тАФ рдкреГрдереНрд╡реАрд╡рд░рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ scanner рдХрд╛рд╣реА рдорд┐рдирд┐рдЯрд╛рдВрдд рдареЛрдард╛рд╡рддреЛ. IAM рдиреЗ рддрдкрд╛рд╕рд▓реЗрд▓рд╛, рдЙрдШрдбреЗ рджрд╛рд░ рдирд╕рд▓реЗрд▓рд╛ рдорд╛рд░реНрдЧ рдореНрд╣рдгрдЬреЗрдЪ security teams рдЬреНрдпрд╛рд▓рд╛ "zero inbound" рдореНрд╣рдгрддрд╛рдд. рджреЛрдиреНрд╣реА рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗ рдХреА рддреБрдореНрд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдиреБрд╕рд╛рд░ рдпреЛрдЧреНрдп рдирд┐рд╡рдб рдХрд░рд╛рд▓.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~10 рдорд┐рдирд┐рдЯреЗ, ~1┬в)
cd ec2 && terraform apply -var my_ip=$(curl -s ifconfig.me)/32 # desk up (lesson 07)
# --- way 2 first: SSM, no key, no open door needed ---
aws ssm start-session --target $(aws ec2 describe-instances \
--filters Name=tag:Name,Values=school-desk Name=instance-state-name,Values=running \
--query 'Reservations[0].Instances[0].InstanceId' --output text)
# you're IN. try: hostname ; whoami ; exit
# (works because ec2.tf attached AmazonSSMManagedInstanceCore to the desk's hat? тАФ
# if the session refuses: that's your homework, add it to the role ЁЯШЙ)
# --- way 1: classic SSH (needs a key pair added to ec2.tf as an exercise) ---
# ssh -i my-key.pem ec2-user@$(terraform output -raw public_ip)
# ЁЯз╣ the lab rule:
terraform destroy -var my_ip=$(curl -s ifconfig.me)/32
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
aws ssm start-session --target i-тАж security group рдордзреНрдпреЗ port 22 рдЙрдШрдбрд╛ рдирд╕рддрд╛рдирд╛ рддреБрдореНрд╣рд╛рд▓рд╛ shell рдордзреНрдпреЗ рдиреЗрддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
terraform destroy; рддреБрд▓рдиреЗрд╕рд╛рдареА key pair рдмрдирд╡рд▓реА рдЕрд╕реЗрд▓ рддрд░ рддреА delete рдХрд░рд╛
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- 0.0.0.0/0 рд╕рд╛рдареА port 22 рдЙрдШрдбрд╛ тАФ рдХреНрд▓рд╛рд╕рд┐рдХ honeypot
- рд╕рдВрдкреВрд░реНрдг team рдиреЗ рд╡рд╛рдЯреВрди рдШреЗрддрд▓реЗрд▓реА рдПрдХрдЪ private key file
- instance role рд▓рд╛ SSM policy рдирд╕рд▓реНрдпрд╛рдиреЗ SSM 'рдЪрд╛рд▓рдд рдирд╛рд╣реА' тАФ рд╣рд╛ IAM рдЪрд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ, networking рдЪрд╛ рдирд╛рд╣реА
тПня╕П рдкреБрдвреЗ
рддреЛ "рдлрдХреНрдд рддреБрдордЪреНрдпрд╛ IP рд╡рд░реВрди" рджрд╛рд░рд╛рдЪрд╛ рдирд┐рдпрдо рд╕реНрд╡рддрдВрддреНрд░ рдзрдбреНрдпрд╛рд╕ рдкрд╛рддреНрд░ рдЖрд╣реЗ: security groups тАФ рджреНрд╡рд╛рд░рдкрд╛рд▓рд╛рдЪреА рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА.
git checkout lesson-10-security-groups