AWS开户时,为了"省事",管理员往往给新用户、应用程序和服务角色授予过大的权限。"先开全权限,后面再收紧"的惰性思维,最终变成了"永远不收紧"的安全隐患。本文将系统梳理AWS开户后IAM权限配置中最常见的"致命坑",并提供可落地的最小权限原则实施技巧,帮助企业从源头阻断数据泄露风险。
一、AWS开户后最容易踩的7个IAM权限配置大坑
1. 坑一:滥用AdministratorAccess托管策略
这是最致命也是最普遍的错误。AWS官方安全调查显示,超过40%的AWS账户中,至少有一个IAM用户拥有AdministratorAccess权限。这个策略允许执行任何操作,包括删除所有资源、修改所有权限、访问所有数据,甚至关闭整个AWS账户。
- 典型风险场景:
- 开发人员本地电脑被入侵,访问密钥泄露,攻击者获得AWS账户完全控制权
- 员工离职后未及时删除账户,心怀不满者恶意删除生产数据
- 第三方承包商使用管理员权限,其安全漏洞成为企业的安全短板
- 错误做法:
- 给所有开发人员分配管理员权限"方便调试"
- 给EC2实例角色附加AdministratorAccess
- 用管理员账户运行CI/CD流水线
- 根账户日常用于管理操作
2. 坑二:长期未轮换的访问密钥
AWS访问密钥(Access Key ID和Secret Access Key)是API访问AWS的凭证,相当于云账户的"密码"。但37%的AWS账户中存在使用超过90天的访问密钥,15%的密钥使用超过1年。
- 典型风险场景:
- 密钥被意外提交到GitHub等代码仓库(这是最常见的密钥泄露方式,每天有数千个AWS密钥被公开)
- 员工离职后密钥未被吊销
- 密钥在多个系统间共享,无法追踪泄露源头
- 错误做法:
- 为了"方便",一个密钥使用多年
- 将密钥硬编码在应用程序代码、配置文件或Docker镜像中
- 多个用户共享同一个访问密钥
- 从未审计过访问密钥的使用情况
3. 坑三:过度宽松的资源通配符(*)使用
在IAM策略中使用通配符 * 表示"所有",这是权限过大的重灾区。很多管理员为了简化配置,在资源字段中直接使用 * ,导致用户可以访问账户内所有同类资源。
典型风险场景:
- 本应只能访问特定S3存储桶的应用程序,却能读取所有存储桶的敏感数据
- 测试环境的用户可以修改生产环境的RDS数据库
- 运维人员可以删除所有EC2实例,包括核心生产系统
错误策略示例:
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
这个策略允许对所有S3存储桶执行所有操作,是极其危险的配置,相当于把所有数据都放在了没有锁的柜子里。
4. 坑四:缺少多因素认证(MFA)
没有启用MFA的IAM用户,其账户被攻破的风险是启用MFA用户的100倍以上。但令人震惊的是,仍有29%的AWS根账户和52%的管理员级IAM用户未启用MFA。
- 典型风险场景:
- 密码被暴力破解或钓鱼攻击窃取
- 密码在其他平台泄露后被撞库攻击
- 员工密码被社会工程学手段获取
- 错误做法:
- 根账户未启用MFA(这是AWS安全的第一大忌)
- 管理员用户未强制启用MFA
- 允许用户在不使用MFA的情况下执行敏感操作
- 使用短信MFA(易被SIM卡劫持攻击)
5. 坑五:角色信任策略配置不当
IAM角色是AWS中最安全的身份验证方式之一,但如果角色信任策略配置不当,反而会成为安全漏洞。
典型风险场景:
- 允许任何AWS账户扮演该角色
- 允许未授权的服务扮演角色
- 信任策略中包含通配符 *
错误信任策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sts:AssumeRole"
}
]
}
这个信任策略允许任何AWS账户扮演该角色,相当于把账户大门向全世界敞开。
6. 坑六:未使用最小权限原则
最小权限原则是IAM安全的核心原则,即只授予完成特定任务所需的最小权限。但在实际操作中,很多管理员倾向于"多给一点总比少给好",导致权限过度授予。
- 典型风险场景:
- 只需要读取数据的用户被授予了写入和删除权限
- 只需要访问特定服务的用户被授予了访问所有服务的权限
- 临时任务的权限被永久保留
- 错误做法:
- 给前端开发人员授予RDS数据库的完全访问权限
- 给数据分析师授予S3存储桶的删除权限
- 给CI/CD流水线授予修改IAM权限的能力
- 员工转岗后权限只增不减
7. 坑七:缺乏权限审计和监控
很多企业在配置完IAM权限后就再也不管了,缺乏定期的权限审计和实时监控。这导致权限过大的问题长期存在,直到发生数据泄露才被发现。
- 典型风险场景:
- 员工转岗后权限未及时调整,权限不断累积
- 不再使用的用户和角色未被删除
- 异常的权限使用行为未被及时发现
- 错误做法:
- 从未进行过IAM权限审计
- 未启用CloudTrail日志记录
- 没有设置针对敏感操作的告警
- 忽略AWS Security Hub的安全建议
二、避免权限过大的核心原则与实施技巧
1. 严格遵循最小权限原则:从"允许所有"到"精确允许"
最小权限原则不是一句空话,而是需要落实到每一个IAM策略中的具体实践。
实施四步法:
- 明确任务边界:先定义用户或应用程序需要完成的具体任务,而不是先授予权限再限制
- 列出所需操作:精确列出完成这些任务需要的所有AWS API操作
- 指定具体资源:将权限限制在完成任务所需的特定资源上,绝不使用 *
- 添加条件限制:通过IAM条件进一步限制权限的使用场景
策略对比示例:
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-data-prod",
"arn:aws:s3:::my-app-data-prod/*"
],
"Condition": {
"StringEquals": {
"aws:RequestedRegion": "us-east-1"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
这个策略只允许用户在us-east-1区域,并且使用MFA认证后,读取特定S3存储桶的对象和列出存储桶内容。
2. 彻底杜绝AdministratorAccess的滥用
除了极少数紧急情况,任何用户和角色都不应该被授予AdministratorAccess权限。
- 替代方案:
- 使用PowerUserAccess托管策略:这个策略允许访问除IAM之外的所有AWS服务,适合需要管理大部分资源但不需要修改权限的用户
- 创建自定义托管策略:根据不同的工作角色(开发、运维、数据分析师等)创建专门的自定义策略
- 使用IAM Access Analyzer:分析用户的实际权限使用情况,生成最小权限策略
- 建立紧急权限提升流程:对于确实需要管理员权限的紧急情况,使用AWS IAM Identity Center(SSO)的临时权限提升功能,权限有效期不超过1小时
- 最佳实践:
- 根账户只用于创建第一个IAM管理员用户,之后绝不使用
- 管理员用户也不应该拥有AdministratorAccess,而是拥有可以创建和修改IAM策略的权限
- 所有管理员操作必须启用MFA
- 建立双人审核机制,任何权限变更都需要另一个管理员审核
3. 强制实施访问密钥管理最佳实践
访问密钥是AWS安全的薄弱环节,必须严格管理。
- 核心措施:
- 优先使用IAM角色而非访问密钥:对于EC2实例、Lambda函数、ECS任务等AWS服务,始终使用IAM角色,而不是硬编码访问密钥
- 强制密钥轮换:设置访问密钥的最大使用期限为90天,超过期限自动失效
- 禁止密钥共享:每个用户和应用程序都应该有自己独立的访问密钥
- 启用密钥轮换提醒:使用AWS Config规则或第三方工具监控密钥使用时间,提前15天提醒用户轮换
- 扫描代码仓库中的密钥:使用git-secrets、AWS Secrets Manager或第三方工具扫描代码仓库,防止密钥意外提交
- 最佳实践:
- 对于必须使用访问密钥的场景,将密钥存储在AWS Secrets Manager或Parameter Store中,而不是硬编码在代码中
- 定期轮换所有访问密钥,即使没有泄露迹象
- 员工离职后立即吊销其所有访问密钥
- 启用AWS IAM Access Analyzer的密钥泄露检测功能
4. 全面强制启用多因素认证(MFA)
MFA是防止账户被攻破的最有效手段之一,必须全面强制实施。
实施步骤:
- 根账户必须启用MFA:这是AWS安全的底线,没有任何例外
- 所有管理员用户强制启用MFA:创建IAM策略,禁止未启用MFA的管理员用户执行任何操作
- 所有普通用户强制启用MFA:逐步推广到所有IAM用户
- 使用硬件MFA设备:对于高权限用户,推荐使用YubiKey等硬件MFA设备,比手机应用更安全
- 启用MFA用于API访问:对于敏感的API操作,要求必须使用MFA
强制MFA策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ListUsers",
"iam:ResyncMFADevice"
],
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
这个策略禁止未启用MFA的用户执行除了设置MFA之外的任何操作。
5. 正确配置角色信任策略
角色信任策略决定了谁可以扮演该角色,必须严格限制。
最佳实践:
- 绝不使用 "AWS": "*" :永远不要允许任何AWS账户扮演你的角色
- 指定具体的AWS账户ID:只允许信任的AWS账户扮演角色
- 指定具体的IAM用户或角色:如果可能,进一步限制到特定的IAM用户或角色
- 使用外部ID:当允许第三方账户扮演角色时,必须使用外部ID(External ID)来防止混淆代理问题
- 限制服务主体:只允许需要的AWS服务扮演角色
正确的信任策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/JohnDoe"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "my-unique-external-id-123456"
}
}
}
]
}
6. 使用IAM Access Analyzer生成最小权限策略
AWS IAM Access Analyzer是一个强大的工具,可以分析用户或角色的实际权限使用情况,自动生成最小权限策略。
- 使用方法:
- 启用IAM Access Analyzer
- 选择要分析的用户或角色
- 设置分析时间范围(建议至少7天,以覆盖所有常见操作)
- 生成最小权限策略
- 审核并应用生成的策略
- 注意事项:
- 分析时间范围越长,生成的策略越准确
- 生成的策略可能会遗漏不常执行的操作,需要人工审核
- 定期重新分析,根据权限使用情况更新策略
- 使用IAM Access Analyzer监控外部访问,及时发现资源被意外共享的情况
7. 建立完善的权限审计和监控体系
权限配置不是一劳永逸的,需要定期审计和实时监控。
- 核心措施:
- 启用CloudTrail:记录所有AWS API调用,包括IAM操作,日志至少保留1年
- 启用AWS Config:监控IAM配置的合规性,例如是否有用户拥有AdministratorAccess权限
- 定期进行IAM审计:至少每季度进行一次全面的IAM权限审计
- 设置敏感操作告警:针对创建IAM用户、修改IAM策略、删除S3存储桶等敏感操作设置CloudWatch告警
- 使用IAM Access Analyzer监控外部访问:监控是否有资源被共享给外部账户
- 季度IAM审计清单:
- 所有用户是否都启用了MFA?
- 是否有用户拥有AdministratorAccess权限?
- 所有访问密钥的使用时间是否都小于90天?
- 是否有不再使用的用户、角色和策略?
- 所有角色信任策略是否都没有使用通配符?
- 所有策略是否都遵循最小权限原则?
- 是否有资源被共享给外部账户?
三、进阶安全技巧:进一步降低数据泄露风险
1. 使用IAM Identity Center(SSO)集中管理权限
IAM Identity Center(原AWS SSO)是AWS推荐的集中式身份管理解决方案,可以极大地提高IAM安全性。
- 核心优势:
- 集中管理多个AWS账户的访问权限
- 使用临时凭证,无需管理长期访问密钥
- 支持基于属性的访问控制(ABAC)
- 集成企业身份提供商(如Azure AD、Okta)
- 提供详细的访问日志和审计报告
- 最佳实践:
- 逐步将所有IAM用户迁移到IAM Identity Center
- 使用权限集(Permission Sets)统一管理权限
- 启用临时会话,设置最短的会话持续时间(建议不超过8小时)
- 强制所有SSO用户启用MFA
- 启用会话超时,自动注销长时间不活动的用户
2. 实施基于属性的访问控制(ABAC)
基于属性的访问控制(ABAC)是一种比传统基于角色的访问控制(RBAC)更灵活、更精细的权限管理方式。它使用标签(Tag)来定义权限,可以根据资源的标签、用户的标签和请求的属性来动态决定是否允许访问。
ABAC策略示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ec2:StartInstances",
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": {
"aws:ResourceTag/Environment": "${aws:PrincipalTag/Environment}"
}
}
}
]
}
这个策略允许用户启动与自己拥有相同Environment标签的EC2实例。这样,开发人员只能启动开发环境的实例,运维人员只能启动生产环境的实例,无需为每个环境创建单独的策略。
3. 使用服务控制策略(SCP)设置账户级权限边界
服务控制策略(SCP)是AWS Organizations的一项功能,可以在组织或账户级别设置权限边界,限制账户内所有用户和角色的最大权限。
典型SCP应用场景:
- 禁止在特定区域创建资源
- 禁止使用特定的AWS服务
- 禁止修改根账户的安全设置
- 强制启用MFA
- 禁止删除CloudTrail日志
SCP示例(禁止使用特定区域):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": ["us-east-1", "us-west-2"]
}
}
}
]
}
这个SCP禁止在us-east-1和us-west-2之外的任何区域创建资源,即使是管理员用户也无法绕过。
4. 启用AWS GuardDuty进行威胁检测
AWS GuardDuty是一个托管的威胁检测服务,可以持续监控AWS账户的恶意活动和未经授权的行为。
- GuardDuty可以检测的IAM相关威胁:
- 异常的API调用模式
- 来自恶意IP地址的访问
- 泄露的访问密钥被使用
- 权限提升尝试
- 异常的角色扮演行为
- 暴力破解MFA的尝试
- 最佳实践:
- 在所有AWS账户中启用GuardDuty
- 配置GuardDuty告警,及时通知安全团队
- 定期审查GuardDuty发现的威胁
- 自动响应高优先级威胁,例如自动禁用泄露的访问密钥
AWS IAM权限配置是云安全的基石,任何疏忽都可能导致灾难性的数据泄露。企业必须摒弃"先开全权限,后面再收紧"的惰性思维,从一开始就严格遵循最小权限原则。
相关阅读:
AWS云开户邮箱收不到验证邮件?完整排查流程与替代验证方式
AWS开户实例类型选错:性能不足 / 成本过高的更换补救方案
AWS云开户后如何避免意外扣费?预算告警与资源监控设置指南
AWS云开户灾备方案设计:跨区域备份与故障切换策略
AWS云开户闲置资源识别:自动清理脚本与监控方案