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

ЁЯдЦ рдзрдбрд╛ 05 тАФ Machine identities: robots рд╕рд╛рдареА badges, keys рдХреЛрдгрд╛рд╕рд╛рдареАрдЪ рдирд╛рд╣реАрдд

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-roles ┬╖ рдкреБрдвреЗ: lesson-06-iam-hygiene


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

рдзрдбреЗ 01тАУ04, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: machines рд╕реНрд╡рддрдГрдЪреА рдУрд│рдЦ рдХрд╢реА рдкрдЯрд╡рддрд╛рдд тАФ рддреБрдордЪреНрдпрд╛ infrastructure рдордзреВрди рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реА рдЧреБрдкрд┐рддреЗ рдХрд╛рдвреВрди рдЯрд╛рдХрдгрд╛рд░реА рдкрджреНрдзрдд. рдЦрд▒реНрдпрд╛ files:

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

рд╢рд╛рд│реЗрдд robots рд╕реБрджреНрдзрд╛ рдХрд╛рдо рдХрд░рддрд╛рдд: рдмрд╛рдХ-computers (EC2) рдЖрдгрд┐ courier (CI). рддреНрдпрд╛рдВрдиреА passwords рдмрд╛рд│рдЧрд╛рд╡реЗрдд рдХрд╛? ЁЯШм Robots рдЧреЛрд╖реНрдЯреА рд╣рд░рд╡рддрд╛рдд, рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдЦрд┐рд╢рд╛рдВрдЪреЗ рдлреЛрдЯреЛ рдирд┐рдШрддрд╛рдд (logs! repos!), рдЖрдгрд┐ robot рдЪрд╛ password рдХреЛрдгреАрдЪ rotate рдХрд░рдд рдирд╛рд╣реА. рдореНрд╣рдгреВрди рд╢рд╛рд│рд╛ рдЬрд╛рд╕реНрдд рд╣реБрд╢рд╛рд░реАрдЪреЗ рдХрд╛рд╣реАрддрд░реА рдХрд░рддреЗ тАФ badges, рджрд░ рддрд╛рд╕рд╛рд▓рд╛ рддрд╛рдЬреЗ рджрд┐рд▓реЗрд▓реЗ ЁЯккЁЯдЦ:

ЁЯЧ║я╕П рдЖрдХреГрддреА

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

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

ЁЯдФ рдХрд╛

рдЪрд╛рдВрдЧрд▓реНрдпрд╛ рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ 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 рдХрд░рд╛

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

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

рднрд╛рдЧ 1 рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреНрдпрд╛ рднрд┐рдВрддреАрд╡рд░рдЪреНрдпрд╛ рдкреЛрд╕реНрдЯрд░рдиреЗ рд╕рдВрдкрддреЛ: рд╕рд░реНрд╡рд╛рдд рд╕рд╛рдорд╛рдиреНрдп AWS рд╕реБрд░рдХреНрд╖рд╛ рдЪреБрдХрд╛ рдЯрд╛рд│рдгрд╛рд░реА рд╕реНрд╡рдЪреНрдЫрддреЗрдЪреА checklist.

git checkout lesson-06-iam-hygiene

ЁЯдЦ Lesson 05 тАФ Machine identities: badges for robots, keys for nobody

ЁЯУН You are here: Lesson 05 of 12 ┬╖ Previous: lesson-04-roles ┬╖ Next: lesson-06-iam-hygiene


ЁЯУж What's in this branch

Lessons 01тАУ04, plus: how machines authenticate тАФ the pattern that removes long-lived secrets from your infrastructure. Real files:

ЁЯзТ Explain like I'm 5

Robots work at the school too: the desk-computers (EC2) and the courier (CI). Should they carry passwords? ЁЯШм Robots lose things, their pockets get photographed (logs! repos!), and nobody rotates a robot's password. So the school does something smarter тАФ badges, issued fresh every hour ЁЯккЁЯдЦ:

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯдФ Why

Count the passwords in a well-built AWS setup: root (locked away), your SSO loginтАж and that's it. No server credentials, no CI secrets, no config-file keys. Every machine identity is a hat + a fresh badge. This single pattern retires the most common breach class in cloud history.

ЁЯзк Try it (free тАФ paper lab + one real check)

# 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!)

тЬЕ Verify тАФ what you should see

from the instance, curl on the metadata endpoint (IMDSv2 token first) returns temporary credentials with an expiry; aws sts get-caller-identity shows the instance role.

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

terraform destroy the lab instance; delete any access keys you created 'to compare'

тЪая╕П Common mistakes

тПня╕П Next

Part 1 closes with the poster on the ID-office wall: the hygiene checklist that prevents the most common AWS security mistakes.

git checkout lesson-06-iam-hygiene
тЖР PreviousrolesNext тЖТiam hygiene

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