ЁЯЪз рдзрдбрд╛ 08 тАФ Guardrails: рдкреНрд░рддреНрдпреЗрдХ policy рд╡рд░рдЪреЗ рдЫрдд
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдорд╛рдЧреАрд▓: lesson-07-conditions-abac ┬╖ рдкреБрдвреАрд▓: lesson-09-cross-account
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ07, рдЖрдгрд┐ рджреЛрди рдЫрддреЗ: рдПрдХрд╛ identity рд╡рд░ permission boundary (boundary-developers.json) рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдг account рд╡рд░ AWS Organizations рдЪреНрдпрд╛ service control policies (scp-full-access.json, scp-two-regions.json).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдПрдХрд╛ рдирд╡реНрдпрд╛ lab рд╕рд╣рд╛рдпреНрдпрд┐рдХреЗрд▓рд╛ "lab рдордзреНрдпреЗ рдХрд╛рд╣реАрд╣реА рдХрд░реВ рд╢рдХрддреЗ" рдЕрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдХрд╛рд░реНрдб рдорд┐рд│рддреЗ. рд╡рд┐рдЬреНрдЮрд╛рди рд╕рдордиреНрд╡рдпрд┐рдХрд╛ рддреНрдпрд╛рд╡рд░ рдПрдХ рдЫрдд ЁЯЪз рдШрд╛рд▓рддреЗ: "тАжрдкрдг рдпрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдХрдзреАрдЪ рдирд╛рд╣реА: рдЙрдкрдХрд░рдгреЗ рд╡рд╛рдкрд░рдгреЗ, рдиреЛрдВрджрд╡рд╣реНрдпрд╛ рд╡рд╛рдЪрдгреЗ". рдХрд╛рд░реНрдбрд╡рд░ рдЕрдЬреВрдирд╣реА "рдХрд╛рд╣реАрд╣реА" рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ тАФ рдкрдг рдЫрддрд╛рдЪреНрдпрд╛ рд╡рд░ рдЬреЗ рдХрд╛рд╣реА рдЖрд╣реЗ рддреЗ рд╣рд╛рддрд╛рд▓рд╛ рд▓рд╛рдЧрддрдЪ рдирд╛рд╣реА. рд╣реАрдЪ permission boundary.
рдордЧ рд╕рдВрдкреВрд░реНрдг рд╢рд╛рд│рд╛ рдПрдХрд╛ рд╢рд╛рд│рд╛ рдордВрдбрд│рд╛рдЪреА рдЕрд╕рддреЗ, рдЖрдгрд┐ рдордВрдбрд│ рдЪрд╛рд▓рд╡рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рд│реЗрд╕рд╛рдареА рддреНрдпрд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдирд┐рдпрдо рдЕрд╕рддрд╛рдд: "рдХреЛрдгрддреАрд╣реА рд╢рд╛рд│рд╛ рдпрд╛ рджреЛрди рд╢рд╣рд░рд╛рдВрдмрд╛рд╣реЗрд░ рд╢рд╛рдЦрд╛ рдЙрдШрдбрдгрд╛рд░ рдирд╛рд╣реА". рдПрдЦрд╛рджреНрдпрд╛ рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХреЗрд▓рд╛рд╣реА рддреЛ рдирд┐рдпрдо рдореЛрдбрддрд╛ рдпреЗрдд рдирд╛рд╣реА. рд╣реАрдЪ SCP.
рдЫрдд рдХрдзреАрдЪ рдХрд╛рд╣реА рджреЗрдд рдирд╛рд╣реА. рд╢рд┐рдбреА рдХрд┐рддреА рдЙрдВрдЪ рдЬрд╛рдК рд╢рдХрддреЗ рдПрд╡рдвреЗрдЪ рддреЗ рдард░рд╡рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
id["ЁЯУЭ identity policy<br/>admin: * on *"]
b["ЁЯЪз boundary<br/>s3:* ┬╖ logs:* ┬╖ cloudwatch:* ┬╖ ec2:Describe*"]
scp["ЁЯПЫя╕П SCP<br/>deny outside ap-south-1 ┬╖ us-east-1"]
eff["тЬЕ effective<br/>identity тИй boundary тИй SCP"]
id --> eff
b -->|"1 ceiling on one identity"| eff
scp -->|"2 ceiling on the account"| eff
eff -.->|"iam:CreateUser"| no["ЁЯЪл outside the boundary"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l08
тЭУ рдХрд╛рдп
- Permission boundary тАФ IAM user рдХрд┐рдВрд╡рд╛ role рд╡рд░ рд▓рд╛рд╡рд▓реЗрд▓реА managed policy
(
put-user-permissions-boundary/put-role-permissions-boundary). рдкреНрд░рддреНрдпрдХреНрд╖ access = identity policies тИй boundary. рддрд┐рдЪрд╛ рдиреЗрд╣рдореАрдЪрд╛ рдЙрдкрдпреЛрдЧ рдореНрд╣рдгрдЬреЗ рд╕реБрд░рдХреНрд╖рд┐рдд delegation: developers рдлрдХреНрдд boundary рдЬреЛрдбрд▓реА рддрд░рдЪ roles рдмрдирд╡реВ рд╢рдХрддрд╛рдд (conditioniam:PermissionsBoundary), рддреНрдпрд╛рдореБрд│реЗ рддреЗ рд╕реНрд╡рддрдГрдкреЗрдХреНрд╖рд╛ рддрд╛рдХрджрд╡рд╛рди рдХрд╛рд╣реАрд╣реА рдмрдирд╡реВ рд╢рдХрдд рдирд╛рд╣реАрдд. - SCP тАФ organization root, OU рдХрд┐рдВрд╡рд╛ account рд▓рд╛ рдЬреЛрдбрд▓реЗрд▓реА policy. рддреА member accounts рдордзреАрд▓
рдкреНрд░рддреНрдпреЗрдХ principal рд▓рд╛ рдорд░реНрдпрд╛рджрд╛ рдШрд╛рд▓рддреЗ, рддреНрдпрд╛рдВрдЪреНрдпрд╛ root users рд╕рдХрдЯ. рддреА рдХрд╛рд╣реАрдЪ рджреЗрдд
рдирд╛рд╣реА: default
FullAWSAccessSCP рдореБрд│реЗрдЪ рдореБрд│рд╛рдд рдХрд╛рд╣реАрддрд░реА allow рд╣реЛрддреЗ. SCPs management account рд▓рд╛ рдХрд┐рдВрд╡рд╛ service-linked roles рдирд╛ рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реАрдд. - Deny-list рд╡рд┐рд░реБрджреНрдз allow-list SCPs тАФ
FullAWSAccessрдареЗрд╡рд╛ рдЖрдгрд┐ рдиреЗрдордХреЗ denies рдЬреЛрдбрд╛ (рдЗрдереЗ рдХреЗрд▓реЗ рдЖрд╣реЗ рддрд╕реЗ), рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рдРрд╡рдЬреА рдкрд░рд╡рд╛рдирдЧреА рдЕрд╕рд▓реЗрд▓реНрдпрд╛ services рдЪреА рдпрд╛рджреА рдареЗрд╡рд╛. - Region guardrail тАФ global services рд╕рд╛рдареА
NotActionрдЕрд╕рд▓реЗрд▓рд╛DenyрдЖрдгрд┐aws:RequestedRegionрд╡рд░StringNotEquals. рд╣рд╛ рдирдореБрдирд╛iam:*,sts:*рдЖрдгрд┐organizations:*рдирд╛ рд╕реВрдЯ рджреЗрддреЛ; AWS рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдЙрджрд╛рд╣рд░рдг global services рдЪреНрдпрд╛ рдЬрд╛рд╕реНрдд рдореЛрдареНрдпрд╛ рдпрд╛рджреАрд▓рд╛ рд╕реВрдЯ рджреЗрддреЗ (CloudFront, Route 53, Support, тАж). - RCPs тАФ resource control policies рдореНрд╣рдгрдЬреЗ SCPs рдЪреА рдирд╡реА, resource рдмрд╛рдЬреВрдЪреА рдЬреБрд│реА рдмрд╣реАрдг: рддреБрдордЪреНрдпрд╛ organization рдордзреАрд▓ resources рдХрд╛рдп allow рдХрд░рддрд╛рдд рддреНрдпрд╛рд╡рд░рдЪреЗ рдЫрдд.
- рдкреНрд░рддреНрдпрдХреНрд╖ permissions = identity тИй boundary тИй session policy тИй SCP (рдЖрдгрд┐ RCP), рддреНрдпрд╛рддреВрди рдХреЛрдгрддрд╛рд╣реА explicit deny рд╡рдЬрд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг admins рдЪреБрдХрд╛ рдХрд░рддрд╛рдд, credentials рдлреБрдЯрддрд╛рдд, рдЖрдгрд┐ teams рдирд╛ рд╕реНрд╡рддрдГрдЪреЗ roles рдмрдирд╡рдгреНрдпрд╛рдЪреЗ рд╕реНрд╡рд╛рддрдВрддреНрд░реНрдп рд╣рд╡реЗ рдЕрд╕рддреЗ. Guardrails "рдХреГрдкрдпрд╛ рдХрд░реВ рдирдХрд╛" рдЪреЗ "рдХрд░рддрд╛рдЪ рдпреЗрдд рдирд╛рд╣реА" рдХрд░рддрд╛рдд: рдХреЛрдгреАрд╣реА рдордВрдЬреВрд░ regions рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА, audit trail рдмрдВрдж рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдХрд┐рдВрд╡рд╛ рд╕реНрд╡рддрдГрд▓рд╛ рдЫрддрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рджреЗрдК рд╢рдХрдд рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
iam/demo.py рдордзреАрд▓ guardrails() dipika рд▓рд╛ admin policy boundary рд╕рд╣ рдЖрдгрд┐
boundary рд╢рд┐рд╡рд╛рдп (boundary=) рджреЗрддреЗ, рдордЧ katrina рдЪреА admin policy рджреЛрди SCPs рдЦрд╛рд▓реА
(scps=) рджреЛрди regions рдордзреНрдпреЗ рдЪрд╛рд▓рд╡рддреЗ. iam/evaluate.py рдордзреНрдпреЗ decide() рдЪреНрдпрд╛
рдкрд╛рдпрд▒реНрдпрд╛ 2 рдЖрдгрд┐ 4 рд╕рд╛рдВрдЧрддрд╛рдд "allow рдХрд░рд╛рдпрд▓рд╛рдЪ рд╣рд╡реЗ, рдХрдзреАрдЪ рджреЗрдд рдирд╛рд╣реА".
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 iam/demo.py guardrails
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide, load
dipika, katrina = "arn:aws:iam::111122223333:user/dipika", "arn:aws:iam::111122223333:user/katrina"
admin, b = [("admin", load("admin"))], [("boundary-developers", load("boundary-developers"))]
print("boundary alone ", decide(dipika, "s3:PutObject", "arn:aws:s3:::dev-scratch/x", identity=[], boundary=b)[0])
deny_only = [("scp-two-regions", load("scp-two-regions"))]
print("SCP deny-list only ", decide(katrina, "ec2:RunInstances", "*", {"aws:RequestedRegion": "ap-south-1"}, identity=admin, scps=deny_only))
scps = [("scp-full-access", load("scp-full-access"))] + deny_only
print("IAM from sa-east-1 ", decide(katrina, "iam:CreateUser", "*", {"aws:RequestedRegion": "sa-east-1"}, identity=admin, scps=scps)[0])
EOF
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; SCP commands organization рдЪреНрдпрд╛ management account рдордзреВрди рдЪрд╛рд▓рддрд╛рдд, рдЖрдгрд┐ IDs рдЙрджрд╛рд╣рд░рдгрд╛рджрд╛рдЦрд▓ рдЖрд╣реЗрдд):
aws iam create-policy --policy-name boundary-developers --policy-document file://iam/policies/boundary-developers.json
aws iam put-user-permissions-boundary --user-name dipika --permissions-boundary arn:aws:iam::111122223333:policy/boundary-developers
aws organizations create-policy --name two-regions --type SERVICE_CONTROL_POLICY --description "Only ap-south-1 and us-east-1" --content file://iam/policies/scp-two-regions.json
aws organizations attach-policy --policy-id p-examplepolicyid111 --target-id ou-ab12-cd34ef56
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
guardrails boundary рд╢рд┐рд╡рд╛рдп dipika рдЪреНрдпрд╛ admin рд╕рд╛рдареА тЬЕ ALLOW рдЫрд╛рдкрддреЗ,
boundary рд╕рд╣ ЁЯЪл IMPLICIT DENY тАФ outside the permission boundary тАФ the boundary is a ceiling, not a grant,
s3:PutObject рд╕рд╛рдареА тЬЕ ALLOW (рдЫрддрд╛рдЪреНрдпрд╛ рдЖрдд), ap-south-1 рдордзреНрдпреЗ тЬЕ ALLOW
рдЖрдгрд┐ sa-east-1 рдордзреНрдпреЗ тЫФ DENY тАФ explicit Deny in SCP scp-two-regions#OnlyMumbaiAndVirginia.
рддреБрдордЪрд╛ snippet рдЖрдзреА IMPLICIT DENY рдЫрд╛рдкрддреЛ (boundary рдХрд╛рд╣реАрдЪ рджреЗрдд рдирд╛рд╣реА), рдордЧ
('IMPLICIT DENY', "the organization's SCPs do not allow this action for the account")
тАФ FullAWSAccess рд╢рд┐рд╡рд╛рдп рдордВрдЬреВрд░ region рдордзреНрдпреЗрд╕реБрджреНрдзрд╛ рдХрд╛рд╣реАрдЪ allow рд╣реЛрдд рдирд╛рд╣реА тАФ рдЖрдгрд┐ sa-east-1 рдордзреВрди
iam:CreateUser рд╕рд╛рдареА ALLOW, рдХрд╛рд░рдг SCP рдЪрд╛ NotAction IAM рд▓рд╛ рд╕реВрдЯ рджреЗрддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Boundaries рдЖрдгрд┐ SCPs рдлрдХреНрдд рдХрд╛рдвреВрдирдЪ рдШреЗрддрд╛рдд: рдЫрддрд╛рдЦрд╛рд▓рдЪреА admin policy рддреНрдпрд╛ рдЫрддрд╛рдЗрддрдХреАрдЪ рддрд╛рдХрджрд╡рд╛рди рдЕрд╕рддреЗ, рдЖрдгрд┐ рдЬреНрдпрд╛ рдЫрддрд╛рдЦрд╛рд▓реА рдХреЛрдгрддреЗрд╣реА Allow рдирд╛рд╣реА рддреЗ рдХрд╛рд╣реАрдЪ allow рдХрд░рдд рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- test рдХрд░рддрд╛рдирд╛
FullAWSAccessрдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ тАФ рддреНрдпрд╛рдЦрд╛рд▓рдЪреА рдкреНрд░рддреНрдпреЗрдХ account рдХрд╛рдо рдХрд░рдгреЗ рдерд╛рдВрдмрд╡рддреЗ - global-service рд╕реВрдЯ рдирд╕рд▓реЗрд▓реА region SCP тАФ IAM, billing рдХрд┐рдВрд╡рд╛ CloudFront рдмрд┐рдШрдбрддрд╛рдд
- SCP management account рд▓рд╛ рдорд░реНрдпрд╛рджрд╛ рдШрд╛рд▓реЗрд▓ рдЕрд╢реА рдЕрдкреЗрдХреНрд╖рд╛ рдареЗрд╡рдгреЗ (рддреА рдШрд╛рд▓рдд рдирд╛рд╣реА; workloads рддреНрдпрд╛рдкрд╛рд╕реВрди рджреВрд░ рдареЗрд╡рд╛)
- developers рд╡рд░ boundary рд▓рд╛рд╡рдгреЗ рдкрдг рддреНрдпрд╛рдВрдирд╛ boundary рд╕реНрд╡рддрдГрдЪ рдмрджрд▓реВ рдХрд┐рдВрд╡рд╛ рдХрд╛рдвреВ рджреЗрдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: multi-account landing zone рдиреЗрд╣рдореА baseline SCPs рд╕реЛрдмрддрдЪ рдпреЗрддреЛ тАФ organization рд╕реЛрдбрдгреНрдпрд╛рд╕ рдирдХрд╛рд░, CloudTrail рдЖрдгрд┐ GuardDuty рдмрдВрдж рдХрд░рдгреНрдпрд╛рд╕ рдирдХрд╛рд░, рдордВрдЬреВрд░ рдирд╕рд▓реЗрд▓реНрдпрд╛ regions рдирд╛ рдирдХрд╛рд░, root-user actions рдирд╛ рдирдХрд╛рд░ тАФ рдЖрдгрд┐ roles рдмрдирд╡рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ team рд╕рд╛рдареА boundaries.
тПня╕П рдкреБрдвреЗ
рдПрдХрд╛ partner рд╢рд╛рд│реЗрдЪреНрдпрд╛ auditor рд▓рд╛ рддреБрдордЪреЗ reports рд╡рд╛рдЪрд╛рдпрдЪреЗ рдЖрд╣реЗрдд. Cross-account access рдЖрдгрд┐ resource policies тАФ рджреЛрди рджрд░рд╡рд╛рдЬреЗ, рджреЛрди рдЪрд╛рд╡реНрдпрд╛.
git checkout lesson-09-cross-account