mcpField
I
iam

iam

github.com/itsmostafa安全1.2k144 次安装2 天前更新
代码仓库

关于 iam

用于管理 AWS Identity and Access Management 的实用参考技能,帮助开发者和管理员理解策略、角色、访问故障排查及安全实践。

主要功能

  1. 01策略与主体概念
  2. 02角色和信任关系配置
  3. 03AWS CLI 命令参考
  4. 04最小权限指导
  5. 05访问错误诊断

适用场景

  1. 01创建 Lambda 服务角色
  2. 02配置跨账户角色访问
  3. 03排查 API 请求被拒

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/itsmostafa/aws-agent-skills --skill iam

安装后在 Claude Code 中输入/iam确认已加载。

附带文件best-practices.mdpolicies.md

详细介绍

AWS IAM

AWS Identity and Access Management(IAM)可对 AWS 服务和资源实施安全访问控制。IAM 是 AWS 安全的基础——每次 AWS API 调用都会通过 IAM 进行身份验证和授权。

目录

核心概念

主体

可以向 AWS 发出请求的实体:IAM 用户、角色、联合身份用户和应用程序。

策略

定义权限的 JSON 文档。类型包括:

  • 基于身份的策略:附加到用户、组或角色
  • 基于资源的策略:附加到资源(S3 存储桶、SQS 队列)
  • 权限边界:身份可以拥有的最大权限
  • 服务控制策略(SCP):适用于整个组织的限制
角色

拥有权限、可由受信任实体担任的身份。不使用永久凭证,而是使用临时安全令牌。

信任关系

定义哪些主体可以担任某个角色。通过角色的信任策略进行配置。

常见模式

为 Lambda 创建服务角色

AWS CLI:

# Create the trust policy
cat > trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "Service": "lambda.amazonaws.com" },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

# Create the role
aws iam create-role \
  --role-name MyLambdaRole \
  --assume-role-policy-document file://trust-policy.json

# Attach a managed policy
aws iam attach-role-policy \
  --role-name MyLambdaRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

boto3:

import boto3
import json

iam = boto3.client('iam')

trust_policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Service": "lambda.amazonaws.com"},
            "Action": "sts:AssumeRole"
        }
    ]
}

# Create role
iam.create_role(
    RoleName='MyLambdaRole',
    AssumeRolePolicyDocument=json.dumps(trust_policy)
)

# Attach managed policy
iam.attach_role_policy(
    RoleName='MyLambdaRole',
    PolicyArn='arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
)
创建遵循最小权限原则的自定义策略
cat > policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem",
        "dynamodb:Query"
      ],
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MyTable"
    }
  ]
}
EOF

aws iam create-policy \
  --policy-name MyDynamoDBPolicy \
  --policy-document file://policy.json
跨账户担任角色
# In Account B (trusted account), create role with trust for Account A
cat > cross-account-trust.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111111111111:root" },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": { "sts:ExternalId": "unique-external-id" }
      }
    }
  ]
}
EOF

# From Account A, assume the role
aws sts assume-role \
  --role-arn arn:aws:iam::222222222222:role/CrossAccountRole \
  --role-session-name MySession \
  --external-id unique-external-id

CLI 参考

常用命令
命令说明
aws iam create-role创建新的 IAM 角色
aws iam create-policy创建客户托管策略
aws iam attach-role-policy将托管策略附加到角色
aws iam put-role-policy向角色添加内联策略
aws iam get-role获取角色详情
aws iam list-roles列出所有角色
aws iam simulate-principal-policy测试策略权限
aws sts assume-role担任角色并获取临时凭证
aws sts get-caller-identity获取当前身份
实用标志
  • --query:使用 JMESPath 筛选输出
  • --output table:以易读格式输出
  • --no-cli-pager:在脚本中禁用分页器

最佳实践

安全
  • 切勿使用根账户执行日常任务
  • 为所有人类用户启用 MFA
  • 使用角色代替长期访问密钥
  • 遵循最小权限原则——仅授予所需权限
  • 使用条件按 IP、时间或 MFA 限制访问
  • 定期轮换凭证
  • 使用权限边界进行委托管理
策略设计
  • 从 AWS 托管策略开始,并按需自定义
  • 使用策略变量(${aws:username})创建动态策略
  • 对敏感操作优先使用显式拒绝
  • 按逻辑对相关权限进行分组
监控
  • 启用 CloudTrail 以审计 API 调用
  • 使用 IAM Access Analyzer 查找权限过宽的策略
  • 定期查看凭证报告
  • 为根账户的使用设置警报

故障排查

访问被拒绝错误

症状: AccessDeniedException 或 UnauthorizedAccess

调试步骤:

  1. 验证身份:aws sts get-caller-identity
  2. 检查已附加的策略:aws iam list-attached-role-policies --role-name MyRole
  3. 模拟该操作:
    aws iam simulate-principal-policy \
      --policy-source-arn arn:aws:iam::123456789012:role/MyRole \
      --action-names dynamodb:GetItem \
      --resource-arns arn:aws:dynamodb:us-east-1:123456789012:table/MyTable
    
  4. 检查 SCP 或权限边界中是否存在显式拒绝
  5. 确认基于资源的策略允许该主体访问
无法担任角色

症状: 调用 AssumeRole 时出现 AccessDenied

原因:

  • 信任策略未包含调用方主体
  • 调用方缺少 sts:AssumeRole 权限
  • ExternalId 不匹配(用于跨账户角色)
  • 会话时长超过上限

解决方法: 检查并更新角色的信任关系。

策略大小限制
  • 托管策略:6,144 个字符
  • 内联策略:2,048 个字符(用户),10,240 个字符(角色/组)
  • 信任策略:2,048 个字符

解决方案: 使用多个策略、通过前缀/通配符引用资源,或使用基于标签的访问控制。

References

评论

支持 Markdown