ЁЯПл The SchoolтА║ЁЯкк IAMтА║ЁЯкк рдзрдбрд╛ 01 тАФ IAM рдХрд╛: рд╢рд╛рд│реЗрдЪреЗ рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯкк рдзрдбрд╛ 01 тАФ IAM рдХрд╛: рд╢рд╛рд│реЗрдЪреЗ рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-users-groups-root


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдкреНрд░рддреНрдпреЗрдХ AWS request рд▓рд╛ рдЬреНрдпрд╛рдЪреЗ рдЙрддреНрддрд░ рджреНрдпрд╛рд╡реЗрдЪ рд▓рд╛рдЧрддреЗ рдЕрд╕рд╛ рдПрдХрдЪ рдкреНрд░рд╢реНрди тАФ рдХреЛрдг рд╡рд┐рдЪрд╛рд░рддреЛрдп, рдХрд╛рдп рдХрд░рд╛рдпрд▓рд╛, рдХреЛрдгрддреНрдпрд╛ рд╡рд╕реНрддреВрд╡рд░ тАФ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рдЙрддреНрддрд░ рджреЗрдгрд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп: IAM (Identity and Access Management). рдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╢рд╛ рдЦрд▒реНрдпрд╛ files:

ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧреЗрд▓, рдмрд╛рдХреА рдХрд╛рд╣реА рдирд╛рд╣реА тАФ AWS account рдирдХреЛ, pip install рдирдХреЛ. evaluate.py рд╣реЗ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model рдЖрд╣реЗ: рддреЗ AWS рдиреЗ рджрд╕реНрддрдРрд╡рдЬрд╛рдд рд╕рд╛рдВрдЧрд┐рддрд▓реЗрд▓реНрдпрд╛ рдХреНрд░рдорд╛рдиреЗрдЪ рдЪрд╛рд▓рддреЗ, рдкрдг рдЦрд▒реНрдпрд╛ AWS рдордзреНрдпреЗ рдЖрдгрдЦреА condition operators рдЖрдгрд┐ service-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рдпрдо рдЕрд╕рддрд╛рдд. рдЦрд▒реНрдпрд╛ policies IAM Policy Simulator рдиреЗ рдХрд┐рдВрд╡рд╛ aws iam simulate-principal-policy рдиреЗ рддрдкрд╛рд╕рд╛. рдЦрд▒реНрдпрд╛ account рд╡рд░ рдЕрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ commands рдирд╛ AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд; рдмрд╛рдХреА рд╕рдЧрд│реЗ рдЗрдереЗрдЪ рдЪрд╛рд▓рддреЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рдПрдХрд╛ рдореЛрдареНрдпрд╛ рд╢рд╛рд│реЗрдд рдПрдХрдЪ рдУрд│рдЦрдкрддреНрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп ЁЯкк рдЖрд╣реЗ. рдЧреНрд░рдВрдерд╛рд▓рдпрд╛рдд, lab рдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рд╢рд┐рдХреНрд╖рдХрд╛рдВрдЪреНрдпрд╛ рдЦреЛрд▓реАрдд рдХреЛрдгреАрд╣реА рдлрдХреНрдд рд╣рд╕реВрди рдЖрдд рдЬрд╛рдд рдирд╛рд╣реА тАФ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рджрд░рд╡рд╛рдЬрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рд▓рд╛ рддреАрди рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЛ:

рдХрд╛рд░реНрдпрд╛рд▓рдп рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░рд╛рдЪреА рд╕реБрд░реБрд╡рд╛рдд рдирд╛рд╣реА рдиреЗ рдХрд░рддреЗ. рдПрдЦрд╛рджрд╛ рд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рддрд╕реЗ рд╕рд╛рдВрдЧрдд рдЕрд╕реЗрд▓ рддрд░рдЪ рддреЗ рд╣реЛ рдореНрд╣рдгрддреЗ. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрдирд╛рдЪреА рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрддрд░рд╛рдЪреА рддреЗ рдПрдХ рдиреЛрдВрджрд╡рд╣реА рдареЗрд╡рддреЗ.

