如何通过boto3轮换AWS IAM用户的访问密钥和秘密访问密钥
AWS S3 单次使用即过期凭证实现方案
可实现的两种路径
- 路径1:基于STS临时凭证+内部凭证分发服务(推荐)
AWS STS服务默认支持生成最短15分钟有效期的临时访问凭证,你可以自行搭建一个内部的凭证分发服务,该服务部署在安全环境中,持有有权限调用STSAssumeRole接口的身份凭证,你在不安全网络环境中仅需要和这个内部服务交互:- 每次发起S3请求前,调用内部服务的凭证刷新接口,拿到新的临时凭证
- 使用该凭证初始化
boto3客户端完成S3操作 - 操作完成后调用内部服务的凭证作废接口,服务侧将该凭证加入黑名单,即使15分钟有效期未到也不会被二次使用
示例交互逻辑和代码如下:
import requests import boto3 # 调用内部服务拿新凭证,和你期望的curl请求逻辑一致 resp = requests.get("https://your-internal-service/refresh/token") credential = resp.json() # 响应示例:{"new_access_token":"xxxx", "new_secret_token":"yyyy", "session_token":"zzzz"} # 初始化S3客户端 s3_client = boto3.client( "s3", aws_access_key_id=credential["new_access_token"], aws_secret_access_key=credential["new_secret_token"], aws_session_token=credential.get("session_token") # STS临时凭证需要带session token ) # 执行你的S3操作 s3_client.put_object(Bucket="your-bucket", Key="test.txt", Body=b"test content") # 操作完成后调用接口作废凭证,实现立即过期 requests.post("https://your-internal-service/revoke/token", json={"access_token": credential["new_access_token"]})
- 路径2:基于IAM用户静态密钥轮换(仅适合极低请求频率场景)
IAM用户最多可同时持有2组访问密钥,你可以在安全侧维护一个IAM身份,每次需要发起S3请求时生成新的静态密钥,请求完成后立刻删除该密钥,即可实现使用后立即过期的效果。但该方案存在IAM接口调用频率限制,且高并发下会触发超过2组密钥的报错,仅适合单线程低频次的使用场景,示例代码如下:
import boto3 # 该IAM客户端部署在安全侧,不要暴露到不安全网络 iam_client = boto3.client("iam") # 生成新的访问密钥 new_key = iam_client.create_access_key(UserName="your-s3-iam-user")["AccessKey"] # 用新密钥初始化S3客户端 s3_client = boto3.client( "s3", aws_access_key_id=new_key["AccessKeyId"], aws_secret_access_key=new_key["SecretAccessKey"] ) # 执行S3操作 s3_client.get_object(Bucket="your-bucket", Key="test.txt") # 操作完成后立即删除密钥,实现立即过期 iam_client.delete_access_key( UserName="your-s3-iam-user", AccessKeyId=new_key["AccessKeyId"] )
注意:如果你的请求频率较高,不要使用第二种方案,IAM接口的限流阈值很低,频繁创建删除密钥会导致请求失败。
内容的提问来源于stack exchange,提问作者User12
相关产品推荐
相关产品推荐

