AWS IAM 角色最佳实践
Amazon Web Services(AWS)作为领先的云服务提供商,提供从简单实例机器到无服务器数据集成服务的完整工具套件。虽然AWS上有数百种独立服务,但有一个服务统管全局:AWS身份和访问管理(IAM)。
根据设计,AWS是一个所有实体都需要权限才能访问和使用资源及服务的云平台。这些实体包括用户、虚拟机甚至原生AWS服务。是的,即使是内置的AWS服务也需要权限才能访问其他AWS服务。这种设计理念使IAM成为一切的核心,而IAM的主要功能——IAM角色——则定义了权限和特权。
什么是IAM角色?
IAM角色是您可以在账户中创建的具有特定权限的IAM身份。IAM角色类似于IAM用户,都是具有权限策略的AWS身份,这些策略决定了该身份在AWS中能做什么和不能做什么。但角色不与特定个人唯一关联,而是任何需要它的人都可以担任。角色没有长期凭证(控制台密码、标准访问密钥),只有通过安全令牌服务(STS)授予的短期凭证。
服务主体有多种类型可以担任IAM角色,可大致分为用户和服务两类:
- 用户角色:代表个人的实体,具有名称和相关凭证
- 服务角色:包括代表您执行操作的原生AWS服务,以及在AWS服务(如EC2和Lambda)上运行的应用程序。原生AWS服务预定义的角色称为"服务链接角色",而运行在EC2、Elastic Beanstalk或Lambda上的应用程序通常需要"自定义IAM角色"
识别与保护
1. 锁定AWS账户根用户
创建AWS账户时,您最初拥有一个对账户中所有AWS服务和资源具有完全访问权限的身份,称为AWS账户根用户。根用户凭证泄露的危害极大。
建议措施:
- 不使用根用户执行日常任务,仅用其创建IAM管理员用户
- 禁用或删除根用户的访问密钥
- 为根用户设置强密码或随机密码
- 强制执行多因素认证
2. 为所有服务主体优先使用IAM角色但限制其使用
对于用户: 推荐使用SAML 2.0角色,通过信任策略文档限制访问,仅允许符合特定SAML属性(如SAML关联)的用户,并使用aws:SourceIp条件限制源IP地址。
|
|
对于EC2实例和Lambda函数: 使用aws:SourceVpc等条件确保角色仅限于来自受信任VPC的资源。
|
|
3. 管理任务的即时访问
“即时"方法为关键权限提供临时提升访问权限。用户每次调用访问时都需要经过额外流程来识别和记录业务原因。建议通过即时系统阻止以下IAM操作:
|
|
检测
1. 检测IAM角色枚举
攻击者使用多种技术枚举AWS账户的IAM角色:
- 暴力破解sts assume-role:通过监控CloudTrail日志中连续的失败sts assume-role请求来检测
- 使用UpdateAssumeRolePolicy方法:更隐蔽的方法,仅在攻击者账户中生成CloudTrail日志
2. 检测可疑访问
- 监控IP地址:识别API调用的来源性质,特别是其声誉
- 可疑用户代理:检查用户代理头参数,如发现Kali Linux等攻击性安全操作系统则为明显红旗
- 多重登录/超人登录:检测从不同地理位置的不可行登录行为
3. 检测IAM权限提升技术
监控CloudTrail日志中的以下事件:
用户事件:
|
|
组事件:
|
|
角色事件:
|
|
策略事件:
|
|
响应与修复
自动化事件响应
及时响应是关键,自动化事件响应是实现这一目标的适当方式。推荐使用CloudBots进行以下用例:
- 删除根用户的访问密钥:使用iam_delete_access_key.py删除未经授权的访问密钥
- 撤销权限提升:使用iam_detach_policy.py分离IAM策略,或使用iam_quarantine_role.py添加显式拒绝所有
典型的自动化事件响应解决方案可以使用CloudTrail日志、CloudWatch警报、SNS和在Lambda上运行的CloudBots构建。