ЁЯП╖я╕П рдзрдбрд╛ 07 тАФ Conditions рдЖрдгрд┐ ABAC: "рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪтАж"
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдорд╛рдЧреЗ: lesson-06-machine-identities ┬╖ рдкреБрдвреЗ: lesson-08-guardrails
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ06, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд Condition block: IAM рдмрджрд▓рд╛рдВрд╕рд╛рдареА MFA рдмрдВрдзрдирдХрд╛рд░рдХ
(iam-needs-mfa.json), рдлрдХреНрдд рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреЗ network
(office-network-only.json), рдЖрдгрд┐
ABAC тАФ tags рд╡рд░реВрди рдард░рдгрд╛рд░рд╛ access
(abac-own-team.json).
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрд╛рд╣реА рдирд┐рдпрдорд╛рдВрдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА "рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪтАж" рдЕрд╕рддреЗ:
- "рддреБрдореНрд╣реА рдУрд│рдЦрдкрддреНрд░рд╛рдВрдЪреНрдпрд╛ рдиреЛрдВрджреА рдмрджрд▓реВ рд╢рдХрддрд╛ тАФ рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪ рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рддреБрдордЪреЗ рдХрд╛рд░реНрдб рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ phone рд╡рд░рдЪрд╛ code рджрд╛рдЦрд╡рд▓рд╛ рдЕрд╕реЗрд▓." (MFA)
- "рдкреНрд░рдЧрддреА рдкреБрд╕реНрддрдХреЗ рдлрдХреНрдд рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдЗрдорд╛рд░рддреАрдЪреНрдпрд╛ рдЖрддреВрдирдЪ рд╡рд╛рдЪрддрд╛ рдпреЗрддреАрд▓." (network)
- "рддреБрдореНрд╣реА lab рдордзрд▓рд╛ computer рдмрдВрдж рдХрд░реВ рд╢рдХрддрд╛ рдлрдХреНрдд рддреЗрд╡реНрд╣рд╛рдЪ рдЬреЗрд╡реНрд╣рд╛ рддреНрдпрд╛рдЪреНрдпрд╛ sticker рдЪрд╛ рд░рдВрдЧ рддреБрдордЪреНрдпрд╛ рдмрд┐рд▓реНрд▓реНрдпрд╛рдЪреНрдпрд╛ рд░рдВрдЧрд╛рд╢реА рдЬреБрд│рддреЛ." (tags)
рд╢реЗрд╡рдЯрдЪрд╛ рдирд┐рдпрдо рд╕рдЧрд│реНрдпрд╛рдд рд╣реБрд╢рд╛рд░ рдЖрд╣реЗ. рдкреНрд░рддреНрдпреЗрдХ team рд╕рд╛рдареА рд╡реЗрдЧрд│рд╛ рдирд┐рдпрдо рдирд╛рд╣реА, рддрд░ рдПрдХрдЪ рдирд┐рдпрдо рдЕрд╕рддреЛ тАФ "stickers рдЬреБрд│рд╛рдпрд▓рд╛ рд╣рд╡реЗрдд" тАФ рдЖрдгрд┐ рдирд╡реНрдпрд╛ team рд▓рд╛ рдлрдХреНрдд sticker рдЪрд╛ рдирд╡рд╛ рд░рдВрдЧ рд▓рд╛рдЧрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
me["ЁЯкк aishwarya<br/>PrincipalTag team = maths"]
rule["ЁЯУЭ abac-own-team<br/>StringEquals<br/>ResourceTag/team = PrincipalTag/team"]
m["ЁЯЦея╕П instance ┬╖ team = maths"]
s["ЁЯЦея╕П instance ┬╖ team = science"]
me --> rule
rule -->|"1 tags match"| m --> ok["тЬЕ ALLOW StopInstances"]
rule -->|"2 tags differ"| s --> no["ЁЯЪл IMPLICIT DENY"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l07
тЭУ рдХрд╛рдп
- рдЖрдХрд╛рд░ тАФ
"Condition": { "<operator>": { "<key>": "<value(s)>" } }. рд╕рдЧрд│реЗ operators рдЖрдгрд┐ keys рдЬреБрд│рд╛рдпрд▓рд╛рдЪ рд╣рд╡реЗрдд (AND); рдПрдХрд╛ key рд╕рд╛рдареА рдЕрдиреЗрдХ values рдЕрд╕рддреАрд▓ рддрд░ рддреНрдпрд╛рдВрдкреИрдХреА рдХреЛрдгрддреАрд╣реА рдЬреБрд│рд▓реА рддрд░реА рдЪрд╛рд▓рддреЗ (OR). - Operators тАФ
StringEquals,StringLike,Bool,NumericLessThan,IpAddress,NotIpAddress,DateGreaterThan,ArnLike, тАж рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрддтАжIfExists("key рдЕрд╕реЗрд▓ рддрд░рдЪ рддрдкрд╛рд╕рд╛") рдЖрдгрд┐ рдЕрдиреЗрдХ values рдЕрд╕рд▓реЗрд▓реНрдпрд╛ keys рд╕рд╛рдареАForAllValues:/ForAnyValue:. - рдЙрдкрдпреЛрдЧреА global keys тАФ
aws:MultiFactorAuthPresent,aws:SourceIp,aws:RequestedRegion,aws:PrincipalTag/тАж,aws:ResourceTag/тАж,aws:RequestTag/тАж,aws:TagKeys,aws:PrincipalOrgID,aws:SecureTransport,aws:ViaAWSService. - рдирд╕рд▓реЗрд▓реНрдпрд╛ keys тАФ request рдордзреНрдпреЗ рдирд╕рд▓реЗрд▓реНрдпрд╛ key рд╡рд░рдЪреА condition рдЬреБрд│рдд рдирд╛рд╣реА. рджреАрд░реНрдШрдХрд╛рд│рд╛рдЪреНрдпрд╛
access key рдиреЗ рд╕рд╣реА рдХреЗрд▓реЗрд▓реНрдпрд╛ request рдордзреНрдпреЗ
aws:MultiFactorAuthPresentрдирд╕рддреЗрдЪ, рдореНрд╣рдгреВрди рддреА рдорд╛рдЧрдгрд╛рд░рд╛ Allow рд▓рд╛рдЧреВ рд╣реЛрдд рдирд╛рд╣реА. Deny рдирд┐рдпрдорд╛рдВрд╕рд╛рдареА рдиреЗрд╣рдореАрдЪрд╛ pattern рдореНрд╣рдгрдЬреЗ"BoolIfExists": {"aws:MultiFactorAuthPresent": "false"}. - ABAC тАФ attribute-based access control: principals рдЖрдгрд┐ resources рдирд╛ tags рд▓рд╛рд╡рд╛, рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рдгрд╛рд░реА рдПрдХрдЪ
policy рд▓рд┐рд╣рд╛ (
${aws:PrincipalTag/team}). Tags рдЪреЗрдЪ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рд╛ тАФ рд▓реЛрдХ рд╕реНрд╡рддрдГрдЪреЗ tags рдмрджрд▓реВ рд╢рдХрд▓реЗ, рддрд░ рддреЗ рд╕реНрд╡рддрдГрдЪрд╛ access рдмрджрд▓реВ рд╢рдХрддрд╛рдд. aws:SourceIpрдмрд╛рдмрдд рд╕рд╛рд╡рдзрд╛рдирддрд╛ тАФ VPC endpoint рдордзреВрди рдпреЗрдгрд╛рд▒реНрдпрд╛ requests рдордзреНрдпреЗ public source IP рдирд╕рддреЛ (aws:SourceVpc/aws:VpcSourceIpрд╡рд╛рдкрд░рд╛), рдЖрдгрд┐ AWS services рддреБрдордЪреНрдпрд╛ рд╡рддреАрдиреЗ рдХрд░рдгрд╛рд░реЗ calls AWS рдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рдВрд╡рд░реВрди рдпреЗрддрд╛рдд тАФ рдЦрд▒реНрдпрд╛ "рдлрдХреНрдд рдХрд╛рд░реНрдпрд╛рд▓рдп" denies рдордзреНрдпреЗaws:ViaAWSServiceрдЪреЗ рдЕрдкрд╡рд╛рдж рдЬреЛрдбрд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд.
ЁЯдФ рдХрд╛
рддреБрдореНрд╣реА рдХреЛрдг рдЖрд╣рд╛рдд рдПрд╡рдвреЗ рдиреЗрд╣рдореАрдЪ рдкреБрд░реЗрд╕реЗ рдирд╕рддреЗ; рддреБрдореНрд╣реА рдХрд╕реЗ рдЖрдгрд┐ рдХреБрдареВрди рд╡рд┐рдЪрд╛рд░рддрд╛ рд╣реЗрд╣реА рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЕрд╕рддреЗ. Conditions рдзреЛрдХрд╛рджрд╛рдпрдХ actions рд╕рдореЛрд░ MFA рдареЗрд╡рддрд╛рдд рдЖрдгрд┐ data рдЕрдкреЗрдХреНрд╖рд┐рдд networks рдЪреНрдпрд╛ рдЖрддрдЪ рдареЗрд╡рддрд╛рдд. ABAC policies рдЪрд╛ рдкрд╕рд╛рд░рд╛ рдерд╛рдВрдмрд╡рддреЗ: рджрд╣рд╛ teams, рдПрдХрдЪ policy.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
iam/demo.py рдордзрд▓рд╛ conditions() рдПрдХ request context рджреЗрддреЛ (decide() рдЪрд╛ рддрд┐рд╕рд░рд╛
argument, condition keys рдЪреА dict) тАФ MFA true/false, рджреЛрди source IPs, рдЖрдгрд┐
principal/resource tags. iam/evaluate.py рдордзрд▓рд╛ _condition_ok()
operators, тАжIfExists, рдЖрдгрд┐ рдирд╕рд▓реЗрд▓реНрдпрд╛ key рдЪрд╛ рдирд┐рдпрдо рдЕрдорд▓рд╛рдд рдЖрдгрддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 iam/demo.py conditions
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide, load
aishwarya = "arn:aws:iam::111122223333:user/aishwarya"
print("MFA key absent ", decide(aishwarya, "iam:CreateUser", "*", {}, identity=[("iam-needs-mfa", load("iam-needs-mfa"))]))
abac = [("abac-own-team", load("abac-own-team"))]
inst = "arn:aws:ec2:ap-south-1:111122223333:instance/i-0abc"
print("no team tag on me ", decide(aishwarya, "ec2:StopInstances", inst, {"aws:ResourceTag/team": "maths"}, identity=abac)[0])
print("science = science ", decide(aishwarya, "ec2:StopInstances", inst, {"aws:PrincipalTag/team": "science", "aws:ResourceTag/team": "science"}, identity=abac)[0])
print("other region ", decide(aishwarya, "ec2:StopInstances", "arn:aws:ec2:us-east-1:111122223333:instance/i-0abc", {"aws:PrincipalTag/team": "maths", "aws:ResourceTag/team": "maths"}, identity=abac)[0])
EOF
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд) тАФ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ tags рд▓рд╛рд╡рд╛, рдЖрдгрд┐ CLI рд╕рд╛рдареА MFA рдЪрд╛ рдЖрдзрд╛рд░ рдЕрд╕рд▓реЗрд▓реА рддрд╛рддреНрдкреБрд░рддреА credentials рдорд┐рд│рд╡рд╛:
aws iam tag-user --user-name aishwarya --tags Key=team,Value=maths
aws ec2 create-tags --resources i-0abc1234def567890 --tags Key=team,Value=maths
aws sts get-session-token --serial-number arn:aws:iam::111122223333:mfa/aishwarya --token-code 123456
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
conditions MFA рд╕рд╛рдареА рдЖрдзреА ЁЯЪл IMPLICIT DENY рдЖрдгрд┐ рдордЧ тЬЕ ALLOW тАФ identity policy iam-needs-mfa#IamOnlyWithMfa allows it
print рдХрд░рддреЛ; рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рддреВрди тЬЕ ALLOW рдЖрдгрд┐ caf├й рдордзреВрди тЫФ DENY тАФ explicit Deny in identity policy office-network-only#DenyOutsideOffice;
maths-on-maths рд╕рд╛рдареА тЬЕ ALLOW рдЖрдгрд┐ maths-on-science рд╕рд╛рдареА ЁЯЪл IMPLICIT DENY.
рддреБрдордЪрд╛ snippet ('IMPLICIT DENY', 'no policy allows it тАФ AWS denies by default')
(request рдордзреНрдпреЗ MFA key рдирд╛рд╣реА), IMPLICIT DENY (aishwarya рд╡рд░ team tag рдирд╛рд╣реА тАФ variable рд▓рд╛
рднрд░рд╛рдпрд▓рд╛ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА), ALLOW (science рд▓рд╛ science рдЬреБрд│рддреЗ: рддреАрдЪ policy, рд╡реЗрдЧрд│реА team) рдЖрдгрд┐
IMPLICIT DENY (policy рдЪрд╛ Resource рдлрдХреНрдд ap-south-1 рд▓рд╛рдЪ рд▓рд╛рдЧреВ рд╣реЛрддреЛ) print рдХрд░рддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Conditions рдореБрд│реЗ рддреНрдпрд╛рдЪ principal рд▓рд╛ MFA, network рдЖрдгрд┐ tags рдиреБрд╕рд╛рд░ рд╡реЗрдЧрд╡реЗрдЧрд│реА рдЙрддреНрддрд░реЗ рдорд┐рд│рддрд╛рдд тАФ рдЖрдгрд┐ ABAC рдореБрд│реЗ рдПрдХрдЪ policy рдкреНрд░рддреНрдпреЗрдХ team рд▓рд╛ рдЪрд╛рд▓рддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- Deny рдордзреНрдпреЗ
"Bool": {"aws:MultiFactorAuthPresent": "false"}тАФ key рдирд╕рд▓реЗрд▓реНрдпрд╛ requests рддреЛ рдЪреБрдХрд╡рддреЛ;BoolIfExistsрд╡рд╛рдкрд░рд╛ - IP рд╡рд░ рдЖрдзрд╛рд░рд┐рдд Deny, рдЬреЛ рддреБрдордЪреНрдпрд╛ рд╡рддреАрдиреЗ рдХрд╛рдо рдХрд░рдгрд╛рд▒реНрдпрд╛ AWS services рдХрд┐рдВрд╡рд╛ VPC endpoint traffic рдмрд┐рдШрдбрд╡рддреЛ
- tags рдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рди рдХрд░рддрд╛ ABAC (
iam:TagUser,ec2:CreateTagsрд╕рдЧрд│реНрдпрд╛рдВрдирд╛) - рдЬрд┐рдереЗ
StringEqualsрдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реЛрддреЗ рддрд┐рдереЗStringLike(рдЖрдгрд┐ рдЙрд▓рдЯрд╣реА)
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: "рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдЧреЛрд╖реНрдЯреАрд╕рд╛рдареА MFA", "data рдлрдХреНрдд рдЖрдордЪреНрдпрд╛ network рдордзреВрди рдХрд┐рдВрд╡рд╛ рдЖрдордЪреНрдпрд╛ organization рдордзреВрди (
aws:PrincipalOrgID)" рдЖрдгрд┐ "teams рдлрдХреНрдд рддреНрдпрд╛рдВрдиреА tag рдХреЗрд▓реЗрд▓реЗрдЪ рд╕рд╛рдВрднрд╛рд│рддрд╛рдд" рдпрд╛ enterprise IAM рдордзрд▓реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рдд рдиреЗрд╣рдореАрдЪреНрдпрд╛ рддреАрди рдЧрд░рдЬрд╛ рдЖрд╣реЗрдд тАФ рдЖрдгрд┐ рддрд┐рдиреНрд╣реА conditions рдЪ.
тПня╕П рдкреБрдвреЗ
Admin рдЕрдзрд┐рдХрд╛рд░ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛рд╣реА рд╕рдЧрд│реЗ рдХрд░рддрд╛ рдпреЗрдК рдирдпреЗ. Guardrails тАФ permission boundaries рдЖрдгрд┐ SCPs, рдкреНрд░рддреНрдпреЗрдХ policy рд╡рд░рдЪреА рдЫрддреЗ.
git checkout lesson-08-guardrails