AWS рдореНрд╣рдгрдЬреЗрдЪ рддреА рд╢рд╛рд│рд╛. рдкреНрд░рддреНрдпреЗрдХ API call тАФ console рдордзреВрди, CLI рдордзреВрди, SDK рдордзреВрди, robot рдХрдбреВрди тАФ рд╣реА рдПрдХ рд╕рд╣реА рдХреЗрд▓реЗрд▓реА request рдЕрд╕рддреЗ, рдЖрдгрд┐ рдХрд╛рд╣реАрд╣реА рдШрдбрдгреНрдпрд╛рдЖрдзреА IAM рддрд┐рдЪреЗ рдЙрддреНрддрд░ рджреЗрддреЛ.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    who["ЁЯкк WHO<br/>arn:aws:iam::111122223333:user/aishwarya"]
    what["ЁЯОм WHAT<br/>s3:GetObject"]
    which["ЁЯУД WHICH<br/>arn:aws:s3:::school-reports/term1.pdf"]
    office["тЪЦя╕П IAM decides<br/>starts at DENY"]
    log["ЁЯз╛ CloudTrail<br/>one line per request"]
    who --> office
    what --> office
    which --> office
    office -->|"1 decision"| out["ЁЯЪл IMPLICIT DENY<br/>no policy allows it"]
    office -.->|"2 recorded"| log

ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрдХреГрддреА + рдПрдХ lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l01

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдХрд╛рд░рдг cloud рдореНрд╣рдгрдЬреЗ рдПрдХ рдореЛрдард╛ API рдЖрд╣реЗ, рдЖрдгрд┐ рдЬреЛ рддреЛ call рдХрд░реВ рд╢рдХрддреЛ рддреЛ рдХрд╛рд╣реАрд╣реА рдмрдирд╡реВ, рд╡рд╛рдЪреВ рдХрд┐рдВрд╡рд╛ delete рдХрд░реВ рд╢рдХрддреЛ. рдлреБрдЯрд▓реЗрд▓реНрдпрд╛ keys, рдЧрд░рдЬреЗрдкреЗрдХреНрд╖рд╛ рд░реБрдВрдж policies рдЖрдгрд┐ рд╡рд╛рдЯреВрди рдШреЗрддрд▓реЗрд▓реЗ logins рд╣реЗ рдЦрд▒реНрдпрд╛ cloud breaches рдкреИрдХреА рдореЛрдареНрдпрд╛ рднрд╛рдЧрд╛рдорд╛рдЧреЗ рдЕрд╕рддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ request рдЬреНрдпрд╛рддреВрди рдЬрд╛рддреЗ рдЕрд╕реЗ IAM рд╣реЗ рдПрдХрдЪ рдХрд╛рд░реНрдпрд╛рд▓рдп рдЖрд╣реЗ тАФ рддреЗ рдмрд░реЛрдмрд░ рдареЗрд╡рд╛, рдореНрд╣рдгрдЬреЗ рдмрд╛рдХреА рдкреНрд░рддреНрдпреЗрдХ service рд▓рд╛ рддреЗ рд╕рдВрд░рдХреНрд╖рдг рдЖрдкреЛрдЖрдк рдорд┐рд│рддреЗ.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

iam/demo.py рдордзрд▓рд╛ why() рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рд▓рд╛ рдПрдХ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЛ тАФ рдЕрдЬреВрди рдПрдХрд╣реА policy рдирд╕рд▓реЗрд▓реНрдпрд╛ aishwarya рд▓рд╛ рдПрдХ report рд╡рд╛рдЪрд╛рдпрдЪрд╛ рдЖрд╣реЗ тАФ рдЖрдгрд┐ iam/evaluate.py рдордзрд▓реНрдпрд╛ decide() рдЪрд╛ рдирд┐рд░реНрдгрдп print рдХрд░рддреЛ. decide() рдПрдХ рдЬреЛрдбреА рдкрд░рдд рджреЗрддреЛ: рдирд┐рд░реНрдгрдп рдЖрдгрд┐ рдХрд╛рд░рдг.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 iam/demo.py why
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide
me = "arn:aws:iam::111122223333:user/aishwarya"
for action, res in [("s3:GetObject", "arn:aws:s3:::school-reports/term1.pdf"), ("ec2:RunInstances", "*"), ("iam:CreateUser", "*")]:
    print(action.ljust(18), decide(me, action, res))
