身分與存取管理 (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 | AllowDeny | | 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)在組織層級的權限控管。

會員專屬免費教學

本章節為註冊會員專屬的免費開放內容!請先登入或註冊會員,即可立即解鎖閱讀。

立即登入 / 註冊