ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯУЭ рдзрдбрд╛ 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 ┬╖ рдкреБрдвреЗ: lesson-04-roles


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

рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: рдкрд░рд╡рд╛рдирдЧреНрдпрд╛рдВрдЪреА рднрд╛рд╖рд╛ тАФ policy JSON тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ request рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгрд╛рд░реЗ evaluation рдирд┐рдпрдо. рдЦрд░реА file:

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

рд╢рд╛рд│реЗрддреАрд▓ рдкрд░рд╡рд╛рдирдЧреА рдЪрд┐рдареНрдареА ЁЯУЭ рдиреЗрдордХреНрдпрд╛ рдЪрд╛рд░ рдЧреЛрд╖реНрдЯреА рд╕рд╛рдВрдЧрддреЗ:

  1. рд╣реЛ рдХреА рдирд╛рд╣реА? тАФ "рдРрд╢реНрд╡рд░реНрдпрд╛ рдХрд░реВ рд╢рдХрддреЗтАж" ("Effect": "Allow" тАФ рдХрд┐рдВрд╡рд╛ "Deny").
  2. рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ? тАФ "тАжрдкреБрд╕реНрддрдХреЗ рдЙрд╕рдиреА рдШреЗрдгреЗтАж" ("Action": "ecr:PutImage" тАФ рдиреЗрд╣рдореА service:Verb).
  3. рдХреЛрдгрддреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╕реЛрдмрдд? тАФ "тАжрдлрдХреНрдд JUNIOR рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рддреВрди" ("Resource": "arn:aws:ecr:тАж:repository/hello-school" тАФ рддреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдЪрд╛ рдкреВрд░реНрдг рдкрддреНрддрд╛, рддрд┐рдЪрд╛ ARN).
  4. рдХреЛрдгрддреНрдпрд╛ рдЕрдЯреАрдВрд╡рд░? тАФ "тАжрд╢рд╛рд│реЗрдЪреНрдпрд╛ рджрд┐рд╡рд╢реА" ("Condition" тАФ рдРрдЪреНрдЫрд┐рдХ: рдпрд╛ IP рд╡рд░реВрди, MFA рд╕рд╣, рдпрд╛ рддрд╛рд░рдЦреЗрдкреВрд░реНрд╡реАтАж).

рдЖрдгрд┐ рдХреЛрдгреА рджрд╛рд░ рдЙрдШрдбрд╛рдпрдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЗ рддреЗрд╡реНрд╣рд╛ рд╢рд╛рд│реЗрдЪреЗ рддреАрди рдкрдХреНрдХреЗ рдирд┐рдпрдо:

Least privilege (рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреЗ рдмреНрд░реАрджрд╡рд╛рдХреНрдп): рдЪрд┐рдареНрдареНрдпрд╛ рдиреЗрдордХреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рдиреЗрдордХреНрдпрд╛ рдХреНрд░рд┐рдпрд╛рдкрджрд╛рдВрд╕рд╛рдареА рд▓рд┐рд╣рд╛, "рд╕рдЧрд│реАрдХрдбреЗ рд╕рдЧрд│реЗ рдХрд░реВ рд╢рдХрддреЗ" рдЕрд╢рд╛ рдирд╡реНрд╣реЗ ("Action": "*", "Resource": "*" тАФ рддреЗ рдореНрд╣рдгрдЬреЗ AdministratorAccess, рдЬрд╛рд╕реНрддреАрдЪреНрдпрд╛ рдкрд╛рдпрд▒реНрдпрд╛ рдЕрд╕рд▓реЗрд▓реА photocopy рдХреЗрд▓реЗрд▓реА рдорд╛рд╕реНрдЯрд░-рдЪрд╛рд╡реА).

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

flowchart LR
    req["ЁЯЪк request:<br/>ecr:PutImage on hello-school"]
    d1{"any DENY<br/>slip?"}
    d2{"any ALLOW<br/>slip?"}
    no1["тЭМ denied - Deny always wins"]
    no2["тЭМ denied - silence means no"]
    yes["тЬЕ allowed"]
    req -->|"1"| d1
    d1 -->|"yes"| no1
    d1 -->|"no"| d2
    d2 -->|"yes 2"| yes
    d2 -->|"no 3"| no2

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

ЁЯдФ рдХрд╛

рддреБрдореНрд╣реА рдХрдзреАрд╣реА debug рдХрд░рд╛рд▓ рддреЛ рдкреНрд░рддреНрдпреЗрдХ AccessDenied, рдкреНрд░рддреНрдпреЗрдХ security review, рдкреНрд░рддреНрдпреЗрдХ "CI рдЦрд░реЛрдЦрд░ рдлрдХреНрдд ECR рд▓рд╛ push рдХрд░реВ рд╢рдХрддреЗ рдХрд╛?" тАФ рд╣реЗ рд╕рдЧрд│реЗ рдпрд╛ рдЪрд╛рд░ fields рд╕рд╣рдЬ рд╡рд╛рдЪрддрд╛ рдпреЗрдгреНрдпрд╛рд╡рд░ рдпреЗрдКрди рдареЗрдкрддреЗ. рд╣реЗ рд╡реНрдпрд╛рдХрд░рдг рдЖрд╣реЗ; рдзрдбреЗ 04тАУ05 рдлрдХреНрдд рдЪрд┐рдареНрдареНрдпрд╛ рдХреЛрдг рдмрд╛рд│рдЧрддреЛ рдпрд╛рдмрджреНрджрд▓ рдЖрд╣реЗрдд.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (рдореЛрдлрдд)

