IAM Policy 實戰

Vibe Prompt

「幫我寫 AWS IAM Policy:允許某個服務角色只能讀取特定 S3 bucket 與寫入特定 DynamoDB 表格。」

最小權限 Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::myapp-assets/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:PutItem",
        "dynamodb:GetItem",
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789:table/Visitors"
    },
    {
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "10.0.0.0/16"
        }
      }
    }
  ]
}

常見 IAM 角色

| 角色 | 用途 | |------|------| | EC2 Role | 賦予 EC2 存取其他 AWS 服務的權限 | | Lambda Role | Lambda 函式的執行權限 | | Cross-Account Role | 跨帳號存取 | | Service-Linked Role | AWS 服務內部使用 |

Vibe Prompt

「幫我用 CDK 建立 IAM Role + Policy,並附加到 Lambda 函式。」

const role = new iam.Role(this, 'LambdaRole', {
  assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
  managedPolicies: [
    iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'),
  ],
});

table.grantReadWriteData(role);
bucket.grantRead(role);

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.PYTHON_3_11,
  handler: 'index.handler',
  code: lambda.Code.fromAsset('lambda'),
  role,
});

關鍵要點

IAM 四大最佳實踐

| 原則 | 說明 | 實作方式 | |------|------|---------| | 最小權限 | 只給需要的權限,不多給 | 使用 AWS Managed Policy 作為起點,逐步縮減 | | 使用角色而非使用者 | 避免建立長期 Access Key | EC2、Lambda 等服務使用 IAM Role | | 定期審計 | 檢查是否有過多的權限 | 使用 IAM Access Advisor 查看權限使用情況 | | 權限邊界 | 設定角色的最大權限上限 | 使用 Permissions Boundary 限制管理員 |

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"}
    }
  }]
}

| 欄位 | 說明 | |------|------| | Effect | Allow 或 Deny | | Action | 允許或拒絕的動作(可使用萬用字元 *) | | Resource | 作用的資源 ARN | | Condition | (選填)額外的限制條件,如 IP、時間、MFA |



IAM Policy:雲端安全的基礎

在 AWS 中,一切權限都是用 IAM Policy 來定義的——誰可以存取什麼資源、在什麼條件下可以存取。

Policy 的最小權限設計原則

// ❌ 過度寬鬆:任何人都可以存取任何 S3 Bucket
{
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": "*"
}

// ✅ 最小權限:只允許特定使用者讀取特定 Bucket
{
  "Effect": "Allow",
  "Action": ["s3:GetObject", "s3:ListBucket"],
  "Resource": [
    "arn:aws:s3:::my-app-assets",
    "arn:aws:s3:::my-app-assets/*"
  ],
  "Condition": {
    "IpAddress": {
      "aws:SourceIp": "10.0.0.0/8"
    }
  }
}

下一章預告:自動化安全檢查

手動寫 IAM Policy 很容易出錯。下一章的 CSPM 工具可以自動檢查你的 IAM 配置是否符合安全基準。

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!