EOF
python3 iam/test_iam.py

рдЦрд▒реНрдпрд╛ account рд╡рд░ (AWS CLI рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд) тАФ "рдореА рдХреЛрдг рдЖрд╣реЗ?", рдЬреНрдпрд╛рд▓рд╛ рдХреЛрдгрддреАрдЪ рдкрд░рд╡рд╛рдирдЧреА рд▓рд╛рдЧрдд рдирд╛рд╣реА рдЕрд╕рд╛ рдПрдХрдореЗрд╡ call:

aws sts get-caller-identity

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

why рд╣реЗ print рдХрд░рддреЛ: ЁЯЪл aishwarya, no policies yet тЖТ s3:GetObject IMPLICIT DENY тАФ no policy allows it тАФ AWS denies by default. рддреБрдордЪрд╛ snippet рддреАрдЪ рдЬреЛрдбреА рддреАрди рд╡реЗрд│рд╛ print рдХрд░рддреЛ: s3:GetObject, ec2:RunInstances рдЖрдгрд┐ iam:CreateUser рд╕рд╛рдареА ('IMPLICIT DENY', 'no policy allows it тАФ AWS denies by default'). Tests рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА 12/12 passed рдпреЗрддреЗ. рдЦрд▒реНрдпрд╛ account рд╡рд░ get-caller-identity рддреБрдордЪрд╛ UserId, Account рдЖрдгрд┐ Arn рдкрд░рдд рджреЗрддреЛ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рдкреНрд░рддреНрдпреЗрдХ request рд╣рд╛ рдХреЛрдг / рдХрд╛рдп / рдХрд╢рд╛рд╡рд░ рдЕрд╕рд╛ рдкреНрд░рд╢реНрди рдЕрд╕рддреЛ, рдЖрдгрд┐ рдХреЛрдгрддрд╛рд╣реА рдирд┐рдпрдо рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдирд╕реЗрд▓ рддрд░ рдЙрддреНрддрд░ рдирд╛рд╣реА рдЕрд╕рддреЗ тАФ рдкреНрд░рддреНрдпреЗрдХ action рд╕рд╛рдареА, рддреА рдХрд┐рддреАрд╣реА рдирд┐рд░реБрдкрджреНрд░рд╡реА рдЕрд╕рд▓реА рддрд░реА.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ AWS security review рдЪреА рд╕реБрд░реБрд╡рд╛рдд IAM рдиреЗ рд╣реЛрддреЗ: root user MFA рд╕рд╣ рддрд┐рдЬреЛрд░реАрдд рдмрдВрдж рдЖрд╣реЗ рдХрд╛, рдХреЛрдг рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЛ, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ region рдордзреНрдпреЗ CloudTrail рдЪрд╛рд▓реВ рдЖрд╣реЗ рдХрд╛? рдпрд╛ рддреАрди рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдЙрддреНрддрд░реЗ рджреНрдпрд╛, рдореНрд╣рдгрдЬреЗ рдмрд╣реБрддреЗрдХ "рдЖрдордЪреНрдпрд╛рд╡рд░ breach рдЭрд╛рд▓рд╛" рдЕрд╢рд╛ рдХрдерд╛ рд╕реБрд░реВрдЪ рд╣реЛрдд рдирд╛рд╣реАрдд.

тПня╕П рдкреБрдвреЗ

рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рд▓рд╛ рдХрд╛рд░реНрдбреЗ рджреНрдпрд╛рдпрд▓рд╛ рдХреЛрдгреАрддрд░реА рд╣рд╡реЗ. Users, groups рдЖрдгрд┐ root тАФ рдУрд│рдЦрдкрддреНрд░ рдХреЛрдгрд╛рд▓рд╛ рдорд┐рд│рддреЗ, рдЖрдгрд┐ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ рд╡реНрдпрдХреНрддреАрдХрдбреЗ рдирд╛рд╣реА рддрд░ рдпрд╛рджреАрдХрдбреЗ рдХрд╛ рдЕрд╕рддрд╛рдд.

git checkout lesson-02-users-groups-root

ЁЯкк Lesson 01 тАФ Why IAM: the school's ID office

