executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
securing-aws-iam-permissions本技能引导从业者加固 AWS 身份和访问管理(Identity and Access Management)配置,在云账户中强制执行最小权限(Least Privilege)访问。涵盖 IAM 策略范围界定、权限边界(Permission Boundary)、Access Analyzer 集成和凭据轮换策略,以降低受损身份的影响范围。
Independent GitHub snapshot · Automated classification · Original documentation governs
不适用于:Azure AD 或 Google Cloud IAM 配置、应用层授权逻辑,或联合身份(Federated Identity)提供商设置(参见 managing-cloud-identity-with-okta)。
使用 AWS CLI 和 IAM 凭据报告生成所有 IAM 用户、角色、组和附加策略的完整清单。识别具有控制台访问、程序化访问密钥及其最近使用时间戳的账户。
# 生成 IAM 凭据报告
aws iam generate-credential-report
aws iam get-credential-report --query 'Content' --output text | base64 -d > iam-report.csv
# 列出所有 IAM 角色及其附加的策略
aws iam list-roles --query 'Roles[*].[RoleName,Arn,CreateDate]' --output table
# 查找访问密钥超过 90 天的用户
aws iam list-users --query 'Users[*].UserName' --output text | while read user; do
aws iam list-access-keys --user-name "$user" \
--query "AccessKeyMetadata[?CreateDate<='$(date -d '-90 days' +%Y-%m-%d)'].[UserName,AccessKeyId,Status,CreateDate]" \
--output table
done
在组织或账户级别激活 IAM Access Analyzer,识别外部共享的资源,并根据 CloudTrail 活动生成最小权限策略建议。
# 为账户创建 Access Analyzer
aws accessanalyzer create-analyzer \
--analyzer-name account-analyzer \
--type ACCOUNT
# 列出外部访问的活跃发现
aws accessanalyzer list-findings \
--analyzer-arn arn:aws:access-analyzer:us-east-1:123456789012:analyzer/account-analyzer \
--filter '{"status": {"eq": ["ACTIVE"]}}'
# 根据特定角色的 CloudTrail 活动生成策略
aws accessanalyzer start-policy-generation \
--policy-generation-details '{
"principalArn": "arn:aws:iam::123456789012:role/AppRole",
"cloudTrailDetails": {
"trailArn": "arn:aws:cloudtrail:us-east-1:123456789012:trail/management-trail",
"startTime": "2025-01-01T00:00:00Z",
"endTime": "2025-03-01T00:00:00Z"
}
}'
将通配符资源 ARN 替换为具体资源标识符。添加 IAM 策略条件,用于 MFA 强制执行、源 IP 限制和基于时间的访问窗口。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadSpecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::production-data-bucket",
"arn:aws:s3:::production-data-bucket/*"
],
"Condition": {
"Bool": {"aws:MultiFactorAuthPresent": "true"},
"IpAddress": {"aws:SourceIp": "10.0.0.0/8"},
"DateGreaterThan": {"aws:CurrentTime": "2025-01-01T00:00:00Z"}
}
}
]
}
为 IAM 角色和用户附加权限边界(Permission Boundary),定义实体可接收的最大权限范围,即使管理员附加了过度宽松的策略,也能防止权限提升。
# 创建权限边界策略
aws iam create-policy \
--policy-name DeveloperPermissionBoundary \
--policy-document file://developer-boundary.json
# 将边界附加到 IAM 角色
aws iam put-role-permissions-boundary \
--role-name DeveloperRole \
--permissions-boundary "arn:aws:iam::123456789012:policy/DeveloperPermissionBoundary"
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCommonServices",
"Effect": "Allow",
"Action": [
"s3:*",
"dynamodb:*",
"lambda:*",
"logs:*",
"cloudwatch:*"
],
"Resource": "*"
},
{
"Sid": "DenyIAMChanges",
"Effect": "Deny",
"Action": [
"iam:CreateUser",
"iam:DeleteUser",
"iam:CreateRole",
"iam:DeleteRole",
"iam:AttachRolePolicy",
"iam:PutRolePermissionsBoundary"
],
"Resource": "*"
}
]
}
要求所有访问 AWS 控制台和 CLI 的人工用户使用 MFA。将工作负载从 IAM 用户访问密钥迁移到通过 STS AssumeRole 获取临时凭据的 IAM 角色。
# 通过 SCP 在组织级别强制执行 MFA
aws organizations create-policy \
--name RequireMFA \
--type SERVICE_CONTROL_POLICY \
--content '{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllExceptMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ListMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {"aws:MultiFactorAuthPresent": "false"}
}
}
]
}'
# 停用未使用的访问密钥
aws iam update-access-key --user-name old-user --access-key-id AKIAEXAMPLE --status Inactive
部署 AWS Config 规则和 Security Hub 控制,持续评估 IAM 安全态势。设置 EventBridge 规则,对高风险 IAM 变更(如创建新的 Root 访问密钥或修改策略)发出告警。
# 启用 IAM 密码策略的 AWS Config 规则
aws configservice put-config-rule \
--config-rule '{
"ConfigRuleName": "iam-password-policy",
"Source": {
"Owner": "AWS",
"SourceIdentifier": "IAM_PASSWORD_POLICY"
},
"InputParameters": "{\"RequireUppercaseCharacters\":\"true\",\"RequireLowercaseCharacters\":\"true\",\"RequireSymbols\":\"true\",\"RequireNumbers\":\"true\",\"MinimumPasswordLength\":\"14\",\"MaxPasswordAge\":\"90\"}"
}'
# EventBridge 规则检测 Root 账户使用情况
aws events put-rule \
--name DetectRootUsage \
--event-pattern '{
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"userIdentity": {"type": ["Root"]}
}
}'
| 术语 | 定义 |
|---|---|
| 最小权限(Least Privilege) | 仅授予身份执行其功能所需的最低权限 |
| 权限边界(Permission Boundary) | 高级 IAM 功能,设置实体可拥有的最大权限,不受附加策略影响 |
| IAM Access Analyzer | 使用自动推理识别外部共享资源并根据 CloudTrail 活动生成最小权限策略的 AWS 服务 |
| 服务控制策略(SCP) | 在 AWS Organizations 的所有账户中设置权限护栏的组织级别策略 |
| AssumeRole | STS 操作,返回用于跨账户或服务间访问的临时安全凭据 |
| 凭据报告(Credential Report) | AWS 生成的 CSV 文件,列出所有 IAM 用户、访问密钥、MFA 状态和最近活动时间戳 |
| 策略条件(Policy Condition) | IAM 策略中限制权限适用时间和方式的约束条件,例如 MFA 要求或 IP 范围限制 |
| 联合身份(Identity Federation) | 允许外部身份提供商无需创建 IAM 用户即可授予临时 AWS 访问权限 |
场景背景:初创公司在早期开发阶段为了效率,为所有开发者角色附加了 AWS 管理的 AdministratorAccess 策略。安全审计发现 15 个角色具有完全账户访问权限,而开发者实际只使用 S3、Lambda 和 DynamoDB。
方法:
常见陷阱:未经并行测试阶段直接替换策略会导致服务中断。忘记将 Lambda:InvokeFunction 限定到特定函数 ARN 会留下横向移动路径。
场景背景:在公开 GitHub 仓库中发现一个访问密钥。该密钥属于在三个 AWS 账户中具有 S3 和 EC2 权限的 IAM 用户。
方法:
aws iam update-access-key --status Inactive 停用受损密钥常见陷阱:在停用密钥前直接删除会阻碍对哪些服务依赖它的取证分析。未检查所有三个账户的未授权活动会留下潜在后门未被发现。
IAM 安全评估报告
==============================
账户 ID: 123456789012
评估日期: 2025-02-23
分析器: IAM Access Analyzer + Prowler v4.3
严重发现:
[C-001] Root 账户有活跃访问密钥
- 资源: arn:aws:iam::123456789012:root
- 修复建议: 删除 Root 访问密钥,为 Root 启用 MFA
- CIS Benchmark: 1.4(确保不存在 Root 账户访问密钥)
[C-002] IAM 用户 'deploy-bot' 具有 AdministratorAccess 且无 MFA
- 资源: arn:aws:iam::123456789012:user/deploy-bot
- 最近活动: 2025-02-20
- 修复建议: 替换为 IAM 角色,强制 MFA 条件
高危发现:
[H-001] 3 条 IAM 策略对敏感操作使用通配符资源 "*"
- 策略: DevPolicy, CIPolicy, LegacyAdminPolicy
- 修复建议: 使用 Access Analyzer 将资源限定到特定 ARN
[H-002] 检测到 7 个超过 90 天的访问密钥
- 用户: svc-backup, svc-monitoring, dev-alice, dev-bob, ...
- 修复建议: 轮换密钥,迁移到基于角色的访问
摘要:
总发现数: 14
严重: 2 | 高危: 4 | 中危: 5 | 低危: 3
合规分数: 62%(CIS AWS Foundations Benchmark v3.0)