IAM
AWS Identity and Access Management
🎯 Sebab Apa Wujud
IAM wujud sebab tanpa dia, semua orang yang ada akses akaun = root (boleh buat APA SAJA — padam DB, buka bil ribu dollar). IAM bagi kau pecahkan akses ikut "least privilege" — setiap user/app dapat HANYA apa yang dia perlu. Dan Role wujud khas untuk selesaikan masalah besar: macam mana app dalam EC2/Lambda nak akses S3 tanpa kita HARDCODE access key dalam code (yang nanti bocor masuk GitHub)? Jawapan: attach Role → app dapat temp creds auto-expire, takde rahsia tersimpan.
Apa Dia
Mengurus identiti dan akses kepada perkhidmatan dan sumber AWS dengan policies
Contoh Guna
Create IAM Role untuk EC2 boleh read S3 — attach role ke EC2, bukan hardcode credentials dalam code
IAM — komponen utama
Principal → entiti yang hantar request (User, Role, atau AWS service). Hanya Principal boleh "buat" sesuatu
User → identiti KEKAL untuk 1 orang/app. Ada credentials sendiri (password + access keys long-term)
Group → bakul untuk kumpul Users. BUKAN identity — tak boleh login, tak boleh jadi Principal. Attach policy kat sini (best practice)
Role → identiti SEMENTARA yang di-assume. Tiada long-term creds — dapat temp creds via STS yang auto-expire
Policy → JSON Allow/Deny. Identity-based (attach kat User/Group/Role) atau Resource-based (attach kat S3/SQS/KMS)
Permission Boundary → siling MAKSIMUM permission untuk satu entity (had, bukan bagi)
MFA → faktor kedua (app/hardware token) selain password
Policy evaluation — request DIBENARKAN atau DITOLAK? (decision tree)
Urutan: (1) Explicit DENY mana-mana policy → terus DENIED. (2) Guardrail (SCP/Boundary/Session) mesti BENARKAN — ini intersection, hanya boleh SEKAT. (3) Mesti ada explicit ALLOW dalam identity ATAU resource policy (union). (4) Kalau tiada allow → implicit deny. INGAT exam: explicit Deny > guardrail > explicit Allow > implicit Deny. Allow + Deny pada action sama = DENIED.
Analogi — IAM = sekuriti bangunan pejabat
User = staf tetap dengan kad akses sendiri (long-term creds). Group = jabatan — kumpul staf & bagi kebenaran pintu sekali gus (attach policy kat Group). Role = pas pelawat sementara — sesiapa boleh pinjam & auto-luput (temp creds, no hardcode). Policy = senarai pintu mana boleh buka. Permission Boundary = aras tertinggi lif dibenarkan, walau kad kata boleh ke penthouse. INGAT exam: app dalam EC2 = bagi ia "pas pelawat" (Role), JANGAN salin kad staf masuk kod (hardcode access key).
4 lapisan permission — mana PAGAR (sekat), mana PEMBERI (bagi)
Dua keluarga: PEMBERI (Identity + Resource — union, satu Allow dah cukup, dan Resource-based boleh bagi cross-account TANPA assume role) duduk DI DALAM tiga PAGAR (SCP siling account → Permission Boundary siling entity → Session policy siling sesi — intersection, SEMUA mesti benarkan, tak pernah BAGI). INGAT exam: pagar (SCP/Boundary/Session) HANYA sekat, tak boleh grant; explicit DENY tembus semua lapisan. Susunan menang: explicit Deny > pagar > explicit Allow > implicit Deny.
Cross-account: Resource-based policy ATAU Role + AssumeRole?
Dua-dua SAH untuk cross-account. Akses langsung & kemas ke satu service (S3/SQS/SNS/KMS) → Resource-based policy (ingat Dua Kunci: IAM source + resource policy destination). Perlu set permission kompleks / temp credentials / sentuh banyak service → IAM Role + AssumeRole. INGAT exam: "org luar nak read S3 / send to SQS" → resource-based policy; "assume identity & dapat temp creds merentas account" → Role + STS.
IAM User vs Group vs Role (jangan keliru)
| Aspect | IAM User | IAM Group | IAM Role |
|---|---|---|---|
| Apa dia | Identiti KEKAL untuk 1 orang/app | Bakul kumpul Users | Identiti SEMENTARA yang di-assume |
| Credentials | Password + access keys (long-term) | ❌ Tiada (bukan identity) | Temp creds via STS (auto-expire) |
| Boleh login / jadi Principal? | 🟢 Ya | ❌ Tidak | Di-assume, bukan login terus |
| Attach policy? | Boleh (tapi elak) | 🟢 Ya (cara terbaik) | 🟢 Ya |
| Guna bila | Manusia / app tetap | Urus permission ramai user sekali gus | EC2 · Lambda · cross-account · federation |
Ingat: Group BUKAN identity — tak boleh login, tak boleh jadi Principal, cuma alat urus permission. Role = tiada long-term creds, sentiasa pilihan untuk EC2/Lambda/cross-account/federation. Hardcode access key dalam EC2 = SALAH → guna Role.
Jenis Policy — mana boleh BAGI akses, mana cuma HAD
| Jenis Policy | Attach kat | Fungsi | Boleh GRANT? |
|---|---|---|---|
| Identity-based | User / Group / Role | Apa identiti ni boleh buat | 🟢 Ya |
| Resource-based | Resource (S3/SQS/KMS) | Siapa boleh akses resource ni | 🟢 Ya (+ cross-account tanpa assume role) |
| SCP (Organizations) | OU / Account | Siling maksimum untuk account | ❌ Tak — hanya SEKAT |
| Permission Boundary | User / Role | Siling maksimum untuk satu entity | ❌ Tak — hanya SEKAT |
| Session Policy | Masa AssumeRole | Sekat lagi permission sesi tu | ❌ Tak — hanya SEKAT |
Ingat: Identity & Resource policy = boleh BAGI akses (union — allow mana-mana satu cukup). SCP/Boundary/Session = guardrail, hanya boleh SEKAT (intersection — semua mesti allow). Resource-based policy boleh bagi cross-account access TANPA assume role. Explicit deny dalam mana-mana satu menang atas semua.
Cross-Account "Dua Kunci" — kedua-dua belah WAJIB allow
| Senario | Kunci 1 — Source Account | Kunci 2 — Destination / HQ | Logik |
|---|---|---|---|
| S3 cross-account | IAM policy bagi user/role s3:PutObject | S3 Bucket Policy (resource-based) sebut Principal = Source acct | 🟢 IAM AND Bucket Policy |
| SQS cross-account | IAM policy bagi sqs:SendMessage | SQS Queue Policy (resource-based) sebut Principal = Source acct | 🟢 IAM AND Queue Policy |
| KMS decrypt cross-account | IAM policy bagi kms:Decrypt | KMS Key Policy (resource-based) sebut Principal = Source acct | 🟢 IAM AND Key Policy |
| Akaun anak bawah Organizations | IAM policy dalam member account | SCP di OU/Management = siling maksimum | 🟢 IAM AND SCP (intersection) |
Ingat: Cross-account = sistem DOUBLE-CHECK: dua-dua pintu kena buka. Set satu belah je → BLOCKED. S3/SQS/KMS: IAM (source) + Resource-based policy (destination, ada Principal). Member account: IAM + SCP. Pangkah mana-mana jawapan exam yang kata "set IAM sahaja" atau "set resource policy sahaja". Resource-based policy = satu-satunya yang boleh bagi cross-account TANPA assume role.
ABAC vs RBAC — mana scale bila projek/team makin banyak
| Aspect | RBAC (role/policy-based) | ABAC (tag-based) |
|---|---|---|
| Asas keputusan | Identiti/role ada policy spesifik | Padanan TAG (aws:PrincipalTag = aws:ResourceTag) |
| Projek/team baru | Tulis policy / role BARU tiap kali | 🟢 Cuma tag — guna policy SEDIA ADA |
| Bilangan policy | Membesar ikut bilangan team (ratusan) | 🟢 Sikit & tetap (satu policy guna conditions) |
| Scale | Penat & meletup bila banyak projek | 🟢 Scale automatik |
| Guna bila | Sikit role, struktur stabil | Banyak projek/team, fast-growing, multi-tenant |
| Keyword exam | "distinct roles, small set" | "scale without new policy per project/team / tag-based" |
Ingat: RBAC = satu policy per peranan (membesar ikut bilangan team). ABAC = satu policy yang padan TAG principal dengan TAG resource — projek baru cuma perlu tag, tak perlu policy baru. Keyword "scale permissions across many projects/teams without writing a new policy each time" / "tag-based access" → ABAC. "few well-defined roles" → RBAC.
⚡ Quick Sifir — hafal ni
- ▪Explicit DENY menang atas SEMUA — Allow + Deny pada action sama = DENIED
- ▪Identity & Resource policy = boleh BAGI akses (union). SCP / Permission Boundary / Session = guardrail, hanya boleh SEKAT (intersection), tak boleh bagi
- ▪EC2/Lambda akses AWS service → IAM Role, BUKAN hardcode access keys
- ▪Group = bakul untuk Users, BUKAN identity — tak boleh login, tak boleh jadi Principal
- ▪User/Group = permanent creds. Role = temp creds (STS, auto-expire)
- ▪Default = implicit DENY. Kena ada explicit Allow baru boleh buat
- ▪Baca policy macam ayat: Principal=SIAPA · Action=NAK BUAT APA · Resource=DEKAT MANA · Effect=BOLEH/TAK · Condition=BILA
- ▪"Principal":"*" dalam resource policy = SESIAPA (anonymous/public) boleh akses — ni punca #1 S3 bucket bocor. Identity-based policy TAKDE Principal (dah tau siapa); resource-based WAJIB ada Principal
- ▪Cross-account S3/SQS/KMS = DUA kunci: IAM policy (source acct) AND resource-based policy yang ada Principal (destination acct). Satu belah je → Access Denied. Member account → IAM + SCP
💡 Exam Scenario
"App dalam EC2 perlu akses S3" → IAM Role (BUKAN hardcode access keys). "Account A akses resource Account B" → assume Role cross-account ATAU resource-based policy. "Hadkan permission MAKSIMUM developer walau admin bagi lebih" → Permissions Boundary. "Sekat semua account dalam OU dari guna region tertentu" → SCP. "Explicit Deny + Allow pada action sama" → DENIED. "User luar login Google/Facebook nak akses" → Cognito/federation (BUKAN cipta IAM user). Keywords: least privilege, temporary credentials, cross-account, explicit deny, permission boundary.
🪤 Perangkap Soalan
Q: Sebuah application berjalan dalam EC2 perlu read/write objek dalam S3 bucket. Cara PALING SELAMAT untuk bagi akses?
⚠ Umpan: Create IAM User, generate access key + secret key, simpan dalam environment variable / config file aplikasi tu. Nampak senang sebab access key memang cara biasa app authenticate.
✓ Betul: Attach IAM Role kepada EC2 instance (instance profile). Keyword "running on EC2 / running on AWS compute" → Role, BUKAN access keys. Access key dalam code/config = long-term secret yang boleh bocor; Role bagi temp creds auto-rotate.
Q: Satu SCP pada OU ada Allow untuk S3, tapi IAM policy user tu takde sebut S3 langsung. User boleh akses S3?
⚠ Umpan: Boleh — SCP dah Allow S3, jadi user dapat akses. Nampak logik sebab SCP "bagi" permission.
✓ Betul: TAK BOLEH. SCP cuma guardrail — ia SEKAT, tak pernah BAGI. User masih perlu explicit Allow dalam IAM (identity) atau resource policy. SCP Allow cuma maksud "tak disekat di peringkat OU", bukan "dibenarkan". Keyword: SCP/Boundary = had maksimum, bukan pemberi akses.
Q: Security audit jumpa satu S3 bucket policy ada "Principal": "*" dengan Effect Allow untuk s3:GetObject. Apa maksud & risiko?
⚠ Umpan: "*" tu wildcard untuk semua IAM user dalam account aku je — selamat sebab orang luar account tetap kena ada IAM creds. Nampak munasabah sebab "*" selalu maksud "semua dalam scope".
✓ Betul: BAHAYA — "Principal": "*" dalam resource-based policy = SESIAPA di internet (anonymous, tanpa login) boleh akses. Ni punca #1 S3 data leak. Keyword "Principal":"*" + public/anonymous = buang atau ganti dengan ARN spesifik + Block Public Access ON. (Nota: identity-based policy TAKDE Principal langsung — dah tahu siapa.)
Q: App dalam Account A (Dev) nak hantar mesej ke SQS queue dalam Account B (Prod). Admin dah set IAM policy dalam Account A bagi sqs:SendMessage, tapi masih "Access Denied". Kenapa?
⚠ Umpan: IAM policy dah ada kat source, patutnya cukup. Orang ingat satu belah (IAM) dah memadai sebab itu cara biasa bagi izin dalam-account.
✓ Betul: Cross-account = WAJIB DUA kunci: IAM policy (source acct) AND resource-based policy pada queue (destination acct). SQS Queue Policy belum sebut Principal Account A → ditolak. Keyword "cross-account S3/SQS/KMS" → IAM Policy + Resource-based policy serentak; set satu belah je = SALAH. (Sama logik: member account = IAM + SCP.)
Q: Syarikat ada 200+ projek, tiap projek ada team & resource sendiri (EC2, S3) yang ditag Project=X. Bila projek baru lahir, team kena akses HANYA resource projek dia. Admin penat tulis IAM policy baru tiap kali projek lahir. Cara paling scalable?
⚠ Umpan: Buat satu IAM Group + policy per projek (RBAC), tambah policy baru bila projek baru lahir. Nampak betul sebab Group memang cara urus permission. SALAH: 200 projek = 200 policy, projek ke-201 lahir → tulis policy lagi. Tak scale, meletup bila projek makin banyak.
✓ Betul: ABAC (Attribute-Based Access Control) — tag user/role dengan Project=X, tag resource dengan Project=X, tulis SATU policy guna kondisi aws:PrincipalTag/Project = aws:ResourceTag/Project. Projek baru? Cuma tag — TAK perlu policy baru. Keyword "scale permissions across many teams/projects without writing new policy each time" → ABAC, BUKAN RBAC (role/policy per kumpulan).
Q: Syarikat nak benarkan developer cipta IAM role sendiri untuk Lambda mereka (self-service), TAPI takut developer bagi role tu AdministratorAccess (privilege escalation). Macam mana benarkan create role tapi cap kuasa maksimum?
⚠ Umpan: Bagi developer kuasa iam:CreateRole je, kemudian audit manual lepas tu / harap mereka tak silap. Atau guna SCP. Nampak betul sebab "had kuasa". SALAH: tanpa cap, developer boleh attach AdministratorAccess pada role ciptaan dia → escalate. SCP pula apply ke SELURUH account, bukan cap role ciptaan developer secara spesifik.
✓ Betul: Permissions Boundary — attach managed policy sebagai boundary, dan guna IAM condition (iam:PermissionsBoundary) supaya developer WAJIB attach boundary tu pada mana-mana role dia cipta. Role ciptaan tak boleh lebih kuasa dari boundary, walau policy kata Admin. Keyword "delegate role/permission creation safely / cap max permission of created entities" → Permissions Boundary, BUKAN SCP (itu siling account), BUKAN audit manual.
Q: Kau bagi satu AWS service (cth SNS / CloudWatch / SES) satu role untuk akses bucket S3 kau. Tapi kau risau service tu "tertipu" hantar data ke / baca dari bucket pihak ketiga yang menyamar guna ARN kau. Macam mana halang silap-pegang merentas-service ni (Confused Deputy)?
⚠ Umpan: Buat role berasingan untuk tiap pemanggil, atau harap ARN je dah cukup unik. Nampak betul sebab "asingkan role". SALAH: tanpa syarat, AWS service (si deputy) boleh diperdaya guna kuasa kau bagi pihak ketiga — ARN sahaja tak buktikan SIAPA account yang betul-betul memanggil.
✓ Betul: Confused Deputy protection — dalam ROLE TRUST POLICY, tambah condition aws:SourceArn (resource spesifik yang dibenarkan trigger) dan/atau aws:SourceAccount (account ID yang dibenarkan). Service cuma boleh assume role bila request betul-betul datang dari ARN/account kau. Keyword "prevent confused deputy / cross-service impersonation / restrict which account/resource can use this role" → aws:SourceArn + aws:SourceAccount dalam trust policy.
🧠 Cara Mudah Ingat
- →IAM Principals: entity yang boleh buat request kat AWS — Users (individu), Groups (kumpulan users), atau Roles (identity sementara yang boleh di-assume)
- →Users & Groups = permanent identities — perlu credentials (password untuk console, access keys untuk CLI) untuk login. Roles = temporary identities — bagi short-lived credentials yang di-assume oleh Users/Applications, tak perlu hardcode long-term credentials
- →IAM Policy: JSON document yang define Allow/Deny untuk action tertentu pada resource tertentu — attach kat User/Group/Role
- →Multi-Factor Authentication (MFA): extra layer security — selain password, perlu code dari device (app/hardware token) untuk login
- →Account best practices: (1) JANGAN guna ROOT user untuk daily tasks — ROOT hanya untuk tasks yang memang require ROOT (billing, close account, dll). (2) Create Administrative User untuk daily admin tasks. (3) Enable MFA untuk ROOT & semua Users. (4) Add Users ke Groups, assign permissions kat Group — bukan standalone kat User
- →Identity Federation: user luar AWS (corporate AD, Google, Facebook) dapat temporary access AWS resources tanpa IAM user baru — guna SAML/OIDC/STS
- →Policy evaluation logic: (1) Bila User baru created, semua request implicitly DENIED by default (kecuali ROOT). (2) Explicit Allow dalam Identity-based atau Resource-based Policy overrides implicit Deny tu. (3) Tapi explicit Deny SENTIASA override explicit Allow — Allow + Deny dalam policy = DENIED. (4) Permission Boundary, SCP, atau Session Policy boleh override (restrict) Allow dengan implicit Deny mereka sendiri — even kalau IAM Policy bagi Allow
- →IAM Role types: (1) Service Role — role yang AWS service assume untuk buat actions on behalf of User (cth: Lambda execution role). (2) Service Role for EC2 — application dalam EC2 assume role ni untuk access resource lain (cth: S3) tanpa hardcode credentials. (3) Service-Linked Role — AWS Managed role yang predefined & linked terus ke satu service, permissions tak boleh edit oleh User. (4) Role Chaining — assume satu role, lepas tu guna credentials tu untuk assume role lain (cth: cross-account role → read-only role untuk S3)
- →Exam: "Which is NOT a feature of IAM?" → "IAM Resource" is the trick option. Resource = target YANG DIKAWAL aksesnya oleh IAM (cth: S3 bucket, EC2), bukan komponen/feature IAM itu sendiri
- →Confused Deputy: bila kau bagi satu AWS service (deputy) kuasa akses resource kau, pihak ketiga boleh perdaya service tu guna kuasa kau. Lindung dengan condition aws:SourceArn (resource spesifik) + aws:SourceAccount (account ID) dalam ROLE TRUST POLICY → service cuma assume role bila request betul-betul dari ARN/account kau. Keyword "cross-service confused deputy" → aws:SourceArn/aws:SourceAccount
- →Least-privilege tooling — Credential Report: CSV semua IAM users + status credential (password age, access key age/last-used, MFA on/tak) → audit & buang creds lapuk, satu account satu report. Access Advisor (Last Accessed): tab pada user/role/group/policy yang tunjuk service mana TERAKHIR diakses & bila → buang permission yang tak pernah dipakai. Keyword "identify unused permissions / which services has this role actually used / audit stale credentials" → Access Advisor (last accessed) + Credential Report
- →PRICING: IAM sendiri PERCUMA (users, groups, roles, policies, Credential Report, Access Advisor, MFA semua tiada caj). Bayar hanya resource AWS yang diakses. (IAM Access Analyzer External = free; Unused Access = bayar per resource.)
- →Least-privilege pattern (critical vs non-critical): critical resources → assign permission ke IAM Role, user ASSUME role on-demand bila perlu (selepas siap switch balik → kecilkan attack surface); non-critical → guna regular credentials harian. Bukan cipta user ID berasingan (kena urus banyak credential), bukan full access, bukan resource-based policy je (BUKAN semua resource support). Exam: "least privilege + critical on required basis + non-critical daily" → Role untuk critical, assume on-demand.
Guna Bila
Control who can access what AWS resources