ЁЯУН You are here: Lesson 01 of 12 ┬╖ Next: lesson-02-users-groups-root


ЁЯУж What's in this branch

The one question every AWS request must answer тАФ who is asking, to do what, on which thing тАФ and the office that answers it: IAM (Identity and Access Management). Real files you will use all the way through:

ЁЯОТ Before you start: you need Python 3 and nothing else тАФ no AWS account, no pip install. evaluate.py is a teaching model: it follows the order AWS documents, but real AWS has more condition operators and service-specific rules. Check real policies with the IAM Policy Simulator or aws iam simulate-principal-policy. Commands marked on a real account need the AWS CLI and credentials; everything else runs here.

ЁЯзТ Explain like I'm 5

A big school has one ID office ЁЯкк. Nobody walks into the library, the lab or the staff room on a smile тАФ every time, the door asks the office three questions:

The office starts every answer at no. It only says yes if a written rule says so. And it keeps a logbook of every question and every answer.

AWS is that school. Every API call тАФ from the console, the CLI, an SDK, a robot тАФ is a signed request that IAM answers before anything happens.

ЁЯЧ║я╕П Diagram

flowchart LR
    who["ЁЯкк WHO<br/>arn:aws:iam::111122223333:user/aishwarya"]
    what["ЁЯОм WHAT<br/>s3:GetObject"]
    which["ЁЯУД WHICH<br/>arn:aws:s3:::school-reports/term1.pdf"]
    office["тЪЦя╕П IAM decides<br/>starts at DENY"]
    log["ЁЯз╛ CloudTrail<br/>one line per request"]
    who --> office
    what --> office
    which --> office
    office -->|"1 decision"| out["ЁЯЪл IMPLICIT DENY<br/>no policy allows it"]
    office -.->|"2 recorded"| log

ЁЯЧ║я╕П Drawn version + a lab: https://school-edh.pages.dev/iam/lesson-diagrams.html#l01

тЭУ What

ЁЯдФ Why

Because the cloud is one big API, and whoever can call it can create, read or delete anything. Leaked keys, over-wide policies and shared logins are behind a large share of real cloud breaches. IAM is the one office every request passes тАФ get it right and every other service inherits the protection.

ЁЯФз How (in this repo)

why() in iam/demo.py asks the office one question тАФ aishwarya, with no policies yet, wants to read a report тАФ and prints the decision from decide() in iam/evaluate.py. decide() returns a pair: the decision and the reason.

ЁЯзк Try it

python3 iam/demo.py why
python3 - <<'EOF'
import sys; sys.path.insert(0, "iam"); from evaluate import decide
me = "arn:aws:iam::111122223333:user/aishwarya"
for action, res in [("s3:GetObject", "arn:aws:s3:::school-reports/term1.pdf"), ("ec2:RunInstances", "*"), ("iam:CreateUser", "*")]:
    print(action.ljust(18), decide(me, action, res))
EOF
python3 iam/test_iam.py

On a real account (needs the AWS CLI and credentials) тАФ "who am I?", the one call that needs no permission at all:

aws sts get-caller-identity

тЬЕ Verify тАФ what you should see

why prints ЁЯЪл aishwarya, no policies yet тЖТ s3:GetObject IMPLICIT DENY тАФ no policy allows it тАФ AWS denies by default. Your snippet prints the same pair three times: ('IMPLICIT DENY', 'no policy allows it тАФ AWS denies by default') for s3:GetObject, ec2:RunInstances and iam:CreateUser. The tests end with 12/12 passed. On a real account, get-caller-identity returns your UserId, Account and Arn.

ЁЯПБ What you just proved

Every request is a who / what / which question, and with no rule written down, the answer is no тАФ for every action, however harmless.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: every AWS security review starts with IAM: is the root user locked away with MFA, who can do what, and is CloudTrail on in every region? Answer those three and most "we got breached" stories never start.

тПня╕П Next

The office needs someone to issue cards to. Users, groups and root тАФ who gets an ID, and why permissions belong to the list, not the person.

git checkout lesson-02-users-groups-root
тЖР Course homeall lessonsNext тЖТusers groups root

This page is the lesson's README from the lesson-01-why-iam branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.