ЁЯСе рдзрдбрд╛ 02 тАФ Users, groups рдЖрдгрд┐ root: рдХрд╛рд░реНрдбреЗ рдЖрдгрд┐ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдпрд╛рджреНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-why-iam ┬╖ рдкреБрдвреЗ: lesson-03-policies
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рдкрд╣рд┐рд▓реНрдпрд╛ identities: IAM users (aishwarya, katrina, dipika), policies рд╡рд╛рд╣реВрди рдиреЗрдгрд╛рд░рд╛
рдПрдХ group (teachers), рдЖрдгрд┐ рддреБрдореНрд╣реА рддрд┐рдЬреЛрд░реАрдд рдмрдВрдж рдХрд░реВрди рдареЗрд╡рддрд╛ рддреЛ root user.
iam/demo.py рдордзрд▓рд╛ users() рджрд╛рдЦрд╡рддреЛ рдХреА рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдпрд╛рджреАрдиреБрд╕рд╛рд░ рдЪрд╛рд▓рддрд╛рдд.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп рд╢рд╛рд│реЗрддрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдареНрдпрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛ рддрд┐рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдЪреЗ рдПрдХ рдХрд╛рд░реНрдб рджреЗрддреЗ тАФ рддреЗрдЪ IAM user. "рдРрд╢реНрд╡рд░реНрдпрд╛ рдЧреНрд░рдВрдерд╛рд▓рдп рдЙрдШрдбреВ рд╢рдХрддреЗ" рд╣реЗ рдРрд╢реНрд╡рд░реНрдпрд╛рдЪреНрдпрд╛рдЪ рдХрд╛рд░реНрдбрд╡рд░ рд▓рд┐рд╣рд┐рдгреЗ рджрдорд╡рдгрд╛рд░реЗ рдЕрд╕рддреЗ: рдирд╡реА рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдЖрд▓реА рдХреА рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд╛, рдЖрдгрд┐ рдХреЛрдгреА рд╕реЛрдбреВрди рдЧреЗрд▓реЗ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рд╢реЛрдзрдд рдмрд╕рд╛.
рдореНрд╣рдгреВрди рдХрд╛рд░реНрдпрд╛рд▓рдп рддреНрдпрд╛рдРрд╡рдЬреА рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рдпрд╛рджреНрдпрд╛ ЁЯУЛ рдареЗрд╡рддреЗ. рдирд┐рдпрдо рдпрд╛рджреАрд▓рд╛ рд▓рд╛рд╡рд▓реЗрд▓реЗ рдЕрд╕рддрд╛рдд тАФ "teachers рдпрд╛рджреАрддреАрд▓ рдкреНрд░рддреНрдпреЗрдХрдЬрдг reports рд╡рд╛рдЪреВ рд╢рдХрддреЛ" тАФ рдЖрдгрд┐ рд▓реЛрдХ рдлрдХреНрдд рдпрд╛рджреАрдд рдпреЗрддрд╛рдд рдХрд┐рдВрд╡рд╛ рдЬрд╛рддрд╛рдд. рджреАрдкрд┐рдХрд╛ teachers рдордзреНрдпреЗ рд╕рд╛рдореАрд▓ рд╣реЛрддреЗ: рддреА reports рд╡рд╛рдЪреВ рд╢рдХрддреЗ. рддреА рдмрд╛рд╣реЗрд░ рдкрдбрддреЗ: рддреА рд╡рд╛рдЪреВ рд╢рдХрдд рдирд╛рд╣реА.
рдЖрдгрд┐ рдорд╛рд╕реНрдЯрд░ рдЪрд╛рд╡реА ЁЯЧЭя╕П тАФ рдкреНрд░рддреНрдпреЗрдХ рджрд╛рд░ рдЙрдШрдбрдгрд╛рд░реА, рд╢рд╛рд│рд╛ рдмрд╛рдВрдзрд▓реА рддреЗрд╡реНрд╣рд╛ рдмрдирд╡рд▓реЗрд▓реА тАФ рддреА рджреБрд╕рд▒реНрдпрд╛ рдХреБрд▓реБрдкрд╛рд╕рд╣ (MFA) рддрд┐рдЬреЛрд░реАрдд рдЬрд╛рддреЗ. рддреЛрдЪ root user.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
root["ЁЯЧЭя╕П root user<br/>MFA ┬╖ no access keys ┬╖ in the safe"]
grp["ЁЯУЛ group: teachers<br/>read-reports ┬╖ own-homework-folder"]
a["ЁЯкк aishwarya"] --> grp
s["ЁЯкк katrina"] --> grp
k["ЁЯкк dipika<br/>no groups"]
grp -->|"1 policies apply to members"| ok["тЬЕ s3:GetObject report"]
k -.->|"2 nothing attached"| no["ЁЯЪл IMPLICIT DENY"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l02
тЭУ рдХрд╛рдп
- IAM user тАФ рдПрдХрд╛ account рдордзрд▓реА рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реА identity, console password рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛
рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рджреЛрди access keys (
AKIAтАж) рд╕рд╣. рдЖрдЬрдЪрд╛ рд╕рд▓реНрд▓рд╛: рд▓реЛрдХ IAM Identity Center рдиреЗ sign in рдХрд░рддрд╛рдд (рдзрдбрд╛ 10) рдЖрдгрд┐ machines roles рд╡рд╛рдкрд░рддрд╛рдд (рдзрдбреЗ 05тАУ06); IAM users рдЙрд░рд▓реЗрд▓реНрдпрд╛ рдереЛрдбреНрдпрд╛рдЪ рдкреНрд░рд╕рдВрдЧрд╛рдВрд╕рд╛рдареА. - IAM group тАФ policies рдЬреЛрдбрд▓реЗрд▓реА users рдЪреА рдпрд╛рджреА. Group рд╣рд╛ principal рдирд╛рд╣реА: рддреНрдпрд╛рдЪреЗ рдирд╛рд╡ resource policy рдордзреНрдпреЗ рдШреЗрддрд╛ рдпреЗрдд рдирд╛рд╣реА рдЖрдгрд┐ рддреЛ request рд╡рд░ рд╕рд╣реА рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. Group рдордзреНрдпреЗ рджреБрд╕рд░реЗ groups рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реАрдд. рдПрдХ user рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд 10 groups рдордзреНрдпреЗ рдЕрд╕реВ рд╢рдХрддреЛ.
- User рдЪреНрдпрд╛ effective permissions = user рд╡рд░рдЪреНрдпрд╛ policies рдЕрдзрд┐рдХ рддреЛ рдЬреНрдпрд╛ рдЬреНрдпрд╛ group рдордзреНрдпреЗ рдЖрд╣реЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛ policies (рдордЧ рдзрдбрд╛ 04 рдкреНрд░рдорд╛рдгреЗ evaluate рдХреЗрд▓реЗрд▓реНрдпрд╛).
- Root user тАФ MFA рдЪрд╛рд▓реВ рдХрд░рд╛, root рдЪреНрдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА access keys delete рдХрд░рд╛, рд╕рдВрдкрд░реНрдХ рдорд╛рд╣рд┐рддреА рдЕрджреНрдпрдпрд╛рд╡рдд рдареЗрд╡рд╛, рдЖрдгрд┐ рдЬреНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдЪреА рдЧрд░рдЬрдЪ рдЖрд╣реЗ рдЕрд╢рд╛ рдереЛрдбреНрдпрд╛ рдХрд╛рдорд╛рдВрд╕рд╛рдареАрдЪ рддреЛ рд╡рд╛рдкрд░рд╛ (рдЙрджрд╛. account рдмрдВрдж рдХрд░рдгреЗ, account рдЪреНрдпрд╛ рдХрд╛рд╣реА settings рдмрджрд▓рдгреЗ).
ЁЯдФ рдХрд╛
рд╡реНрдпрдХреНрддреАрдВрдирд╛ рд▓рд╛рд╡рд▓реЗрд▓реНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рднрд░рдХрдЯрддрд╛рдд: рдХреЛрдгреА team рдмрджрд▓рддреЗ рдЖрдгрд┐ рдЬреБрдиреЗ рдЕрдзрд┐рдХрд╛рд░ рддрд╕реЗрдЪ рдареЗрд╡рддреЗ, рд╕реЛрдбреВрди рдЧреЗрд▓реЗрд▓реНрдпрд╛рдХрдбреЗ key рд░рд╛рд╣рддреЗ. рдпрд╛рджреНрдпрд╛рдВрдирд╛ рд▓рд╛рд╡рд▓реЗрд▓реНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдПрдХрджрд╛ рддрдкрд╛рд╕рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдпрд╛рджреАрддреАрд▓ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛рдд. рдЖрдгрд┐ рд░реЛрдЬ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдгрд╛рд░рд╛ root user рдореНрд╣рдгрдЬреЗ рдЦрд┐рд╢рд╛рдд рдареЗрд╡рд▓реЗрд▓реА рдорд╛рд╕реНрдЯрд░ рдЪрд╛рд╡реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
iam/demo.py рдордзреНрдпреЗ GROUPS рд╣реЗ teachers рд▓рд╛ рджреЛрди policies рд╢реА рдЬреЛрдбрддреЗ рдЖрдгрд┐
MEMBERS рдпрд╛рджреАрдд рдХреЛрдг рдЖрд╣реЗ рддреЗ рд╕рд╛рдВрдЧрддреЗ; policies_of(name) user рдЪреНрдпрд╛ groups рдордзреВрди рддреНрдпрд╛рдЪреНрдпрд╛ policies
рдЧреЛрд│рд╛ рдХрд░рддреЗ. users() рддреАрди рдЬрдгрд╛рдВрд╕рд╛рдареА рддреЛрдЪ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЛ, рдордЧ dipika рд▓рд╛ рдпрд╛рджреАрдд рдЬреЛрдбрддреЛ
рдЖрдгрд┐ рдкреБрдиреНрд╣рд╛ рд╡рд┐рдЪрд╛рд░рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 iam/demo.py users
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide, load
groups = {"teachers": ["read-reports", "own-homework-folder"], "exam-board": ["deny-delete-reports"]}
def policies(*gs): return [(p, load(p)) for g in gs for p in groups[g]]
dipika, notes = "arn:aws:iam::111122223333:user/dipika", "arn:aws:s3:::school-homework/dipika/notes.txt"
print("no groups ", decide(dipika, "s3:PutObject", notes, identity=policies())[0])
print("teachers ", decide(dipika, "s3:PutObject", notes, identity=policies("teachers"))[0])
print("teachers + exams ", decide(dipika, "s3:GetObject", "arn:aws:s3:::school-reports/term1.pdf", identity=policies("teachers", "exam-board"))[0])
EOF
рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд):
aws iam create-group --group-name teachers
aws iam create-policy --policy-name read-reports --policy-document file://iam/policies/read-reports.json
aws iam attach-group-policy --group-name teachers --policy-arn arn:aws:iam::111122223333:policy/read-reports
aws iam create-user --user-name dipika
aws iam add-user-to-group --user-name dipika --group-name teachers
aws iam list-groups-for-user --user-name dipika
aws iam get-account-summary --query 'SummaryMap.AccountMFAEnabled' # 1 = root has MFA
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
users рд╣реЗ aishwarya рдЖрдгрд┐ katrina рд╕рд╛рдареА тЬЕ ALLOW print рдХрд░рддреЛ (identity policy read-reports#ReadReports allows it),
рдХреЛрдгрддреНрдпрд╛рд╣реА group рдордзреНрдпреЗ рдирд╕рд▓реЗрд▓реНрдпрд╛ dipika рд╕рд╛рдареА ЁЯЪл IMPLICIT DENY, рдЖрдгрд┐ dipika teachers рдордзреНрдпреЗ рд╕рд╛рдореАрд▓ рд╣реЛрддрд╛рдЪ тЬЕ ALLOW.
рддреБрдордЪрд╛ snippet IMPLICIT DENY, ALLOW, ALLOW print рдХрд░рддреЛ тАФ рджреБрд╕рд▒реНрдпрд╛ group рдордзреНрдпреЗ рд╕рд╛рдореАрд▓ рдЭрд╛рд▓реНрдпрд╛рдиреЗ рдирд┐рдпрдо
рд╡рд╛рдврддрд╛рдд; exam board рдЪрд╛ Deny рдлрдХреНрдд s3:DeleteObject рдмрджреНрджрд▓ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рд╡рд╛рдЪрдгреЗ рдЪрд╛рд▓реВрдЪ рд░рд╛рд╣рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рдпрд╛рджреАрдиреБрд╕рд╛рд░ рдЪрд╛рд▓рддрд╛рдд: рдХреЛрдгреАрд╣реА policy рди рдмрджрд▓рддрд╛, рддреАрдЪ рд╡реНрдпрдХреНрддреА group рдордзреНрдпреЗ рдпреЗрдКрди рдХрд┐рдВрд╡рд╛ рдЬрд╛рдКрди access рдорд┐рд│рд╡рддреЗ рдХрд┐рдВрд╡рд╛ рдЧрдорд╛рд╡рддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рдлрдХреНрдд рдПрд╡рдвреНрдпрд╛ рд╡реЗрд│реЗрд╕" рдореНрд╣рдгреВрди policies рдереЗрдЯ users рдирд╛ рдЬреЛрдбрдгреЗ тАФ рддреЗ рдХрдзреАрдЪ рдПрдХрд╛ рд╡реЗрд│реЗрдкреБрд░рддреЗ рд░рд╛рд╣рдд рдирд╛рд╣реА
- рд╕рдВрдкреВрд░реНрдг team рд╕рд╛рдареА рдПрдХрдЪ рд╡рд╛рдЯреВрди рдШреЗрддрд▓реЗрд▓рд╛ IAM user (audit trail рдирд╛рд╣реА, рд╕реЛрдбреВрди рдЬрд╛рдгрд╛рд▒реНрдпрд╛рд╕рд╛рдареА рд╕реНрд╡рдЪреНрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╛рд╣реА)
- bucket policy рдЪреНрдпрд╛
PrincipalрдордзреНрдпреЗ group рдЯрд╛рдХрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди тАФ groups рд╣реЗ principals рдирд╛рд╣реАрдд - root access keys рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рдгреЗрдЪ; MFA рд╢рд┐рд╡рд╛рдпрдЪрд╛ root
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: auditors рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛рдЪ рджреЛрди рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛рдд тАФ "root user рдЪреЗ MFA рджрд╛рдЦрд╡рд╛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ keys рдирд╛рд╣реАрдд рд╣реЗ рджрд╛рдЦрд╡рд╛" рдЖрдгрд┐ "рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рд╡реНрдпрдХреНрддреАрдВрдХрдбреВрди рдирд╛рд╣реА, рддрд░ groups рдХрд┐рдВрд╡рд╛ roles рдХрдбреВрди рдпреЗрддрд╛рдд рд╣реЗ рджрд╛рдЦрд╡рд╛". рджреЛрдиреНрд╣реА рд╕рд┐рджреНрдз рдХрд░рд╛рдпрд▓рд╛ рдПрдХрдЪ CLI call рдкреБрд░рддреЛ.
тПня╕П рдкреБрдвреЗ
рдирд┐рдпрдорд╛рд╡рд░ рдиреЗрдордХреЗ рдХрд╛рдп рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЕрд╕рддреЗ? Policies тАФ рдкреНрд░рддреНрдпреЗрдХ statement рдордзреНрдпреЗ рдЕрд╕рдгрд╛рд░реА рдЪрд╛рд░ fields.
git checkout lesson-03-policies