ЁЯОй рдзрдбрд╛ 05 тАФ Roles рдЖрдгрд┐ STS: рдХрд╛рд░реНрдб рдирд╛рд╣реА, рдЯреЛрдкреА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-how-aws-decides ┬╖ рдкреБрдвреЗ: lesson-06-machine-identities
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд roles: password рдирд╕рд▓реЗрд▓реА рдЖрдгрд┐ рдХрд╛рдпрдордЪреА key рдирд╕рд▓реЗрд▓реА identity, рддреА рдХреЛрдг assume рдХрд░реВ рд╢рдХрддреЛ рддреЗ рд╕рд╛рдВрдЧрдгрд╛рд░реА trust policy, рддрд╛рддреНрдкреБрд░рддреА credentials рджреЗрдгрд╛рд░рд╛ STS, рдЖрдгрд┐ рдПрдХрд╛ session рд▓рд╛ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рдгрд╛рд░реА session policy. Files: trust-ci-deployer.json, ci-deploy.json, session-read-only.json.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрддрд▓реНрдпрд╛ рдХрд╛рд╣реА рдХрд╛рдорд╛рдВрд╕реЛрдмрдд рдПрдХ рдЯреЛрдкреА ЁЯОй рдпреЗрддреЗ: "рдкрд░реАрдХреНрд╖рд╛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ" рдЪреА рдЯреЛрдкреА рдкрд░реАрдХреНрд╖реЗрдЪрд╛ рд╣реЙрд▓ рдЙрдШрдбрддреЗ. рддреА рдЯреЛрдкреА рдХреЛрдгрд╛рдЪреНрдпрд╛рдЪ рдорд╛рд▓рдХреАрдЪреА рдирд╕рддреЗ. рддреБрдореНрд╣реА рддреА рдШрд╛рд▓рд╛рдпрд▓рд╛ рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдХрдбреЗ рдорд╛рдЧрддрд╛; рдХрд╛рд░реНрдпрд╛рд▓рдп рдЯреЛрдкреАрдЪреНрдпрд╛ рд▓реЗрдмрд▓рд╡рд░рдЪреА рдпрд╛рджреА рддрдкрд╛рд╕рддреЗ ("рд╣реА рдлрдХреНрдд CI robot рдШрд╛рд▓реВ рд╢рдХрддреЛ"), рдЖрдгрд┐ рддреБрдореНрд╣реА рддреНрдпрд╛ рдпрд╛рджреАрдд рдЕрд╕рд╛рд▓ рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рддреА рдЯреЛрдкреА рдПрдХрд╛ рддрд╛рд╕рд╛рд╕рд╛рдареА рдорд┐рд│рддреЗ. рдордЧ рддреА рдЖрдкреЛрдЖрдк рдирд╛рд╣реАрд╢реА рд╣реЛрддреЗ.
рдЯреЛрдкреА рдШрд╛рддрд▓реА рдЕрд╕рддрд╛рдирд╛ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЯреЛрдкреАрдЪреНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдЕрд╕рддрд╛рдд тАФ рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдирд╛рд╣реАрдд. рдЖрдгрд┐ рдХрд╛рд░реНрдпрд╛рд▓рдп рддреБрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рд╡рд░ рдПрдХ sticker рд▓рд╛рд╡реВрди рдЯреЛрдкреА рджреЗрдК рд╢рдХрддреЗ: "рдЖрдЬ рдлрдХреНрдд рдмрдШрд╛, рд╣рд╛рдд рд▓рд╛рд╡реВ рдирдХрд╛". рддреЛ sticker рдлрдХреНрдд рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдХрд╛рдвреВрди рдШреЗрдК рд╢рдХрддреЛ, рдХрдзреАрдЪ рдирд╡реАрди рджреЗрдК рд╢рдХрдд рдирд╛рд╣реА.
рд╣рд╛рдЪ role: рдЯреЛрдкреА. рд▓реЗрдмрд▓ рдореНрд╣рдгрдЬреЗ рддрд┐рдЪреА trust policy. рдПрдХрд╛ рддрд╛рд╕рд╛рдЪрд╛ pass STS (Security Token Service) рдХрдбреВрди рдпреЗрддреЛ. Sticker рдореНрд╣рдгрдЬреЗ session policy.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
who["ЁЯдЦ user/ci-robot"]
trust["ЁЯП╖я╕П trust policy<br/>Principal: user/ci-robot<br/>Action: sts:AssumeRole"]
sts["ЁЯОЯя╕П STS AssumeRole<br/>ASIAтАж key + session token<br/>expires in 1 hour"]
sess["ЁЯОй assumed-role/ci-deployer/build-42"]
perm["ЁЯУЭ ci-deploy policy<br/>ecr:PutImage тАж"]
who -->|"1 may I wear it?"| trust -->|"2 yes"| sts --> sess
sess -->|"3 acts with"| perm
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l05
тЭУ рдХрд╛рдп
- Role тАФ рджреЛрди policies рдЕрд╕рд▓реЗрд▓реА IAM identity: trust policy (role рд╡рд░рдЪреА resource
policy: рддреЛ рдХреЛрдг assume рдХрд░реВ рд╢рдХрддреЛ,
Principalрд╕рд╣) рдЖрдгрд┐ permission policies (role рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЛ). Password рдирд╛рд╣реА, рджреАрд░реНрдШрдХрд╛рд│рд╛рдЪреА access key рдирд╛рд╣реА. - STS тАФ
AssumeRoleрдПрдХAccessKeyId(ASIAрдиреЗ рд╕реБрд░реВ рд╣реЛрдгрд╛рд░реА), рдПрдХSecretAccessKey, рдПрдХSessionTokenрдЖрдгрд┐ рдПрдХExpirationрдкрд░рдд рджреЗрддреЛ. рдореВрд│ рдХрд╛рд▓рд╛рд╡рдзреА 1 рддрд╛рд╕; рддреБрдореНрд╣реА 15 рдорд┐рдирд┐рдЯрд╛рдВрдкрд╛рд╕реВрди role рдЪреНрдпрд╛ рдХрдорд╛рд▓ session рдХрд╛рд▓рд╛рд╡рдзреАрдкрд░реНрдпрдВрдд (12 рддрд╛рд╕рд╛рдВрдкрд░реНрдпрдВрдд) рдорд╛рдЧреВ рд╢рдХрддрд╛. Role chaining (рдПрдХрд╛ role рдиреЗ рджреБрд╕рд░рд╛ role assume рдХрд░рдгреЗ) 1 рддрд╛рд╕рд╛рдкрд░реНрдпрдВрддрдЪ рдорд░реНрдпрд╛рджрд┐рдд рдЕрд╕рддреЗ. - Session ARN тАФ
arn:aws:sts::111122223333:assumed-role/ci-deployer/build-42: role рдЪреЗ рдирд╛рд╡ рдЖрдгрд┐ рддреБрдореНрд╣реА рдирд┐рд╡рдбрд▓реЗрд▓реЗ session рдЪреЗ рдирд╛рд╡ тАФ CloudTrail рд╣реЗрдЪ рдиреЛрдВрджрд╡рддреЛ, рдореНрд╣рдгреВрди рдЕрд░реНрдердкреВрд░реНрдг рдирд╛рд╡реЗ рдирд┐рд╡рдбрд╛. - Session policy тАФ
AssumeRoleрд╕реЛрдмрдд рджрд┐рд▓реА рдЬрд╛рддреЗ (--policyрдХрд┐рдВрд╡рд╛--policy-arns). Effective permissions = role policies тИй session policy. рддреА рдлрдХреНрдд рдорд░реНрдпрд╛рджрд┐рдд рдХрд░реВ рд╢рдХрддреЗ. - рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдиреА рд╣реЛ рдореНрд╣рдгрд╛рдпрд▓рд╛ рд╣рд╡реЗ тАФ trust policy рдиреЗ caller рд▓рд╛ allow рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡реЗ, рдЖрдгрд┐ (accounts
рдУрд▓рд╛рдВрдбрддрд╛рдирд╛, рдзрдбрд╛ 09) caller рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ policies рдиреА рддреНрдпрд╛ role рд╡рд░
sts:AssumeRoleallow рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡реЗ.
ЁЯдФ рдХрд╛
рджреАрд░реНрдШрдХрд╛рд│рд╛рдЪреНрдпрд╛ keys рдлреБрдЯрддрд╛рдд тАФ git рдордзреНрдпреЗ, logs рдордзреНрдпреЗ, laptops рдордзреНрдпреЗ тАФ рдЖрдгрд┐ рдХреЛрдгрд╛рдЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдпреЗрдИрдкрд░реНрдпрдВрдд рдЪрд╛рд▓реВрдЪ рд░рд╛рд╣рддрд╛рдд. рддрд╛рддреНрдкреБрд░рддреА credentials рдЖрдкреЛрдЖрдк рд╕рдВрдкрддрд╛рдд, рдирд╛рд╡ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ session рд╢реА рдЬреЛрдбрд▓реЗрд▓реА рдЕрд╕рддрд╛рдд, рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рдХрдзреАрдЪ rotate рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрдд рдирд╛рд╣реА. AWS services, CI systems, рдЗрддрд░ accounts рдЖрдгрд┐ рд▓реЛрдХ (рдзрдбрд╛ 10) рдпрд╛рдВрдирд╛ access roles рдордзреВрдирдЪ рдорд┐рд│рд╛рдпрд▓рд╛ рд╣рд╡рд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
iam/demo.py рдордзрд▓рд╛ roles() ci-robot рдЖрдгрд┐ dipika рд╕рд╛рдареА matches() рдиреЗ trust statement
рддрдкрд╛рд╕рддреЛ, рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ credentials рдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг print рдХрд░рддреЛ, рдЖрдгрд┐ рдордЧ
session рд╕рд╛рдареА decide() call рдХрд░рддреЛ тАФ рдПрдХрджрд╛ рдлрдХреНрдд role policy рд╕рд╣, рдЖрдгрд┐ рдПрдХрджрд╛
read-only session policy рдЬреЛрдбреВрди (session=).
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 iam/demo.py roles
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide, load, matches
trust = load("trust-ci-deployer")["Statement"][0]
role = "arn:aws:iam::111122223333:role/ci-deployer"
print("ci-robot may assume:", matches(trust, "sts:AssumeRole", role, {}, "arn:aws:iam::111122223333:user/ci-robot"))
print("partner may assume: ", matches(trust, "sts:AssumeRole", role, {}, "arn:aws:iam::444455556666:user/ci-robot"))
sess = "arn:aws:sts::111122223333:assumed-role/ci-deployer/build-43"
ci = [("ci-deploy", load("ci-deploy"))]
wide = [("session-s3", {"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": "s3:*", "Resource": "*"}]})]
print("in both: ", decide(sess, "ecr:GetAuthorizationToken", "*", identity=ci, session=[("session-read-only", load("session-read-only"))])[0])
print("session only: ", decide(sess, "s3:GetObject", "arn:aws:s3:::school-reports/term1.pdf", identity=ci, session=wide)[0])
EOF
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд):
aws iam create-role --role-name ci-deployer --assume-role-policy-document file://iam/policies/trust-ci-deployer.json
aws iam put-role-policy --role-name ci-deployer --policy-name ci-deploy --policy-document file://iam/policies/ci-deploy.json
aws sts assume-role --role-arn arn:aws:iam::111122223333:role/ci-deployer --role-session-name build-42 --duration-seconds 3600
aws sts assume-role --role-arn arn:aws:iam::111122223333:role/ci-deployer --role-session-name build-43 --policy file://iam/policies/session-read-only.json
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
roles рд╣реЗ print рдХрд░рддреЛ: ЁЯОй ci-robot тАж trust policy lets them тЬЕ, ЁЯОй dipika тАж refuses ЁЯЪл,
рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ credentials рдЪреА рдУрд│, рдордЧ тЬЕ role session тЖТ ecr:PutImage ALLOW рдЖрдгрд┐
ЁЯЪл same session + read-only session policy IMPLICIT DENY тАФ outside the session policy passed to AssumeRole.
рддреБрдордЪрд╛ snippet True, False (рддреЗрдЪ user рдирд╛рд╡, рдкрдг рд╡реЗрдЧрд│реЗ account тАФ рд▓реЗрдмрд▓рд╡рд░рдЪрд╛
principal рдирд╛рд╣реА), ALLOW (рджреЛрдШрд╛рдВрдиреАрд╣реА allow рдХреЗрд▓реЗрд▓реЗ) рдЖрдгрд┐ IMPLICIT DENY (session policy
s3:* рд▓рд╛ allow рдХрд░рддреЗ, рдкрдг role рдХрдбреЗ рддреЗ рдХрдзреАрдЪ рдирд╡реНрд╣рддреЗ тАФ session policy рдХрд╛рд╣реА рдЬреЛрдбреВ рд╢рдХрдд рдирд╛рд╣реА) print рдХрд░рддреЛ. рдЦрд▒реНрдпрд╛
account рд╡рд░ assume-role рдПрдХ Credentials block рдкрд░рдд рджреЗрддреЛ, рдЬреНрдпрд╛рдЪрд╛ AccessKeyId ASIA рдиреЗ рд╕реБрд░реВ рд╣реЛрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Role рдШрд╛рддрд▓рд╛ рдЬрд╛рддреЛ, рддреЛ рдХреЛрдгрд╛рдЪреНрдпрд╛ рдорд╛рд▓рдХреАрдЪрд╛ рдирд╕рддреЛ: trust policy рддреЛ рдХреЛрдг рдШрд╛рд▓реВ рд╢рдХрддреЛ рддреЗ рдирд┐рд╡рдбрддреЗ, STS pass рддрд╛рддреНрдкреБрд░рддрд╛ рдмрдирд╡рддреЛ, рдЖрдгрд┐ session policy role рдХрдбреЗ рдЖрдзреАрдЪ рдЕрд╕рд▓реЗрд▓реЗ рдлрдХреНрдд рдХрдореАрдЪ рдХрд░реВ рд╢рдХрддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- trust policy рдордзреНрдпреЗ
"Principal": {"AWS": "*"}тАФ рдХреЛрдгрддреНрдпрд╛рд╣реА account рдордзрд▓рд╛ рдХреЛрдгреАрд╣реА рдкреНрд░рдпрддреНрди рдХрд░реВ рд╢рдХрддреЛ - trust policy (рдХреЛрдг) рдЖрдгрд┐ permission policy (рдХрд╛рдп) рдпрд╛рдВрдЪреА рдЧрд▓реНрд▓рдд рдХрд░рдгреЗ
- "рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╛рд╣рд╛рд╡реЗ рдореНрд╣рдгреВрди" 12 рддрд╛рд╕рд╛рдВрдЪреЗ sessions рдорд╛рдЧрдгреЗ тАФ рдЬреЗрд╡рдвреЗ рд▓рд╣рд╛рди рддреЗрд╡рдвреЗ рд╕реБрд░рдХреНрд╖рд┐рдд
session1рд╕рд╛рд░рдЦреА session рдирд╛рд╡реЗ тАФ рдордЧ CloudTrail builds рдХрд┐рдВрд╡рд╛ рд▓реЛрдХ рд╡реЗрдЧрд│реЗ рдУрд│рдЦреВ рд╢рдХрдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдиреАрдЯ рдЪрд╛рд▓рд╡рд▓реЗрд▓реНрдпрд╛ AWS рд╡реНрдпрд╡рд╕реНрдерд╛рдВрдордзреНрдпреЗ рдЬрд╡рд│рдЬрд╡рд│ рдкреНрд░рддреНрдпреЗрдХ caller рд╣рд╛ role session рдЕрд╕рддреЛ тАФ services, pipelines, рдЗрддрд░ accounts рдЖрдгрд┐ SSO рдордзреВрди рдпреЗрдгрд╛рд░реЗ рд▓реЛрдХ тАФ рдЖрдгрд┐ рджреАрд░реНрдШрдХрд╛рд│рд╛рдЪреНрдпрд╛ access keys рдЪреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╡рд│рдЬрд╡рд│ рд╢реВрдиреНрдп рдЕрд╕рддреЗ.
тПня╕П рдкреБрдвреЗ
рдЬреЛ robot AWS рдордзреНрдпреЗ рдореБрд│реАрдЪ рдирд╛рд╣реА тАФ GitHub Actions, рдПрдЦрд╛рджрд╛ pod, рдПрдЦрд╛рджрд╛ Lambda тАФ рддреНрдпрд╛рд▓рд╛ рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ key рд╢рд┐рд╡рд╛рдп рдЯреЛрдкреА рдХрд╢реА рдорд┐рд│рддреЗ? Machine identities.
git checkout lesson-06-machine-identities