ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯОй рдзрдбрд╛ 04 тАФ Roles: рдЯреЛрдкреНрдпрд╛, рдорд╛рдгрд╕реЗ рдирд╡реНрд╣реЗ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯОй рдзрдбрд╛ 04 тАФ Roles: рдЯреЛрдкреНрдпрд╛, рдорд╛рдгрд╕реЗ рдирд╡реНрд╣реЗ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-policies ┬╖ рдкреБрдвреЗ: lesson-05-machine-identities


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ03, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд policies рдирдВрддрд░рдЪреА IAM рдЪреА рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪреА рдХрд▓реНрдкрдирд╛: roles тАФ рдореБрджрдд рд╕рдВрдкрдгрд╛рд▒реНрдпрд╛ timer рд╕рд╣ рдШрд╛рд▓рддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛ рдУрд│рдЦреА. рдЦрд░реА file:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│рд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЬрд╡рд│рдЪреНрдпрд╛ рд╕реНрдЯрдБрдбрд╡рд░ рдЦрд╛рд╕ рдЯреЛрдкреНрдпрд╛ ЁЯОй рдареЗрд╡рддреЗ:

рдЯреЛрдкреНрдпрд╛ рдорд╛рдгрд╕реЗ рдирд╛рд╣реАрдд. рддреНрдпрд╛рдВрдирд╛ password рдирд╛рд╣реА, рдШрд░ рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдкреАрд▓рд╛ рджреЛрди рджрд╕реНрддрдРрд╡рдЬ рд▓рдЯрдХрд╡рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд:

  1. рддреА рдХреЛрдг рдШрд╛рд▓реВ рд╢рдХрддреЗ ЁЯдЭ тАФ trust policy. "рдХреЛрдгрддреАрд╣реА рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдмрджрд▓реА рдЯреЛрдкреА рдШрд╛рд▓реВ рд╢рдХрддреЗ." "рдлрдХреНрдд EC2 service рдмрд╛рдХрд╛рдВрд╡рд░ рдЯреЛрдкреНрдпрд╛ рдШрд╛рд▓реВ рд╢рдХрддреЗ."
  2. рдШрд╛рд▓рдгрд╛рд░реА рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЗ ЁЯУЭ тАФ рдзрдбрд╛ 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

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рдпрдордЪреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рддрд╛рддреНрдкреБрд░рддреЗ рдЪрд╛рдВрдЧрд▓реЗ: рдлреБрдЯрд▓реЗрд▓реЗ 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 рджрд╛рдЦрд╡рддреЛ.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛

рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реА рдирд╛рд╣реА тАФ рд╣рд╛ рдзрдбрд╛ рдореЛрдлрдд рдЖрд╣реЗ ЁЯОЙ

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

ROBOTS рд╡рд░ рдЯреЛрдкреНрдпрд╛: EC2 instances рдЖрдгрд┐ CI pipelines рдХреБрдареЗрд╣реА password рдирд╕рддрд╛рдирд╛ рдЕрдзрд┐рдХрд╛рд░ рдХрд╕реЗ рдорд┐рд│рд╡рддрд╛рдд тАФ рдЗрддрд░ рддрд┐рдиреНрд╣реА courses рдиреЗ рд╢рд╛рдВрддрдкрдгреЗ рд╡рд╛рдкрд░рд▓реЗрд▓реА рдкрджреНрдзрдд.

git checkout lesson-05-machine-identities

ЁЯОй Lesson 04 тАФ Roles: hats, not people

ЁЯУН You are here: Lesson 04 of 12 ┬╖ Previous: lesson-03-policies ┬╖ Next: lesson-05-machine-identities


ЁЯУж What's in this branch

Lessons 01тАУ03, plus the most important IAM idea after policies: roles тАФ wearable identities with an expiry timer. Real file:

ЁЯзТ Explain like I'm 5

The school keeps special hats ЁЯОй on a stand by the office:

The hats are not people. They have no password, no home. Two documents hang from each hat:

  1. Who may wear it ЁЯдЭ тАФ the trust policy. "Any teacher may wear the substitute hat." "Only the EC2 service may put hats on desks."
  2. What the wearer may do ЁЯУЭ тАФ normal permission slips from lesson 03.

Putting a hat on = AssumeRole. The office (STS) hands you temporary credentials тП│ тАФ they work for about an hour, then dissolve into nothing. And the logbook is beautiful: "Katrina, wearing exam-invigilator, opened the cupboard at 10:02." Person AND hat, always.

Why hats beat handing Katrina the permissions directly? Because the powers live with the job, not the person: give the hat to whoever does the job today, audit the hat's powers in one place, and NOTHING long-lived exists to steal.

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯдФ Why

Temporary beats permanent: a leaked 1-hour credential is a bad afternoon; a leaked permanent key is a crypto-mining bill and an incident report. Roles also separate the job from the person тАФ the exact trick groups did for humans, extended to machines and moments.

ЁЯзк Try it (free)

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

тЬЕ Verify тАФ what you should see

aws sts assume-role returns credentials with an Expiration about an hour away; get-caller-identity afterwards shows the role ARN, not your user.

ЁЯз╣ Clean up тАФ do not leave running

nothing to clean up тАФ this lesson is free ЁЯОЙ

тЪая╕П Common mistakes

тПня╕П Next

Hats on ROBOTS: how EC2 instances and CI pipelines get powers with no passwords anywhere тАФ the pattern all three other courses quietly used.

git checkout lesson-05-machine-identities
тЖР PreviouspoliciesNext тЖТmachine identities

This page is the lesson's README from the lesson-04-roles branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.