ЁЯУЭ рдзрдбрд╛ 03 тАФ Policies: рдкрд░рд╡рд╛рдирдЧреА рдЪрд┐рдареНрдареА рд╡рд╛рдЪрдгреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 03 ┬╖ рдорд╛рдЧреЗ: lesson-02-users-groups ┬╖ рдкреБрдвреЗ: lesson-04-roles
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ02, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд: рдкрд░рд╡рд╛рдирдЧреНрдпрд╛рдВрдЪреА рднрд╛рд╖рд╛ тАФ policy JSON тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ request рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгрд╛рд░реЗ evaluation рдирд┐рдпрдо. рдЦрд░реА file:
- iam/ecr-push-policy.json тАФ рдЯрд┐рдкрд╛ рд▓рд┐рд╣рд┐рд▓реЗрд▓реА, рдЦрд░реА least-privilege рдЪрд┐рдареНрдареА
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрддреАрд▓ рдкрд░рд╡рд╛рдирдЧреА рдЪрд┐рдареНрдареА ЁЯУЭ рдиреЗрдордХреНрдпрд╛ рдЪрд╛рд░ рдЧреЛрд╖реНрдЯреА рд╕рд╛рдВрдЧрддреЗ:
- рд╣реЛ рдХреА рдирд╛рд╣реА? тАФ "рдРрд╢реНрд╡рд░реНрдпрд╛ рдХрд░реВ рд╢рдХрддреЗтАж" (
"Effect": "Allow"тАФ рдХрд┐рдВрд╡рд╛"Deny"). - рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ? тАФ "тАжрдкреБрд╕реНрддрдХреЗ рдЙрд╕рдиреА рдШреЗрдгреЗтАж" (
"Action": "ecr:PutImage"тАФ рдиреЗрд╣рдореАservice:Verb). - рдХреЛрдгрддреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдВрд╕реЛрдмрдд? тАФ "тАжрдлрдХреНрдд JUNIOR рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рддреВрди"
(
"Resource": "arn:aws:ecr:тАж:repository/hello-school"тАФ рддреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдЪрд╛ рдкреВрд░реНрдг рдкрддреНрддрд╛, рддрд┐рдЪрд╛ ARN). - рдХреЛрдгрддреНрдпрд╛ рдЕрдЯреАрдВрд╡рд░? тАФ "тАжрд╢рд╛рд│реЗрдЪреНрдпрд╛ рджрд┐рд╡рд╢реА" (
"Condition"тАФ рдРрдЪреНрдЫрд┐рдХ: рдпрд╛ IP рд╡рд░реВрди, MFA рд╕рд╣, рдпрд╛ рддрд╛рд░рдЦреЗрдкреВрд░реНрд╡реАтАж).
рдЖрдгрд┐ рдХреЛрдгреА рджрд╛рд░ рдЙрдШрдбрд╛рдпрдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддреЗ рддреЗрд╡реНрд╣рд╛ рд╢рд╛рд│реЗрдЪреЗ рддреАрди рдкрдХреНрдХреЗ рдирд┐рдпрдо:
- рдЪрд┐рдареНрдареА рдирд╛рд╣реА? рддрд░ рдирд╛рд╣реА. рдореБрд│рд╛рдд рд╕рдЧрд│реЗ рдирд╛рдХрд╛рд░рд▓реЗрд▓реЗ рдЕрд╕рддреЗ. рд╢рд╛рдВрддрддрд╛ = рдирд╛рд╣реА.
- Allow рдЪрд┐рдареНрдареА рджрд╛рд░ рдЙрдШрдбрддреЗ тАФ рдПрдХ рдкреБрд░реЗрд╢реА.
- Deny рдЪрд┐рдареНрдареА рджрд╛рд░ рдзрд╛рдбрдХрди рдмрдВрдж рдХрд░рддреЗ тАФ рд╕реНрдкрд╖реНрдЯ Deny рдХрд┐рддреАрд╣реА Allows рдирд╛ рд╣рд░рд╡рддреЛ. (рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рд╢рд╛рд│рд╛ рдореНрд╣рдгрддреЗ "interns рддрд┐рдЬреЛрд░реА рд╕реЛрдбреВрди рд╕рдЧрд│реЗ рдХрд░реВ рд╢рдХрддрд╛рдд".)
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
тЭУ рдХрд╛рдп
- ARN = Amazon Resource Name, рдХреЛрдгрддреНрдпрд╛рд╣реА рдЧреЛрд╖реНрдЯреАрдЪрд╛ рдкреВрд░реНрдг рдкрддреНрддрд╛:
arn:aws:ecr:ap-south-1:123456789012:repository/hello-school(partition:service:region:account:thing). - Managed policies (AWS рдиреЗ рдмрдирд╡рд▓реЗрд▓реНрдпрд╛ рдХрд┐рдВрд╡рд╛ рддреБрдордЪреНрдпрд╛, рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛, versioned) рд╡рд┐рд░реБрджреНрдз inline (рдПрдХрд╛рдЪ рдУрд│рдЦреАрд▓рд╛ рдЪрд┐рдХрдЯрд╡рд▓реЗрд▓реНрдпрд╛ тАФ рдЦрд▒реНрдпрд╛ рдПрдХрджрд╛рдЪреНрдпрд╛ рдЧрд░рдЬрд╛рдВрд╕рд╛рдареА).
- Wildcards:
ecr:Get*(рд╕рдЧрд│реА Get рдХреНрд░рд┐рдпрд╛рдкрджреЗ),Resource: "*"(рд╕рдЧрд│реЗ рдХрд╛рд╣реА) тАФ рдкреНрд░рддреНрдпреЗрдХ*рдореНрд╣рдгрдЬреЗ рд╕реЛрдпреАрд╕рд╛рдареА рд╕реБрд░рдХреНрд╖реЗрдЪрд╛ рд╕реМрджрд╛. рддреЗ рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ рдЦрд░реНрдЪ рдХрд░рд╛. - iam/ecr-push-policy.json рдЦрд░рд╛ рдЖрдХрд╛рд░ рджрд╛рдЦрд╡рддреЗ:
GetAuthorizationTokenрд▓рд╛*рд▓рд╛рдЧрддреЛ (рддреЛ рд╕реНрд╡рднрд╛рд╡рддрдГрдЪ account-wide рдЖрд╣реЗ), рдкрдг push рдЪреА рдХреНрд░рд┐рдпрд╛рдкрджреЗ рдПрдХрд╛рдЪ repository рд▓рд╛ рдмрд╛рдВрдзрд▓реЗрд▓реА рдЖрд╣реЗрдд.
ЁЯдФ рдХрд╛
рддреБрдореНрд╣реА рдХрдзреАрд╣реА 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 рдкрд░рдд рджреЗрддреЛ тАФ рд╢рд╛рдВрддрддрд╛ рдореНрд╣рдгрдЬреЗ рдирд╛рд╣реА.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдХрд╛рд╣реАрд╣реА рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛
рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдХрд╛рд╣реА рдирд╛рд╣реА тАФ рд╣рд╛ рдзрдбрд╛ рдореЛрдлрдд рдЖрд╣реЗ ЁЯОЙ
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- ARN рд╢реЛрдзрдгреЗ рддреНрд░рд╛рд╕рджрд╛рдпрдХ рд╣реЛрддреЗ рдореНрд╣рдгреВрди
"Resource": "*" - рд╕реНрдкрд╖реНрдЯ Deny рдкреНрд░рддреНрдпреЗрдХ Allow рд▓рд╛ рд╣рд░рд╡рддреЛ рд╣реЗ рд╡рд┐рд╕рд░рдгреЗ тАФ рджрд╛рд░ рдзрд╛рдбрдХрди рдмрдВрджрдЪ рд░рд╛рд╣рддреЗ
- AccessDenied debug рдХрд░рддрд╛рдирд╛ 'рддрд╛рддреНрдкреБрд░рддреЗ' Admin* рдЬреЛрдбрдгреЗ
тПня╕П рдкреБрдвреЗ
рд▓реЛрдХрд╛рдВрдирд╛ рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдЪрд┐рдареНрдареНрдпрд╛ рд╣реА рдЕрд░реНрдзреА рдЧреЛрд╖реНрдЯ. рдЙрд░рд▓реЗрд▓реА рдЕрд░реНрдзреА рдЯреЛрдкреНрдпрд╛ рдШрд╛рд▓рддреЗ: roles тАФ рдЬреНрдпрд╛ рдУрд│рдЦреА рдордВрдЬреВрд░ рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгреАрд╣реА (рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реАрд╣реА) рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рд╕рд╛рдареА рдзрд╛рд░рдг рдХрд░реВ рд╢рдХрддреЗ.
git checkout lesson-04-roles