IAM 是 Identity and Access Management 的縮寫,中文通常翻譯為「身分與存取管理」。
之所以叫 IAM,是因為它主要處理兩個問題:
| 核心概念 | 英文 | 中文 | 要回答的問題 |
|---|---|---|---|
| 👤 Identity | Identity Management | 身分管理 | 你是誰? |
| 🔑 Access | Access Management | 存取管理 | 你可以做什麼? |
IAM 管理的是:
誰可以對哪些 AWS 資源執行哪些操作。
IAM 底下有四個核心概念:User、Group、Role、Policy,分別代表「身分」、「身分集合」、「可被暫時取得的身分」與「權限規則」。
| 概念 | 定義 | 主要用途 |
|---|---|---|
| 👤 User | AWS 帳號內的長期身分 | 代表特定使用者或需要長期憑證的應用程式 |
| 👥 Group | 多個 IAM User 的集合 | 批次管理多位使用者的權限 |
| 🪪 Role | 可被暫時取得的 IAM 身分 | 服務授權、臨時授權及跨帳號存取 |
| 📜 Policy | 描述允許或拒絕操作的規則 | 定義身分或資源具有哪些權限 |
IAM User 是在 AWS 帳號中建立的長期身分,通常代表一位特定使用者,或需要長期憑證的應用程式。
IAM User 可以擁有:
⚠️ 安全提醒
IAM User 的密碼及 Access Key 不會自動失效,因此不應共用帳號,也應避免替應用程式建立 IAM User,再把 Access Key 寫死在程式或設定檔中。
IAM Group 是一組 IAM User 的集合,用來統一管理多位使用者的權限。
例如,可以建立一個 Developers Group,將開發人員加入其中,再把需要的 Policy 附加到這個 Group。之後新增或移除成員時,就不必逐一修改每位 User 的 Policy。
Principal
💡 核心用途
Group 不是一種可以登入或操作 AWS 的身分,而是用來集中管理多個 User 權限的工具。
IAM Role 是一種可以被符合信任條件的使用者、應用程式或 AWS 服務暫時取得的 IAM 身分。
Role 本身沒有密碼,也沒有長期 Access Key。當使用者或服務取得 Role 時,AWS 會提供一組有期限的臨時憑證。
一個 Role 通常需要同時處理兩件事:
| Policy 類型 | 要回答的問題 |
|---|---|
| 🤝 Trust Policy | 誰可以取得這個 Role? |
| 🔐 Permissions Policy | 取得 Role 之後可以做什麼? |
使用者提出 AssumeRole 請求
↓
AWS 檢查 Role 的信任政策及使用者權限
↓
AWS STS 發出臨時憑證
Access Key ID+Secret Access Key+Session Token
↓
使用者以 Role 的權限存取資源
↓
憑證到期後自動失效
臨時憑證包含:
Access Key ID
Secret Access Key
Session Token
與 IAM User 的長期 Access Key 相比,臨時憑證的風險較低。即使臨時憑證外洩,攻擊者通常也只能在憑證有效期間內使用;長期 Access Key 則會持續有效,直到被停用或刪除。
⚠️ 注意
臨時憑證不代表絕對安全。Role 仍然必須搭配適當的 Trust Policy、最小權限與 CloudTrail 稽核紀錄。
IAM Policy 是以 JSON 格式撰寫的權限規則,用來定義某個身分或資源可以或不可以執行哪些 AWS 操作。
一條 Policy Statement 通常可能包含:
| 元素 | 用途 |
|---|---|
Effect |
設定規則為允許 Allow 或拒絕 Deny |
Action |
指定允許或拒絕執行的操作 |
Resource |
指定規則適用的 AWS 資源 |
Condition |
指定規則生效的附加條件,非必填 |
Principal |
指定規則適用的身分,主要出現在資源型 Policy |
Policy 的使用方式主要分成兩類:
預設拒絕
↓
明確 Allow 才能通過
↓
只要出現明確 Deny,仍然拒絕
比起硬記四個名詞,遇到情境時更重要的是先判斷:
最小權限原則是指:
只授予完成工作所必須的操作、資源範圍與使用期限,不提供額外權限。
新進工程師只需要查看某一份報表資料,不需要修改或刪除任何內容。
這時候要決定的不是給不給權限,而是:
依照最小權限原則,應該只提供:
也就是只給完成工作需要的那一小部分權限,其他操作一律不允許。
| 概念 | 一句話記憶 |
|---|---|
| 👤 User | AWS 帳號中的長期身分 |
| 👥 Group | 統一管理多個 IAM User 的權限 |
| 🪪 Role | 沒有長期憑證、可被暫時取得的 IAM 身分 |
| 📜 Policy | 定義允許或拒絕哪些操作 |
| 🛡️ 最小權限 | 只提供完成工作所需的最小權限 |
設定權限前,先確認四個問題:
確認這四件事之後,接著再判斷應該使用 User、Group 還是 Role,並設計適當的 Policy。
一間公司要求,所有跨帳號的存取都要能在事後稽核「是誰、在什麼時候,取得了哪些權限」,而且權限不能永久有效。以下哪一種做法最符合這個要求?
AssumeRole 取得有期限的臨時憑證一個執行在 EC2 上的應用程式,需要讀取某個 S3 bucket 中的物件,建議的授權方式是什麼?
以下哪一個元素不是 IAM Policy 中 Statement 的一部分?
Effect
Action
Resource
Version
新進同事只需要瀏覽某個 S3 路徑中的報表。依照最小權限原則,應該如何授權?
AdministratorAccess,避免之後還要再次申請一位新加入的維運人員,每天只需要檢查多個服務的 CloudWatch 告警並回報,不需要修改任何資源設定。團隊為了方便,直接請他共用另一位資深工程師既有的 IAM User 帳號。這個做法主要違反了什麼原則?
Role 搭配 AssumeRole 會產生有期限的臨時憑證,並能透過 CloudTrail 追蹤 Role 的使用紀錄。
IAM User 的 Access Key 屬於長期憑證,不符合「權限不能永久有效」的要求;共用 root 憑證更是嚴重違反 AWS 安全實務。
AWS 服務需要存取其他 AWS 資源時,應優先使用 Role。
將 Access Key 寫死在程式或設定檔中,會增加長期憑證外洩的風險。使用 EC2 Role,則可以讓應用程式自動取得及更新臨時憑證。
Version 是 Policy 文件的頂層欄位,不是 Statement 裡面的元素。
Effect、Action、Resource 都可以出現在 Statement 中;Principal 則主要出現在資源型 Policy 的 Statement 中。
依照最小權限原則,只能提供完成工作所需的最小權限。
這名同事只需要查看特定 S3 路徑中的報表,因此只需要該範圍的讀取權限,不需要完整的 S3 權限。
這個做法同時產生兩個問題:
MFA 解決的是登入驗證問題,不能解決共用帳號造成的操作歸屬及權限過大問題。