ЁЯдЦ рдзрдбрд╛ 05 тАФ Machine identities: robots рд╕рд╛рдареА badges, keys рдХреЛрдгрд╛рд╕рд╛рдареАрдЪ рдирд╛рд╣реАрдд
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-roles ┬╖ рдкреБрдвреЗ: lesson-06-iam-hygiene
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: machines рд╕реНрд╡рддрдГрдЪреА рдУрд│рдЦ рдХрд╢реА рдкрдЯрд╡рддрд╛рдд тАФ рддреБрдордЪреНрдпрд╛ infrastructure рдордзреВрди рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реА рдЧреБрдкрд┐рддреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрдгрд╛рд░реА рдкрджреНрдзрдд. рдЦрд▒реНрдпрд╛ files:
- iam/ec2-role-trust-policy.json тАФ EC2 рдЯреЛрдкреАрдЪрд╛ trust рджрд╕реНрддрдРрд╡рдЬ
- iam/ecr-push-policy.json тАФ CI robot рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ рдиреЗрдордХреНрдпрд╛ рдЪрд┐рдареНрдареНрдпрд╛
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдд robots рд╕реБрджреНрдзрд╛ рдХрд╛рдо рдХрд░рддрд╛рдд: рдмрд╛рдХ-computers (EC2) рдЖрдгрд┐ courier (CI). рддреНрдпрд╛рдВрдиреА passwords рдмрд╛рд│рдЧрд╛рд╡реЗрдд рдХрд╛? ЁЯШм Robots рдЧреЛрд╖реНрдЯреА рд╣рд░рд╡рддрд╛рдд, рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЦрд┐рд╢рд╛рдВрдЪреЗ рдлреЛрдЯреЛ рдирд┐рдШрддрд╛рдд (logs! repos!), рдЖрдгрд┐ robot рдЪрд╛ password рдХреЛрдгреАрдЪ rotate рдХрд░рдд рдирд╛рд╣реА. рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рдЬрд╛рд╕реНрдд рд╣реБрд╢рд╛рд░реАрдЪреЗ рдХрд╛рд╣реАрддрд░реА рдХрд░рддреЗ тАФ badges, рджрд░ рддрд╛рд╕рд╛рд▓рд╛ рддрд╛рдЬреЗ рджрд┐рд▓реЗрд▓реЗ ЁЯккЁЯдЦ:
рдмрд╛рдХ-computer рдЪрд╛ badge: рдмрд╛рдХ рддрдпрд╛рд░ рд╣реЛрддрд╛рдирд╛ рдХрд╛рд░реНрдпрд╛рд▓рдп рддреНрдпрд╛рд▓рд╛ рдПрдХ рдЯреЛрдкреА рдЕрдбрдХрд╡рддреЗ (рдПрдХ instance profile тАФ рдзрдбрд╛ 04 рдЪреА рдЯреЛрдкреА, hardware рд╡рд░ рдмрд╕рд╡рд▓реЗрд▓реА). рдмрд╛рдХрд╛рдЪреНрдпрд╛ рдЖрдд рдПрдХ рдЫреЛрдЯреА рдЦрд╛рдЪ рдЕрд╕рддреЗ (metadata service) рдЬрд┐рдереЗ machine рд▓рд╛ рдиреЗрд╣рдореА рдЖрдЬрдЪрд╛ рддрд╛рдЬрд╛ badge рдорд┐рд│рддреЛ тАФ рддрд╛рддреНрдкреБрд░рддреА credentials, рдЖрдкреЛрдЖрдк рдиреВрддрдиреАрдХрд░рдг рд╣реЛрдгрд╛рд░реА. k8s course рдЪреЗ EKS nodes ECR рдордзреВрди рдиреЗрдордХреЗ рдпрд╛рдЪ рдкрджреНрдзрддреАрдиреЗ pull рдХрд░рддрд╛рдд. Keys рдирд╛рд╣реАрдд. рдХрдзреАрдЪ рдирд╛рд╣реАрдд.
Courier рдЪрд╛ badge (OIDC): courier рдпреЗрддреЛ рдЖрдгрд┐ рд╕рд╛рдВрдЧрддреЛ "рдореА BaluRaut/learn-docker-school рдЪрд╛, main branch рд╡рд░рдЪрд╛ CI run рдЖрд╣реЗ". AWS courier рдХрдВрдкрдиреАрд▓рд╛ (GitHub/CircleCI рдЪрд╛ OIDC issuer) рдлреЛрди рдХрд░рддреЛ тАФ "рд╣рд╛ robot рдЦрд░реЛрдЦрд░ рддреБрдордЪрд╛ рдЖрд╣реЗ рдХрд╛, рддреНрдпрд╛рдЪ branch рд╡рд░рдЪрд╛?" тАФ рдЖрдгрд┐ рддреЗрд╡реНрд╣рд╛рдЪ рдПрдХрд╛ рдард░рд╛рд╡рд┐рдХ рдЯреЛрдкреАрд╕рд╛рдареА 15 рдорд┐рдирд┐рдЯрд╛рдВрдЪрд╛ badge рджреЗрддреЛ. CI settings рдордзреНрдпреЗ рдХрд╛рд╣реАрдЪ рд╕рд╛рдард╡рд▓реЗрд▓реЗ рдирд╕рддреЗ.
рдЪреБрдХреАрдЪреА рдкрджреНрдзрдд (anti-pattern) тЭМ: рдХрд╛рдпрдордЪреНрдпрд╛
AKIAтАжkeys рдЕрд╕рд▓реЗрд▓рд╛ IAM user рдмрдирд╡реВрди рддреНрдпрд╛ CI рдордзреНрдпреЗ paste рдХрд░рдгреЗ. рд╣реЗ рдЪрд╛рд▓рддреЗ тАФ рдЖрдгрд┐ AWS accounts compromise рд╣реЛрдгреНрдпрд╛рдЪрд╛ рд╣рд╛ #1 рдорд╛рд░реНрдЧ рдЖрд╣реЗ. рдПрдХрджрд╛ рдлреБрдЯрд▓реА (рдПрдЦрд╛рджрд╛ log, fork, screenshot), рдХреА рдХрд╛рдпрдордЪреА рд╡реИрдз.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
ec2["ЁЯЦея╕П EC2 instance<br/>hat clipped on via<br/>instance profile"]
meta["ЁЯкк metadata service<br/>hands fresh temp creds<br/>auto-renewed"]
ci["ЁЯУо CI run<br/>proves itself via OIDC:<br/>'repo X, branch main'"]
role["ЁЯОй a role<br/>least-privilege slips only"]
aws["тШБя╕П AWS APIs<br/>push to ECR, read S3тАж"]
bad["тЭМ AKIA keys in CI settings<br/>permanent, leakable, unrotated"]
ec2 -->|"1"| meta --> role
ci -->|"2 15-min badge"| role
role -->|"3"| aws
bad -.->|"the way NOT to"| aws
тЭУ рдХрд╛рдп
- Instance profile = IAM role рд▓рд╛ EC2 instance рд╡рд░ рдмрд╕рд╡рдгрд╛рд░реА рдпрд╛рдВрддреНрд░рд┐рдХ рдХреНрд▓рд┐рдк (ec2/ec2.tf рдЖрдкрд▓реА рдЬреЛрдбрдгреА рдХрд░рддреЗ). Instance рдордзреАрд▓ SDK/CLI credentials рдЖрдкреЛрдЖрдк рд╢реЛрдзрддрд╛рдд тАФ code рд▓рд╛ рд╢реВрдиреНрдп config рд▓рд╛рдЧрддреЛ.
- OIDC federation = AWS рдмрд╛рд╣реЗрд░рдЪреНрдпрд╛ identity provider рдЪреНрдпрд╛ рд╕рд╣реА рдХреЗрд▓реЗрд▓реНрдпрд╛ tokens
рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рддреЛ. GitHub Actions рдЪреЗ
role-to-assume(Docker course, рдзрдбрд╛ 12) рд╣реЗрдЪ рдЖрд╣реЗ. CircleCI рд╕реБрджреНрдзрд╛ рдпрд╛рд▓рд╛ support рдХрд░рддреЗ. - Least privilege рдЪреА рд╕рд╛рдЦрд│реА: trust policy рдХреЛрдг (рд╣рд╛ repo, рд╣реА branch!) рд╣реЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЗ + permission policy рдХрд╛рдп рд╣реЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЗ (ecr-push-policy.json: рдПрдХ repo, рдлрдХреНрдд push рдЪреА рдХреНрд░рд┐рдпрд╛рдкрджреЗ).
ЁЯдФ рдХрд╛
рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ AWS setup рдордзрд▓реЗ passwords рдореЛрдЬрд╛: root (рдмрдВрдж рдХрд░реВрди рдареЗрд╡рд▓реЗрд▓рд╛), рддреБрдордЪрд╛ SSO loginтАж рдЖрдгрд┐ рдмрд╕. Server credentials рдирд╛рд╣реАрдд, CI secrets рдирд╛рд╣реАрдд, config-file рдордзрд▓реНрдпрд╛ keys рдирд╛рд╣реАрдд. рдкреНрд░рддреНрдпреЗрдХ machine identity рдореНрд╣рдгрдЬреЗ рдПрдХ рдЯреЛрдкреА + рдПрдХ рддрд╛рдЬрд╛ badge. рд╣реА рдПрдХрдЪ рдкрджреНрдзрдд cloud рдЪреНрдпрд╛ рдЗрддрд┐рд╣рд╛рд╕рд╛рддреАрд▓ рд╕рд░реНрд╡рд╛рдд рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░рдЪрд╛ breach рдирд┐рд╡реГрддреНрдд рдХрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (рдореЛрдлрдд тАФ рдХрд╛рдЧрджрд╛рд╡рд░рдЪрд╛ lab + рдПрдХ рдЦрд░реА рддрдкрд╛рд╕рдгреА)
# see whether any permanent keys exist in your account (goal: none/minimal):
aws iam list-users --query 'Users[].UserName' --output text | tr '\t' '\n' | while read u; do
aws iam list-access-keys --user-name "$u" \
--query "AccessKeyMetadata[].[UserName,AccessKeyId,Status,CreateDate]" --output text
done
# every AKIA line: ask "could this be a role instead?" (usually: yes)
# read the two real documents in this repo and say aloud what each allows:
cat iam/ec2-role-trust-policy.json # WHO may wear the hat
cat iam/ecr-push-policy.json # WHAT the wearer may do
# (lesson 12 of Part 2 mounts this hat on a real instance тАФ and you'll
# curl the metadata service from inside it!)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
instance рдордзреВрди metadata endpoint рд╡рд░ curl (рдЖрдзреА IMDSv2 token) рдореБрджрдд рдЕрд╕рд▓реЗрд▓реА рддрд╛рддреНрдкреБрд░рддреА credentials рдкрд░рдд рджреЗрддреЛ; aws sts get-caller-identity instance role рджрд╛рдЦрд╡рддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
lab instance рдЪреЗ terraform destroy рдХрд░рд╛; 'рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА' рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА access keys delete рдХрд░рд╛
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- CI settings рдордзреНрдпреЗ AKIAтАж access keys тАФ OIDC тЖТ role рд╡рд╛рдкрд░рд╛
- рдлрдХреНрдд pull рдХрд░рдгрд╛рд▒реНрдпрд╛ instance role рд▓рд╛
ecr:*тАФ least privilege robots рдирд╛ рд╕реБрджреНрдзрд╛ рд▓рд╛рдЧреВ рд╣реЛрддреЗ - IMDSv1 рдЪрд╛рд▓реВ рдареЗрд╡рдгреЗ тАФ token рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд░рд╛ (
http_tokens = "required")
тПня╕П рдкреБрдвреЗ
рднрд╛рдЧ 1 рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреНрдпрд╛ рднрд┐рдВрддреАрд╡рд░рдЪреНрдпрд╛ рдкреЛрд╕реНрдЯрд░рдиреЗ рд╕рдВрдкрддреЛ: рд╕рд░реНрд╡рд╛рдд рд╕рд╛рдорд╛рдиреНрдп AWS рд╕реБрд░рдХреНрд╖рд╛ рдЪреБрдХрд╛ рдЯрд╛рд│рдгрд╛рд░реА рд╕реНрд╡рдЪреНрдЫрддреЗрдЪреА checklist.
git checkout lesson-06-iam-hygiene