关于 iam
用于管理 AWS Identity and Access Management 的实用参考技能,帮助开发者和管理员理解策略、角色、访问故障排查及安全实践。
主要功能
- 01策略与主体概念
- 02角色和信任关系配置
- 03AWS CLI 命令参考
- 04最小权限指导
- 05访问错误诊断
适用场景
- 01创建 Lambda 服务角色
- 02配置跨账户角色访问
- 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
调试步骤:
- 验证身份:
aws sts get-caller-identity - 检查已附加的策略:
aws iam list-attached-role-policies --role-name MyRole - 模拟该操作:
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 - 检查 SCP 或权限边界中是否存在显式拒绝
- 确认基于资源的策略允许该主体访问
无法担任角色
症状: 调用 AssumeRole 时出现 AccessDenied
原因:
- 信任策略未包含调用方主体
- 调用方缺少
sts:AssumeRole权限 - ExternalId 不匹配(用于跨账户角色)
- 会话时长超过上限
解决方法: 检查并更新角色的信任关系。
策略大小限制
- 托管策略:6,144 个字符
- 内联策略:2,048 个字符(用户),10,240 个字符(角色/组)
- 信任策略:2,048 个字符
解决方案: 使用多个策略、通过前缀/通配符引用资源,或使用基于标签的访问控制。
References
评论
支持 Markdown