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 配置是否符合安全基準。