ЁЯПл The SchoolтА║ЁЯкк IAMтА║ЁЯУЭ рдзрдбрд╛ 03 тАФ Policies: рд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯУЭ рдзрдбрд╛ 03 тАФ Policies: рд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-users-groups-root ┬╖ рдкреБрдвреЗ: lesson-04-how-aws-decides


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

рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд policy document рд╡рд╛рдЪрдгреЗ рдЖрдгрд┐ рд▓рд┐рд╣рд┐рдгреЗ: Effect, Action, Resource, Condition, wildcards, рдЖрдгрд┐ рдПрдХрд╛рдЪ policy рдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рдХреНрд╖рдХрд╛рд▓рд╛ рдЦрд╛рдЬрдЧреА folder рджреЗрдгрд╛рд░рд╛ policy variable ${aws:username}. рдкрд╛рд╣рд╛ iam/policies/own-homework-folder.json.

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

рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рддрд▓рд╛ рдирд┐рдпрдо рдореНрд╣рдгрдЬреЗ рдЪрд╛рд░ рдУрд│реАрдВрдЪреЗ рдПрдХ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдб:

рдпрд╛рддрд▓реА рд╣реБрд╢рд╛рд░ рдпреБрдХреНрддреА рдореНрд╣рдгрдЬреЗ рдЖрдкреЛрдЖрдк рднрд░рдгрд╛рд░реА рдПрдХ рд░рд┐рдХрд╛рдореА рдЬрд╛рдЧрд╛: "рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреЗ homework рдЪреЗ рдХрдкрд╛рдЯ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛". рдПрдХрдЪ рдХрд╛рд░реНрдб рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рдХреНрд╖рд┐рдХреЗрд╕рд╛рдареА рдЪрд╛рд▓рддреЗ тАФ рдРрд╢реНрд╡рд░реНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рддреАрдд "aishwarya" рдЕрд╕рддреЗ, рдХрддрд░рд┐рдирд╛рдЪреНрдпрд╛ рдкреНрд░рддреАрдд "katrina" тАФ рдЖрдгрд┐ рдХреЛрдгреАрд╣реА рджреБрд╕рд▒реНрдпрд╛рдЪреЗ рдХрдкрд╛рдЯ рд╡рд╛рдкрд░реВ рд╢рдХрдд рдирд╛рд╣реА.

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

