ЁЯОй рдзрдбрд╛ 04 тАФ Roles: рдЯреЛрдкреНрдпрд╛, рдорд╛рдгрд╕реЗ рдирд╡реНрд╣реЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-policies ┬╖ рдкреБрдвреЗ: lesson-05-machine-identities
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ03, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд policies рдирдВрддрд░рдЪреА IAM рдЪреА рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪреА рдХрд▓реНрдкрдирд╛: roles тАФ рдореБрджрдд рд╕рдВрдкрдгрд╛рд▒реНрдпрд╛ timer рд╕рд╣ рдШрд╛рд▓рддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛ рдУрд│рдЦреА. рдЦрд░реА file:
- iam/ec2-role-trust-policy.json тАФ рдЦрд░рд╛ "рд╣реА рдЯреЛрдкреА рдХреЛрдг рдШрд╛рд▓реВ рд╢рдХрддреЗ" рджрд╕реНрддрдРрд╡рдЬ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЬрд╡рд│рдЪреНрдпрд╛ рд╕реНрдЯрдБрдбрд╡рд░ рдЦрд╛рд╕ рдЯреЛрдкреНрдпрд╛ ЁЯОй рдареЗрд╡рддреЗ:
- "рдмрджрд▓реА рд╢рд┐рдХреНрд╖рд┐рдХрд╛" рдЯреЛрдкреА тАФ рдЬреА рддреА рдШрд╛рд▓реЗрд▓ рддреА рд╣рдЬреЗрд░реА рдШреЗрдК рд╢рдХрддреЗ рдЖрдгрд┐ staff room рд╡рд╛рдкрд░реВ рд╢рдХрддреЗ;
- "рдкрд░реАрдХреНрд╖рд╛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ" рдЯреЛрдкреА тАФ рдЬреА рддреА рдШрд╛рд▓реЗрд▓ рддреА рдкрд░реАрдХреНрд╖реЗрдЪреЗ рдХрдкрд╛рдЯ рдЙрдШрдбреВ рд╢рдХрддреЗ, рдлрдХреНрдд рдкрд░реАрдХреНрд╖реЗрдЪреНрдпрд╛ рд╡реЗрд│реА.
рдЯреЛрдкреНрдпрд╛ рдорд╛рдгрд╕реЗ рдирд╛рд╣реАрдд. рддреНрдпрд╛рдВрдирд╛ password рдирд╛рд╣реА, рдШрд░ рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдкреАрд▓рд╛ рджреЛрди рджрд╕реНрддрдРрд╡рдЬ рд▓рдЯрдХрд╡рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд:
- рддреА рдХреЛрдг рдШрд╛рд▓реВ рд╢рдХрддреЗ ЁЯдЭ тАФ trust policy. "рдХреЛрдгрддреАрд╣реА рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдмрджрд▓реА рдЯреЛрдкреА рдШрд╛рд▓реВ рд╢рдХрддреЗ." "рдлрдХреНрдд EC2 service рдмрд╛рдХрд╛рдВрд╡рд░ рдЯреЛрдкреНрдпрд╛ рдШрд╛рд▓реВ рд╢рдХрддреЗ."
- рдШрд╛рд▓рдгрд╛рд░реА рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЗ ЁЯУЭ тАФ рдзрдбрд╛ 03 рдордзрд▓реНрдпрд╛ рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреА рдЪрд┐рдареНрдареНрдпрд╛.
рдЯреЛрдкреА рдШрд╛рд▓рдгреЗ = AssumeRole. рдХрд╛рд░реНрдпрд╛рд▓рдп (STS) рддреБрдореНрд╣рд╛рд▓рд╛ рддрд╛рддреНрдкреБрд░рддреА credentials тП│ рджреЗрддреЗ тАФ рддреА рд╕рд╛рдзрд╛рд░рдг рдПрдХ рддрд╛рд╕ рдЪрд╛рд▓рддрд╛рдд, рдордЧ рд╡рд┐рд░рдШрд│реВрди рдирд╛рд╣реАрд╢реА рд╣реЛрддрд╛рдд. рдЖрдгрд┐ рдиреЛрдВрджрд╡рд╣реА рд╕реБрдВрджрд░ рдЕрд╕рддреЗ: "рдХрддрд░рд┐рдирд╛рдиреЗ, рдкрд░реАрдХреНрд╖рд╛-рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдЯреЛрдкреА рдШрд╛рд▓реВрди, 10:02 рд▓рд╛ рдХрдкрд╛рдЯ рдЙрдШрдбрд▓реЗ." рд╡реНрдпрдХреНрддреА рдЖрдгрд┐ рдЯреЛрдкреА, рджреЛрдиреНрд╣реА, рдиреЗрд╣рдореА.
рдХрддрд░рд┐рдирд╛рд▓рд╛ рдереЗрдЯ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рджреЗрдгреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЯреЛрдкреНрдпрд╛ рдХрд╛ рдЪрд╛рдВрдЧрд▓реНрдпрд╛? рдХрд╛рд░рдг рдЕрдзрд┐рдХрд╛рд░ рдХрд╛рдорд╛рд╕реЛрдмрдд рд░рд╛рд╣рддрд╛рдд, рд╡реНрдпрдХреНрддреАрд╕реЛрдмрдд рдирд╛рд╣реА: рдЖрдЬ рдЬреА рддреЗ рдХрд╛рдо рдХрд░рддреЗ рддрд┐рд▓рд╛ рдЯреЛрдкреА рджреНрдпрд╛, рдЯреЛрдкреАрдЪреЗ рдЕрдзрд┐рдХрд╛рд░ рдПрдХрд╛рдЪ рдард┐рдХрд╛рдгреА audit рдХрд░рд╛, рдЖрдгрд┐ рдЪреЛрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реЗ рдХрд╛рд╣реАрд╣реА рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдирд╕рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
you["ЁЯзС you - a user<br/>or a service, or CI"]
subgraph hat["ЁЯОй role: deploy-admin"]
trust["ЁЯдЭ trust policy:<br/>WHO may wear it"]
perms["ЁЯУЭ permission slips:<br/>what the hat may do"]
end
creds["тП│ temporary creds<br/>valid ~1h, then poof"]
act["тШБя╕П act AS the hat<br/>audit: person + hat"]
you -->|"1 sts:AssumeRole"| hat
hat -->|"2 STS issues"| creds
creds -->|"3"| act
тЭУ рдХрд╛рдп
- Role = рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдЕрд╕рд▓реЗрд▓реА рдкрдг рд╕реНрд╡рддрдГрдЪреА credentials рдирд╕рд▓реЗрд▓реА рдУрд│рдЦ.
Trust policy "рддреА рдХреЛрдг assume рдХрд░реВ рд╢рдХрддреЗ" рдпрд╛рдЪреЗ рдЙрддреНрддрд░ рджреЗрддреЗ (рдПрдХ user, рдПрдХ account,
ec2.amazonaws.comрд╕рд╛рд░рдЦреА service, рдХрд┐рдВрд╡рд╛ federated login). - STS (Security Token Service) рддрд╛рддреНрдкреБрд░рддреА key+secret+token рдЕрд╢реА рддрд┐рдХрдбреА рдмрдирд╡рддреЗ; рдореБрд│рд╛рдд 1 рддрд╛рд╕, рдмрджрд▓рддрд╛ рдпреЗрддреЛ.
- AWS рдордзреНрдпреЗ рдорд╛рдгреВрд╕ рдирд╕рд▓реЗрд▓реЗ рд╕рдЧрд│реЗ рдХрд╛рд╣реА roles рдиреЗрдЪ рдЪрд╛рд▓рддреЗ тАФ рдЖрдгрд┐ рдорд╛рдгрд╕реЗрд╣реА рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХрд╛рдореЗ рдЕрд╢реАрдЪ рдХрд░рддрд╛рдд ("рджрд┐рд╡рд╕рднрд░ prod рдЕрдзрд┐рдХрд╛рд░ рдШреЗрдКрди рдлрд┐рд░рдгреНрдпрд╛рдРрд╡рдЬреА рдпрд╛ рдХрд╛рдорд╛рдкреБрд░рддрд╛ prod-admin role assume рдХрд░рд╛").
- Cross-account access = account B рдордзрд▓рд╛ role рдЬреЛ account A рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рддреЛ. Shared users, рдХрдзреАрдЪ рдирд╛рд╣реА.
ЁЯдФ рдХрд╛
рдХрд╛рдпрдордЪреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рддрд╛рддреНрдкреБрд░рддреЗ рдЪрд╛рдВрдЧрд▓реЗ: рдлреБрдЯрд▓реЗрд▓реЗ 1 рддрд╛рд╕рд╛рдЪреЗ credential рдореНрд╣рдгрдЬреЗ рдПрдХ рд╡рд╛рдИрдЯ рджреБрдкрд╛рд░; рдлреБрдЯрд▓реЗрд▓реА рдХрд╛рдпрдордЪреА key рдореНрд╣рдгрдЬреЗ crypto-mining рдЪреЗ bill рдЖрдгрд┐ incident report. Roles рдХрд╛рдорд╛рд▓рд╛ рд╡реНрдпрдХреНрддреАрдкрд╛рд╕реВрди рд╡реЗрдЧрд│реЗ рдХрд░рддрд╛рдд тАФ groups рдиреЗ рдорд╛рдгрд╕рд╛рдВрд╕рд╛рдареА рдХреЗрд▓реЗрд▓реА рддреАрдЪ рдпреБрдХреНрддреА, machines рдЖрдгрд┐ рдХреНрд╖рдгрд╛рдВрдкрд░реНрдпрдВрдд рд╡рд╛рдврд╡рд▓реЗрд▓реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (рдореЛрдлрдд)
ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
# a hat that trusts YOU (your own account):
cat > /tmp/trust.json <<EOF
{"Version":"2012-10-17","Statement":[{"Effect":"Allow",
"Principal":{"AWS":"arn:aws:iam::${ACCOUNT}:root"},"Action":"sts:AssumeRole"}]}
EOF
aws iam create-role --role-name lab-hat --assume-role-policy-document file:///tmp/trust.json
aws iam attach-role-policy --role-name lab-hat \
--policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
# put the hat on:
aws sts assume-role --role-arn arn:aws:iam::${ACCOUNT}:role/lab-hat \
--role-session-name trying-hats --query 'Credentials.Expiration'
# тЖТ an expiry timestamp ~1h away. THAT's the whole magic. тП│
# who may wear the EC2 hat in this repo? read the real file:
cat iam/ec2-role-trust-policy.json # Principal: ec2.amazonaws.com (lesson 05!)
# cleanup:
aws iam detach-role-policy --role-name lab-hat --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
aws iam delete-role --role-name lab-hat
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
aws sts assume-role рд╕рд╛рдзрд╛рд░рдг рдПрдХрд╛ рддрд╛рд╕рд╛рдиреЗ рд╕рдВрдкрдгрд╛рд▒реНрдпрд╛ Expiration рд╕рд╣ credentials рдкрд░рдд рджреЗрддреЛ; рддреНрдпрд╛рдирдВрддрд░ get-caller-identity рддреБрдордЪрд╛ user рдирд╡реНрд╣реЗ, рддрд░ role ARN рджрд╛рдЦрд╡рддреЛ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реА рдирд╛рд╣реА тАФ рд╣рд╛ рдзрдбрд╛ рдореЛрдлрдд рдЖрд╣реЗ ЁЯОЙ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
*рд▓рд╛ role assume рдХрд░реВ рджреЗрдгрд╛рд░реА trust policy тАФ рдХреЛрдгреАрд╣реА рдШрд╛рд▓реВ рд╢рдХреЗрд▓ рдЕрд╢реА рдЯреЛрдкреА- рддрд╛рддреНрдкреБрд░рддреА credentials config file рдордзреНрдпреЗ paste рдХрд░рдгреЗ (рддреА рд╕рдВрдкрддрд╛рдд; рддреЛрдЪ рддрд░ рдореБрджреНрджрд╛ рдЖрд╣реЗ)
- рддреАрди рдкрд╛рддрд│реНрдпрд╛рдВрдЪреЗ role-chaining рдЖрдгрд┐ рдордЧ рдХреЛрдгреА рдХрд╛рдп рдХреЗрд▓реЗ рдпрд╛рдЪреЗ рдЖрд╢реНрдЪрд░реНрдп тАФ CloudTrail рд╡рд╛рдЪрд╛
тПня╕П рдкреБрдвреЗ
ROBOTS рд╡рд░ рдЯреЛрдкреНрдпрд╛: EC2 instances рдЖрдгрд┐ CI pipelines рдХреБрдареЗрд╣реА password рдирд╕рддрд╛рдирд╛ рдЕрдзрд┐рдХрд╛рд░ рдХрд╕реЗ рдорд┐рд│рд╡рддрд╛рдд тАФ рдЗрддрд░ рддрд┐рдиреНрд╣реА courses рдиреЗ рд╢рд╛рдВрддрдкрдгреЗ рд╡рд╛рдкрд░рд▓реЗрд▓реА рдкрджреНрдзрдд.
git checkout lesson-05-machine-identities