# read AWS's own slips тАФ how the pros phrase things:
aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess \
  --version-id v1 --query 'PolicyVersion.Document.Statement[0]'

# TEST a slip without doing anything real тАФ the policy simulator:
aws iam simulate-custom-policy \
  --policy-input-list "$(cat iam/ecr-push-policy.json)" \
  --action-names ecr:PutImage ecr:DeleteRepository \
  --resource-arns arn:aws:ecr:ap-south-1:123456789012:repository/hello-school \
  --query 'EvaluationResults[].{action:EvalActionName,result:EvalDecision}'
# тЖТ PutImage: allowed ┬╖ DeleteRepository: implicitDeny (no slip = no!) ЁЯОЙ

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

policy simulator (aws iam simulate-principal-policy) рддреБрдореНрд╣реА рджрд┐рд▓реЗрд▓реНрдпрд╛ рдПрдХрд╛ action рд╕рд╛рдареА allowed рдЖрдгрд┐ рд╢реЗрдЬрд╛рд░рдЪреНрдпрд╛ action рд╕рд╛рдареА implicitDeny рдкрд░рдд рджреЗрддреЛ тАФ рд╢рд╛рдВрддрддрд╛ рдореНрд╣рдгрдЬреЗ рдирд╛рд╣реА.

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

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

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

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

рд▓реЛрдХрд╛рдВрдирд╛ рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдЪрд┐рдареНрдареНрдпрд╛ рд╣реА рдЕрд░реНрдзреА рдЧреЛрд╖реНрдЯ. рдЙрд░рд▓реЗрд▓реА рдЕрд░реНрдзреА рдЯреЛрдкреНрдпрд╛ рдШрд╛рд▓рддреЗ: roles тАФ рдЬреНрдпрд╛ рдУрд│рдЦреА рдордВрдЬреВрд░ рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгреАрд╣реА (рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реАрд╣реА) рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рд╕рд╛рдареА рдзрд╛рд░рдг рдХрд░реВ рд╢рдХрддреЗ.

git checkout lesson-04-roles

ЁЯУЭ Lesson 03 тАФ Policies: reading a permission slip

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


ЁЯУж What's in this branch

Lessons 01тАУ02, plus: the language of permissions тАФ policy JSON тАФ and the evaluation rules that decide every request. Real file:

ЁЯзТ Explain like I'm 5

A permission slip ЁЯУЭ at school says exactly four things:

  1. Yes or no? тАФ "Aishwarya MAYтАж" ("Effect": "Allow" тАФ or "Deny").
  2. Do what? тАФ "тАжborrow booksтАж" ("Action": "ecr:PutImage" тАФ always service:Verb).
  3. With which things? тАФ "тАжfrom the JUNIOR library only" ("Resource": "arn:aws:ecr:тАж:repository/hello-school" тАФ the thing's full address, its ARN).
  4. Under what conditions? тАФ "тАжon school days" ("Condition" тАФ optional: from this IP, with MFA, before this dateтАж).

And the school's three iron rules when someone tries a door:

Least privilege (the office motto): write slips for exact verbs on exact things, not "may do everything everywhere" ("Action": "*", "Resource": "*" тАФ that's AdministratorAccess, the photocopied master key with extra steps).

ЁЯЧ║я╕П Diagram

flowchart LR
    req["ЁЯЪк request:<br/>ecr:PutImage on hello-school"]
    d1{"any DENY<br/>slip?"}
    d2{"any ALLOW<br/>slip?"}
    no1["тЭМ denied - Deny always wins"]
    no2["тЭМ denied - silence means no"]
    yes["тЬЕ allowed"]
    req -->|"1"| d1
    d1 -->|"yes"| no1
    d1 -->|"no"| d2
    d2 -->|"yes 2"| yes
    d2 -->|"no 3"| no2

тЭУ What

ЁЯдФ Why

Every AccessDenied you will ever debug, every security review, every "can CI really only push to ECR?" тАФ it all comes down to reading these four fields fluently. This is the grammar; lessons 04тАУ05 are just about who carries the slips.

ЁЯзк Try it (free)

# read AWS's own slips тАФ how the pros phrase things:
aws iam get-policy-version --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess \
  --version-id v1 --query 'PolicyVersion.Document.Statement[0]'

# TEST a slip without doing anything real тАФ the policy simulator:
aws iam simulate-custom-policy \
  --policy-input-list "$(cat iam/ecr-push-policy.json)" \
  --action-names ecr:PutImage ecr:DeleteRepository \
  --resource-arns arn:aws:ecr:ap-south-1:123456789012:repository/hello-school \
  --query 'EvaluationResults[].{action:EvalActionName,result:EvalDecision}'
# тЖТ PutImage: allowed ┬╖ DeleteRepository: implicitDeny (no slip = no!) ЁЯОЙ

тЬЕ Verify тАФ what you should see

the policy simulator (aws iam simulate-principal-policy) returns allowed for the one action you granted and implicitDeny for a neighbour тАФ silence is a NO.

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

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

тЪая╕П Common mistakes

тПня╕П Next

Slips attached to people is half the story. The other half wears hats: roles тАФ identities anyone (or anything) approved can temporarily become.

git checkout lesson-04-roles
тЖР Previoususers groupsNext тЖТroles

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.