身分與存取管理 (IAM)
🔥 Vibe Prompt
"為一個 SaaS 平台設計 RBAC 系統,包含 admin、editor、viewer 三種角色。用 AWS IAM 實作。"
IAM 核心概念
| 元件 | 說明 | 比喻 | |:----:|------|------| | User | 代表一個人或服務帳號 | 員工證 | | Group | 使用者的集合 | 部門 | | Role | 一組權限,可被 Assume | 臨時通行證 | | Policy | 定義權限的 JSON 文件 | 權限說明書 |
Policy 結構
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": {"aws:SourceIp": "192.168.1.0/24"}
}
}]
}
| Policy 欄位 | 說明 |
|:---------:|------|
| Effect | Allow 或 Deny |
| Action | 允許或拒絕的動作(可用 * 萬用字元) |
| Resource | 作用的資源 ARN |
| Condition | (選填)額外條件:IP、時間、MFA 等 |
RBAC 模型
Users → Groups → Roles → Permissions
範例:
- Alice → 工程組 → 開發者角色 → EC2, ECR 存取
- Bob → 財務組 → 財務角色 → S3 帳單 Bucket 唯讀
- Eve → 管理組 → 管理員角色 → 完整存取
IAM 最佳實踐
| 原則 | 說明 | |:----:|------| | 最小權限 | 只給完成工作所需的最小權限 | | 使用角色代替金鑰 | EC2 等服務使用 IAM Role,不要建立長期 Access Key | | 定期審計 | 使用 IAM Access Advisor 檢查未使用的權限 | | 權限邊界 | 設定 Role 的最大權限上限 | | 啟用 MFA | 所有使用者強制啟用多因子認證 |
AWS IAM 實作
# 建立群組
resource "aws_iam_group" "developers" {
name = "developers"
}
resource "aws_iam_group" "admins" {
name = "admins"
}
# 建立政策
resource "aws_iam_group_policy" "developers" {
name = "developer-policy"
group = aws_iam_group.developers.name
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = ["ec2:Describe*", "s3:ListBucket"]
Resource = "*"
},
{
Effect = "Deny"
Action = ["iam:*", "organizations:*"]
Resource = "*"
}
]
})
}
resource "aws_iam_user" "alice" {
name = "alice"
groups = [aws_iam_group.developers.name]
}
權限邊界 (Permission Boundary)
權限邊界設定使用者的最大權限上限,即使附加了管理員政策也無法超越:
resource "aws_iam_policy" "dev_boundary" {
name = "developer-boundary"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["ec2:*", "s3:*", "rds:*", "cloudwatch:*"]
Resource = "*"
}, {
Effect = "Deny"
Action = ["iam:*", "organizations:*", "account:*"]
Resource = "*"
}]
})
}
resource "aws_iam_user" "dev_user" {
name = "dev-user"
permissions_boundary = aws_iam_policy.dev_boundary.arn
}
IAM 常見錯誤
| 錯誤 | 後果 | 解決方案 |
|:----:|:----:|---------|
| 使用 root 帳號進行日常操作 | 無法審計、無法限制權限 | 建立管理員使用者並啟用 MFA |
| 政策過於寬鬆 (Action: "*") | 權限過大,違反最小權限 | 明確列出需要的 Action |
| 未啟用 MFA | 密碼外洩時帳號被盜 | 強制所有使用者啟用 MFA |
| Access Key 寫死在程式碼 | 金鑰外洩到 GitHub | 使用 IAM Role 或 Secrets Manager |
| 長期未使用的金鑰未清理 | 增加攻擊面 | 定期使用 IAM Access Advisor 審計 |
關鍵要點
- ✅ IAM 是 AWS 安全的核心——所有權限控制都從這裡開始
- ✅ Policy = JSON 文件,以 Effect + Action + Resource 組成
- ✅ 最小權限原則:只給需要的權限,不多給
- ✅ 使用 IAM Role 而非長期 Access Key
- ✅ 權限邊界 (Permission Boundary) 設定最大權限上限
- ✅ 強制啟用 MFA,特別是管理員帳號
Users → Groups → Roles → Permissions
Example:
- Alice → Engineering Group → Developer Role → EC2, ECR access
- Bob → Finance Group → Finance Role → S3 billing bucket read
- Eve → Admin Group → Admin Role → Full access
AWS IAM
# Groups
resource "aws_iam_group" "developers" { name = "developers" }
resource "aws_iam_group" "admins" { name = "admins" }
# Policies
resource "aws_iam_group_policy" "developers" {
name = "developer-policy"
group = aws_iam_group.developers.name
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = ["ec2:Describe*", "ecr:GetDownloadUrlForLayer", "s3:ListBucket"]
Resource = "*"
},
{
Effect = "Deny"
Action = ["iam:*", "organizations:*"]
Resource = "*"
}
]
})
}
# Users
resource "aws_iam_user" "alice" {
name = "alice"
groups = [aws_iam_group.developers.name]
}
Permission Boundaries
# User can't exceed boundary permissions
resource "aws_iam_policy" "boundary" {
name = "developer-boundary"
policy = jsonencode({
Statement = [{
Effect = "Allow"
Action = ["ec2:*", "s3:*", "ecr:*"]
Resource = "*"
}, {
Effect = "Deny"
Action = ["iam:*", "organizations:*", "account:*"]
Resource = "*"
}]
})
}
IAM Best Practices
| Practice | Why | |----------|-----| | Least privilege | Minimize blast radius | | Use groups | Manage by role, not individual | | Permission boundaries | Limit max permissions | | Access keys rotation | 90 days max | | MFA for all | Prevent credential theft | | No root user keys | Root = break glass only | | Audit with IAM Access Analyzer | Find unused permissions |
IAM vs SSO
IAM: AWS-native users, good for small teams
SSO (Identity Center): Centralized across AWS accounts, OKTA, Azure AD
→ Use SSO for >10 users
Conditions for Extra Security
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24" # Only from office IP
},
"Bool": {
"aws:MultiFactorAuthPresent": "true" # MFA required
}
}
IAM 是一切的起點
如果你問一個 AWS 資深架構師:「學習 AWS 安全的第一步是什麼?」答案永遠是 IAM。
IAM 之所以重要,是因為權限控制是雲端安全的基礎。你的 S3 Bucket 設定得再安全、Firewall 規則再嚴格,如果 IAM 政策寫了一個 "Effect": "Allow", "Action": "*", "Resource": "*",那一切防護都是白費。
IAM 設計的核心原則
| 原則 | 說明 | 違反的後果 | |:----|:----|:---------| | 最小權限 | 只給完成工作所需的最小權限 | 駭客拿到一個開發者帳號就能刪除整個資料庫 | | 權限邊界 | 設定角色能擁有的最大權限上限 | 開發者自己開了管理員權限 | | 定期審計 | 每季檢查未使用的權限和角色 | 累積了大量幽靈權限 | | 臨時憑證 | 使用 IAM Role 而非長期 Access Key | Access Key 外洩到 GitHub | | MFA | 強制啟用多因子認證 | 密碼被猜到後帳號直接淪陷 |
IAM vs 其他身分管理方案
| 方案 | 適合場景 | 不適合 | |:----|:--------|:------| | IAM User | 小型團隊(<10人)、服務帳號 | 大型組織,無法整合公司 AD | | IAM Role | EC2/Lambda 等 AWS 服務、跨帳號存取 | 人類使用者登入(不直覺) | | SSO / Identity Center | 大型組織、整合 OKTA/Google Workspace | 單一帳號的小專案 | | Cognito | 應用程式的使用者認證 | AWS 基礎設施權限管理 |
下一章預告:IAM 進階——角色與政策
這一章建立了 IAM 的基礎概念——使用者、群組、政策、權限邊界。下一章將深入探討 IAM 角色(Role)的 assume role 機制、跨帳號存取、以及 Service Control Policy(SCP)在組織層級的權限控管。