如何让EC2实例按调用者切换IAM角色,适配微服务权限需求?
基于调用者身份的IAM角色切换实现方案
针对你的需求,以下是几个可行的实现方案,核心思路是让微服务仅在验证调用者为管理员API网关时,才获取具备余额增加权限的临时IAM凭证,从根源上防止被攻陷后的越权操作:
方案一:API Gateway IAM授权 + STS临时角色切换
- 为两个API网关配置独立IAM角色:
- 用户API网关角色:仅拥有调用余额微服务的权限,无Assume其他角色的权限。
- 管理员API网关角色:拥有调用余额微服务的权限,且被允许Assume一个具备DynamoDB余额增加权限的IAM角色(下称「管理员操作角色」)。
- 配置API Gateway启用IAM身份验证,调用微服务时自动携带调用者的IAM身份信息(通过
X-Amz-Credential等请求头传递)。 - 余额微服务改造:
- 解析请求头中的调用者身份,验证是否为管理员API网关角色。
- 若为管理员调用,通过AWS STS的
AssumeRole接口获取「管理员操作角色」的临时凭证(有效期设为15分钟以内,最小化风险)。 - 用临时凭证执行DynamoDB余额增加操作;普通用户调用则使用EC2实例原有角色(仅能减少余额)执行操作。
- 关键IAM策略约束:
- EC2实例角色仅允许Assume「管理员操作角色」,且仅当请求来自管理员API网关角色时生效(通过
Condition中的aws:PrincipalArn限制)。 - 「管理员操作角色」的DynamoDB策略仅允许执行余额增加的UPDATE操作,配合DynamoDB细粒度条件(如数值比较规则)进一步限制。
- EC2实例角色仅允许Assume「管理员操作角色」,且仅当请求来自管理员API网关角色时生效(通过
示例代码(Python/boto3获取临时凭证):
import boto3 sts_client = boto3.client('sts') response = sts_client.assume_role( RoleArn='arn:aws:iam::123456789012:role/AdminBalanceRole', RoleSessionName='AdminBalanceSession', DurationSeconds=900 ) # 使用临时凭证初始化DynamoDB客户端 dynamodb = boto3.client( 'dynamodb', aws_access_key_id=response['Credentials']['AccessKeyId'], aws_secret_access_key=response['Credentials']['SecretAccessKey'], aws_session_token=response['Credentials']['SessionToken'] )
方案二:管理员网关请求签名 + 权限前置验证
- 管理员API网关对每个请求生成专属签名(比如使用AWS SigV4签名,或自定义HMAC签名),并将签名信息添加到请求头(如
X-Admin-Signature)。 - 微服务侧前置验证:
- 收到请求后先验证签名有效性,确认是管理员网关发来的合法请求。
- 验证通过后,通过STS获取「管理员操作角色」的临时凭证执行余额增加操作;验证失败则直接拒绝请求。
- 核心安全点:签名密钥仅存储在管理员API网关侧,微服务仅负责验证签名,不持有密钥,即使被攻陷也无法生成合法签名请求。
方案三:微服务端点隔离 + 独立权限控制
在同一余额微服务中新增管理员专属端点(如/admin/balance/add),并对该端点做如下限制:
- 通过API Gateway资源策略,仅允许管理员API网关的IAM角色或指定IP访问该端点。
- 微服务针对该端点单独使用「管理员操作角色」的临时凭证执行操作,普通端点仍使用原有角色。
- 该端点仅处理余额增加逻辑,同时添加操作审计日志,记录每笔管理员操作的详情。
关键安全注意事项
- 最小权限原则:所有IAM角色仅授予完成必要操作的权限,避免过度授权。
- 临时凭证有效期:设置为最短可行时间(如15分钟),降低凭证泄露风险。
- 审计溯源:开启CloudTrail日志,记录所有AssumeRole操作和DynamoDB余额变更操作,便于事后排查。
内容的提问来源于stack exchange,提问作者AnonBird
相关产品推荐
相关产品推荐

