ЁЯУЭ рдзрдбрд╛ 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 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рддрд▓рд╛ рдирд┐рдпрдо рдореНрд╣рдгрдЬреЗ рдЪрд╛рд░ рдУрд│реАрдВрдЪреЗ рдПрдХ рдЫреЛрдЯреЗ рдХрд╛рд░реНрдб:
- Effect тАФ рд╣реЛ рдХреА рдирд╛рд╣реА (
Allow/Deny) - Action тАФ рддреБрдореНрд╣реА рдХрд╛рдп рдХрд░реВ рд╢рдХрддрд╛ ("рдШреЗрдгреЗ", "рдЖрдд рдареЗрд╡рдгреЗ")
- Resource тАФ рдХреЛрдгрддреНрдпрд╛ рд╡рд╕реНрддреВрд╡рд░ ("homework рдЪреЗ рдХрдкрд╛рдЯ")
- Condition тАФ рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪтАж ("рдлрдХреНрдд рджреБрд╕рд▒реНрдпрд╛ рддрдкрд╛рд╕рдгреАрд╕рд╣", рдзрдбрд╛ 07)
рдпрд╛рддрд▓реА рд╣реБрд╢рд╛рд░ рдпреБрдХреНрддреА рдореНрд╣рдгрдЬреЗ рдЖрдкреЛрдЖрдк рднрд░рдгрд╛рд░реА рдПрдХ рд░рд┐рдХрд╛рдореА рдЬрд╛рдЧрд╛: "рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреЗ 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
тЭУ рдХрд╛рдп
- рд░рдЪрдирд╛ тАФ
{"Version": "2012-10-17", "Statement": [ тАж ]}. рдиреЗрд╣рдореА version2012-10-17рд╡рд╛рдкрд░рд╛; рдЬреБрдиреЗ version policy variables рдирд╛ support рдХрд░рдд рдирд╛рд╣реА. - Statement fields тАФ
Sid(рдПрдХ рд▓реЗрдмрд▓),Effect,ActionрдХрд┐рдВрд╡рд╛NotAction,ResourceрдХрд┐рдВрд╡рд╛NotResource, рдРрдЪреНрдЫрд┐рдХCondition. Resource policies (рдзрдбрд╛ 09) рдЖрдгрд┐ trust policies (рдзрдбрд╛ 05) рдордзреНрдпреЗPrincipalрд╣реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддреЗ. - Wildcards тАФ
*рдореНрд╣рдгрдЬреЗ рдХрд┐рддреАрд╣реА рдЕрдХреНрд╖рд░реЗ,?рдореНрд╣рдгрдЬреЗ рдПрдХ рдЕрдХреНрд╖рд░:s3:Get*,arn:aws:s3:::school-reports/*. Action рдЪреА рдирд╛рд╡реЗ case-insensitive рдЕрд╕рддрд╛рдд; resource ARNs case-sensitive рдЕрд╕рддрд╛рдд. - Policy variables тАФ
${aws:username},${aws:PrincipalTag/team}, тАж рд╣реЗ evaluation рдЪреНрдпрд╛ рд╡реЗрд│реА request рдордзреВрди рднрд░рд▓реЗ рдЬрд╛рддрд╛рдд. - Identity policy рдЪреЗ рдкреНрд░рдХрд╛рд░ тАФ AWS managed (AWS рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛, рдЙрджрд╛.
ReadOnlyAccess), customer managed (рддреБрдордЪреНрдпрд╛, рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рддрд╛ рдпреЗрдгрд╛рд▒реНрдпрд╛, versions рдЕрд╕рд▓реЗрд▓реНрдпрд╛) рдЖрдгрд┐ inline (рдПрдХрд╛рдЪ user/group/role рдордзреНрдпреЗ рдмрд╕рд╡рд▓реЗрд▓реНрдпрд╛). Customer managed рд▓рд╛ рдкреНрд░рд╛рдзрд╛рдиреНрдп рджреНрдпрд╛. - S3 рдордзрд▓рд╛ рдмрд╛рд░рдХрд╛рд╡рд╛ тАФ bucket actions (
s3:ListBucket) рдирд╛ bucket ARNarn:aws:s3:::school-reportsрд▓рд╛рдЧрддреЛ; object actions рдирд╛arn:aws:s3:::school-reports/*рд▓рд╛рдЧрддреЛ. рдореНрд╣рдгреВрдирдЪ read-reports.json рдордзреНрдпреЗ рджреЛрдиреНрд╣реА рдЖрд╣реЗрдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг 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 рдкрд▓реАрдХрдбреЗ рдкреЛрд╣реЛрдЪреВ рд╢рдХрдд рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рддреЗ рд▓рд╡рдХрд░ рдЭрд╛рд▓реЗ" рдореНрд╣рдгреВрди
"Action": "*", "Resource": "*" s3:ListBucketрд╕рд╛рдареА bucket ARN рд╡рд┐рд╕рд░рдгреЗ (рдХрд┐рдВрд╡рд╛ object actions рд╕рд╛рдареА/*рд╡рд┐рд╕рд░рдгреЗ)s3:Get*рдЪрд╛ рдЕрд░реНрде рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рдЯрддреЛ рддреНрдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕рдгреЗ тАФ рддреЛs3:GetBucketPolicy,s3:GetObjectAcl, тАж рдпрд╛рдВрдирд╛рд╣реА рдЬреБрд│рддреЛ- рдЬреБрдиреЗ
"Version": "2008-10-17"(рдХрд┐рдВрд╡рд╛ version рдирд╕рдгреЗрдЪ) тАФ рдордЧ${aws:username}рд╣рд╛ рд╕рд╛рдзрд╛ рдордЬрдХреВрд░ рдард░рддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: teams policies git рдордзреНрдпреЗ files рдореНрд╣рдгреВрди рдареЗрд╡рддрд╛рдд, CI рдордзреНрдпреЗ
validate-policyрдиреЗ рддреНрдпрд╛рдВрдЪреЗ lint рдХрд░рддрд╛рдд, рдЖрдгрд┐ code рд╕рд╛рд░рдЦреЗрдЪ рддреНрдпрд╛рдВрдЪреЗ review рдХрд░рддрд╛рдд. Policy рдордзрд▓рд╛ рдмрджрд▓ рдореНрд╣рдгрдЬреЗ рддреА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреАрддрд▓рд╛ рдмрджрд▓.
тПня╕П рдкреБрдвреЗ
рдПрдХ рдирд┐рдпрдо рд╣реЛ рдЖрдгрд┐ рджреБрд╕рд░рд╛ рдирд╛рд╣реА рдореНрд╣рдгрд╛рд▓рд╛ рддрд░? AWS рдХрд╕рд╛ рдирд┐рд░реНрдгрдп рдШреЗрддреЛ тАФ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛рд░реНрдбреЗ рдХреЛрдгрддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд╡рд╛рдЪрддреЗ.
git checkout lesson-04-how-aws-decides