flowchart LR
    st["ЁЯУЭ Statement OwnFolderOnly<br/>Effect: Allow<br/>Action: s3:GetObject, s3:PutObject<br/>Resource: school-homework/USERNAME/*"]
    a["ЁЯкк aishwarya тЖТ school-homework/aishwarya/essay.txt"]
    b["ЁЯкк aishwarya тЖТ school-homework/katrina/essay.txt"]
    st -->|"1 variable = aishwarya ┬╖ match"| a --> ok["тЬЕ ALLOW"]
    st -->|"2 no match"| b --> no["ЁЯЪл IMPLICIT DENY"]

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l03

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

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг policy рдореНрд╣рдгрдЬреЗ рддреБрдордЪреНрдпрд╛ data рд▓рд╛ рдХреЛрдг рд╣рд╛рдд рд▓рд╛рд╡реВ рд╢рдХрддреЛ рд╣реЗ рдард░рд╡рдгрд╛рд░рд╛ code рдЖрд╣реЗ, рдЖрдгрд┐ рд╢рдмреНрджрд░рдЪрдиреЗрддрд▓реЗ рдЫреЛрдЯреЗ рдмрджрд▓ (* рдЪреБрдХреАрдЪреНрдпрд╛ рдЬрд╛рдЧреА, /* рд╢рд┐рд╡рд╛рдпрдЪрд╛ bucket ARN) рдЙрддреНрддрд░ рдмрджрд▓рддрд╛рдд. рдПрдХ statement рдиреЗрдордХреЗрдкрдгрд╛рдиреЗ рд╡рд╛рдЪрдгреЗ рд╣реЗрдЪ IAM рдЪреЗ рдореВрд│ рдХреМрд╢рд▓реНрдп рдЖрд╣реЗ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

iam/demo.py рдордзрд▓рд╛ policies() own-homework-folder.json рдордзрд▓реЗ рдПрдХ statement print рдХрд░рддреЛ рдЖрдгрд┐ рджреЛрди writes рдорд╛рдЧрддреЛ: aishwarya рдиреЗ рддрд┐рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ folder рдордзреНрдпреЗ, рдЖрдгрд┐ aishwarya рдиреЗ katrina рдЪреНрдпрд╛ folder рдордзреНрдпреЗ. iam/evaluate.py рдордзрд▓рд╛ _subst() ${aws:username} рднрд░рддреЛ; _glob() рд╣рд╛ * рдЖрдгрд┐ ? рд╣рд╛рддрд╛рд│рддреЛ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 iam/demo.py policies
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide, load
doc = {"Version": "2012-10-17", "Statement": [{"Sid": "ReadAnything", "Effect": "Allow", "Action": "s3:Get*", "Resource": "arn:aws:s3:::school-reports/*"}]}
katrina = "arn:aws:iam::111122223333:user/katrina"
for action in ("s3:GetObject", "S3:getobjecttagging", "s3:PutObject"):
    print(action.ljust(20), decide(katrina, action, "arn:aws:s3:::school-reports/term1.pdf", identity=[("mine", doc)])[0])
print("katrina's own folder", decide(katrina, "s3:PutObject", "arn:aws:s3:::school-homework/katrina/essay.txt", identity=[("own", load("own-homework-folder"))])[0])
EOF

рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд) тАФ policy рд╡рд╛рдкрд░рдгреНрдпрд╛рдЖрдзреА рддрд┐рдЪреЗ lint рдХрд░рд╛, рдордЧ рддреА customer managed policy рдореНрд╣рдгреВрди рд╕рд╛рдард╡рд╛:

aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://iam/policies/own-homework-folder.json
aws iam create-policy --policy-name own-homework-folder --policy-document file://iam/policies/own-homework-folder.json

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

policies statement JSON рдореНрд╣рдгреВрди print рдХрд░рддреЛ, рдордЧ aishwarya рдЪреНрдпрд╛ folder рд╕рд╛рдареА тЬЕ тАж ALLOW тАФ identity policy own-homework-folder#OwnFolderOnly allows it рдЖрдгрд┐ katrina рдЪреНрдпрд╛ folder рд╕рд╛рдареА ЁЯЪл тАж IMPLICIT DENY. рддреБрдордЪрд╛ snippet s3:GetObject рд╕рд╛рдареА ALLOW, S3:getobjecttagging рд╕рд╛рдареА ALLOW (actions case рдкрд╛рд╣рдд рдирд╛рд╣реАрдд; s3:Get* рддреНрдпрд╛рд▓рд╛ рд▓рд╛рдЧреВ рд╣реЛрддреЗ), s3:PutObject рд╕рд╛рдареА IMPLICIT DENY, рдЖрдгрд┐ katrina рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ folder рд╕рд╛рдареА ALLOW print рдХрд░рддреЛ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

Statement рдореНрд╣рдгрдЬреЗ рдЪрд╛рд░ рдиреЗрдордХреА fields; wildcards рдЖрдгрд┐ variables рдореБрд│реЗ рдПрдХрдЪ рдЫреЛрдЯреА policy рдЕрдиреЗрдХ рд▓реЛрдХрд╛рдВрдирд╛ рдЪрд╛рд▓рддреЗ, рдЖрдгрд┐ рддрд░реАрд╣реА рддреНрдпрд╛рдВрдкреИрдХреА рдХреЛрдгреАрд╣реА рд╕реНрд╡рддрдГрдЪреНрдпрд╛ resources рдкрд▓реАрдХрдбреЗ рдкреЛрд╣реЛрдЪреВ рд╢рдХрдд рдирд╛рд╣реА.

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

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: teams policies git рдордзреНрдпреЗ files рдореНрд╣рдгреВрди рдареЗрд╡рддрд╛рдд, CI рдордзреНрдпреЗ validate-policy рдиреЗ рддреНрдпрд╛рдВрдЪреЗ lint рдХрд░рддрд╛рдд, рдЖрдгрд┐ code рд╕рд╛рд░рдЦреЗрдЪ рддреНрдпрд╛рдВрдЪреЗ review рдХрд░рддрд╛рдд. Policy рдордзрд▓рд╛ рдмрджрд▓ рдореНрд╣рдгрдЬреЗ рддреА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреАрддрд▓рд╛ рдмрджрд▓.

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

рдПрдХ рдирд┐рдпрдо рд╣реЛ рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдирд╛рд╣реА рдореНрд╣рдгрд╛рд▓рд╛ рддрд░? AWS рдХрд╕рд╛ рдирд┐рд░реНрдгрдп рдШреЗрддреЛ тАФ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛рд░реНрдбреЗ рдХреЛрдгрддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд╡рд╛рдЪрддреЗ.

git checkout lesson-04-how-aws-decides

ЁЯУЭ Lesson 03 тАФ Policies: the written rules

ЁЯУН You are here: Lesson 03 of 12 ┬╖ Previous: lesson-02-users-groups-root ┬╖ Next: lesson-04-how-aws-decides


ЁЯУж What's in this branch

Lessons 01тАУ02, plus reading and writing a policy document: Effect, Action, Resource, Condition, wildcards, and the policy variable ${aws:username} that gives every teacher a private folder with one policy. See iam/policies/own-homework-folder.json.

ЁЯзТ Explain like I'm 5

A rule in the ID office is a small card with four lines:

The clever trick is a blank that fills itself in: "you may use the homework shelf with your own name on it". One card works for every teacher тАФ Aishwarya's copy reads "aishwarya", Katrina's reads "katrina" тАФ and nobody can use somebody else's shelf.

ЁЯЧ║я╕П Diagram

flowchart LR
    st["ЁЯУЭ Statement OwnFolderOnly<br/>Effect: Allow<br/>Action: s3:GetObject, s3:PutObject<br/>Resource: school-homework/USERNAME/*"]
    a["ЁЯкк aishwarya тЖТ school-homework/aishwarya/essay.txt"]
    b["ЁЯкк aishwarya тЖТ school-homework/katrina/essay.txt"]
    st -->|"1 variable = aishwarya ┬╖ match"| a --> ok["тЬЕ ALLOW"]
    st -->|"2 no match"| b --> no["ЁЯЪл IMPLICIT DENY"]

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l03

тЭУ What

ЁЯдФ Why

Because a policy is code that decides who can touch your data, and small wording changes (* in the wrong place, the bucket ARN without /*) change the answer. Reading one statement precisely is the core IAM skill.

ЁЯФз How (in this repo)

policies() in iam/demo.py prints the one statement in own-homework-folder.json and asks for two writes: aishwarya to her own folder and aishwarya to katrina's. _subst() in iam/evaluate.py fills in ${aws:username}; _glob() handles * and ?.

ЁЯзк Try it

python3 iam/demo.py policies
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide, load
doc = {"Version": "2012-10-17", "Statement": [{"Sid": "ReadAnything", "Effect": "Allow", "Action": "s3:Get*", "Resource": "arn:aws:s3:::school-reports/*"}]}
katrina = "arn:aws:iam::111122223333:user/katrina"
for action in ("s3:GetObject", "S3:getobjecttagging", "s3:PutObject"):
    print(action.ljust(20), decide(katrina, action, "arn:aws:s3:::school-reports/term1.pdf", identity=[("mine", doc)])[0])
print("katrina's own folder", decide(katrina, "s3:PutObject", "arn:aws:s3:::school-homework/katrina/essay.txt", identity=[("own", load("own-homework-folder"))])[0])
EOF

On a real account (needs the AWS CLI and credentials) тАФ lint a policy before you use it, then store it as a customer managed policy:

aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://iam/policies/own-homework-folder.json
aws iam create-policy --policy-name own-homework-folder --policy-document file://iam/policies/own-homework-folder.json

тЬЕ Verify тАФ what you should see

policies prints the statement as JSON, then тЬЕ тАж ALLOW тАФ identity policy own-homework-folder#OwnFolderOnly allows it for aishwarya's folder and ЁЯЪл тАж IMPLICIT DENY for katrina's. Your snippet prints ALLOW for s3:GetObject, ALLOW for S3:getobjecttagging (actions ignore case; s3:Get* covers it), IMPLICIT DENY for s3:PutObject, and ALLOW for katrina's own folder.

ЁЯПБ What you just proved

A statement is four precise fields; wildcards and variables let one small policy serve many people without letting any of them reach past their own resources.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: teams keep policies as files in git, lint them with validate-policy in CI, and review them like code. A policy change is a permission change for everyone attached to it.

тПня╕П Next

What if one rule says yes and another says no? How AWS decides тАФ the order the office reads the cards.

git checkout lesson-04-how-aws-decides
тЖР Previoususers groups rootNext тЖТhow aws decides

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