# Implementing AWS Iam Permission Boundaries

> 在 AWS 中配置 IAM 权限边界，使安全团队能够安全地委托开发者创建角色，同时强制执行最大权限限制。

- Skill: `killvxk/implementing-aws-iam-permission-boundaries` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/implementing-aws-iam-permission-boundaries`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/implementing-aws-iam-permission-boundaries/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/implementing-aws-iam-permission-boundaries

---


# 实施 AWS IAM 权限边界

## 概述

IAM 权限边界（Permission Boundaries）是 AWS 的高级功能，用于设置基于身份的策略可以向 IAM 实体（用户或角色）授予的最大权限。它们使集中式安全团队能够安全地将 IAM 角色和策略创建委托给应用开发者，而不会有权限提升的风险。实体的有效权限是其基于身份的策略与权限边界的交集——即使身份策略授予了 `AdministratorAccess`，权限边界也会将其限制为仅允许的操作。

## 前置条件

- 具有 IAM 管理员访问权限的 AWS 账户
- 了解 AWS IAM 策略语言（JSON）
- 配置了适当凭据的 AWS CLI v2
- 用于基础设施即代码部署的 Terraform 或 CloudFormation

## 核心概念

### 权限边界的工作原理

```
基于身份的策略              权限边界
（角色能做什么）      ∩    （角色可以做什么）
        │                              │
        └──────────┬───────────────────┘
                   │
          有效权限
    （仅两个策略都允许的操作）
```

### 策略评估逻辑

AWS 按以下顺序评估权限：
1. **显式拒绝** — 在任何策略中始终优先
2. **Organizations SCP** — 设置组织范围的最大权限
3. **权限边界** — 设置实体级别的最大权限
4. **基于身份的策略** — 授予实际权限
5. **基于资源的策略** — 跨账户访问（单独评估）

实体只有在所有适用的策略类型都允许时才能执行操作。

### 主要使用场景

| 使用场景 | 描述 |
|----------|-------------|
| 开发者委托 | 允许开发者创建 IAM 角色，但不能超出其边界范围 |
| 沙箱隔离 | 限制沙箱/开发账户中角色的操作范围 |
| 多租户工作负载 | 确保特定于租户的角色无法访问其他租户的资源 |
| CI/CD 流水线角色 | 将自动化角色限制在特定服务 |

## 实施步骤

### 步骤 1：定义权限边界策略

创建一个定义最大允许权限的托管策略：

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowedServices",
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "dynamodb:*",
                "lambda:*",
                "logs:*",
                "cloudwatch:*",
                "sqs:*",
                "sns:*",
                "events:*",
                "states:*",
                "xray:*",
                "ec2:Describe*",
                "ec2:CreateTags",
                "sts:AssumeRole",
                "kms:Decrypt",
                "kms:GenerateDataKey",
                "kms:DescribeKey",
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowIAMPassRole",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/app-*",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": [
                        "lambda.amazonaws.com",
                        "states.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Sid": "DenyBoundaryDeletion",
            "Effect": "Deny",
            "Action": [
                "iam:DeletePolicy",
                "iam:DeletePolicyVersion",
                "iam:CreatePolicyVersion"
            ],
            "Resource": "arn:aws:iam::*:policy/DeveloperBoundary"
        },
        {
            "Sid": "DenyBoundaryRemoval",
            "Effect": "Deny",
            "Action": [
                "iam:DeleteUserPermissionsBoundary",
                "iam:DeleteRolePermissionsBoundary"
            ],
            "Resource": "*"
        }
    ]
}
```

### 步骤 2：创建开发者委托策略

授予开发者创建 IAM 角色的能力，但必须附加边界：

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCreateRoleWithBoundary",
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy"
            ],
            "Resource": "arn:aws:iam::*:role/app-*",
            "Condition": {
                "StringEquals": {
                    "iam:PermissionsBoundary": "arn:aws:iam::*:policy/DeveloperBoundary"
                }
            }
        },
        {
            "Sid": "AllowCreatePolicyScoped",
            "Effect": "Allow",
            "Action": [
                "iam:CreatePolicy",
                "iam:DeletePolicy",
                "iam:CreatePolicyVersion",
                "iam:DeletePolicyVersion"
            ],
            "Resource": "arn:aws:iam::*:policy/app-*"
        },
        {
            "Sid": "AllowViewIAM",
            "Effect": "Allow",
            "Action": [
                "iam:Get*",
                "iam:List*"
            ],
            "Resource": "*"
        }
    ]
}
```

### 步骤 3：附加边界

```bash
# 创建边界策略
aws iam create-policy \
    --policy-name DeveloperBoundary \
    --policy-document file://developer-boundary.json

# 将边界附加到现有角色
aws iam put-role-permissions-boundary \
    --role-name developer-role \
    --permissions-boundary arn:aws:iam::123456789012:policy/DeveloperBoundary

# 创建带边界的新角色
aws iam create-role \
    --role-name app-lambda-executor \
    --assume-role-policy-document file://trust-policy.json \
    --permissions-boundary arn:aws:iam::123456789012:policy/DeveloperBoundary
```

### 步骤 4：防止权限提升

边界必须包含拒绝语句，防止开发者：
- 从自己的角色中移除边界
- 修改边界策略本身
- 创建未附加边界的角色
- 访问 IAM 服务进行权限提升

### 步骤 5：使用 Terraform 部署

```hcl
resource "aws_iam_policy" "developer_boundary" {
  name   = "DeveloperBoundary"
  path   = "/"
  policy = file("${path.module}/policies/developer-boundary.json")
}

resource "aws_iam_role" "app_role" {
  name                 = "app-lambda-executor"
  assume_role_policy   = data.aws_iam_policy_document.lambda_trust.json
  permissions_boundary = aws_iam_policy.developer_boundary.arn
}
```

## 验证清单

- [ ] 权限边界策略已创建并经安全团队审查
- [ ] 边界包含防止自我修改的拒绝语句
- [ ] 开发者委托策略要求所有新角色附加边界
- [ ] 强制执行角色命名约定（如 `app-*` 前缀）
- [ ] 开发者测试了有/无边界时的角色创建（无边界时应失败）
- [ ] 已测试并阻止权限提升路径
- [ ] 已为 IAM API 调用启用 CloudTrail 日志
- [ ] 边界策略已在源代码控制中进行版本管理
- [ ] 自动化测试验证边界有效性
- [ ] 已向开发团队提供文档

## 参考资料

- [AWS IAM 权限边界文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)
- [何时何处使用权限边界 - AWS 安全博客](https://aws.amazon.com/blogs/security/when-and-where-to-use-iam-permissions-boundaries/)
- [AWS 权限边界示例 - GitHub](https://github.com/aws-samples/example-permissions-boundary)
- [AWS 规范指南 - 创建权限边界](https://docs.aws.amazon.com/prescriptive-guidance/latest/transitioning-to-multiple-aws-accounts/creating-a-permissions-boundary.html)

