如何使用boto3审计多AWS账户的IAM用户及关联访问密钥
AWS多账户IAM访问密钥巡检脚本实现方案
核心实现思路
- 提前在
~/.aws/credentials中配置好所有需要巡检的AWS账户对应的profile,每个profile对应一个账户的访问凭证 - 脚本通过遍历指定的profile列表,逐个切换账户调用IAM接口拉取数据
- 拉取到的用户、密钥、最后使用时间数据直接写入CSV文件,避免终端输出混乱
完整可运行Python脚本
import boto3 import csv from datetime import datetime # 替换为你本地配置的AWS profile名称列表 PROFILES = ["prod-account", "test-account", "dev-account"] OUTPUT_CSV_PATH = "iam_access_keys_report.csv" def main(): with open(OUTPUT_CSV_PATH, mode='w', newline='', encoding='utf-8') as csv_file: csv_writer = csv.writer(csv_file) # 写入CSV表头 csv_writer.writerow(["所属账户", "IAM用户名", "访问密钥ID", "密钥状态", "密钥创建时间", "最后使用时间", "最后使用区域"]) for profile_name in PROFILES: try: # 切换对应账户的profile创建客户端 session = boto3.Session(profile_name=profile_name) iam_client = session.client('iam') # 拉取当前账户所有IAM用户 all_users = iam_client.list_users()['Users'] for user in all_users: user_name = user['UserName'] # 拉取对应用户的所有访问密钥 access_keys = iam_client.list_access_keys(UserName=user_name)['AccessKeyMetadata'] for key in access_keys: key_id = key['AccessKeyId'] key_status = key['Status'] create_time = key['CreateDate'].strftime('%Y-%m-%d %H:%M:%S') # 查询密钥最后使用信息 last_used_data = iam_client.get_access_key_last_used(AccessKeyId=key_id)['AccessKeyLastUsed'] if 'LastUsedDate' in last_used_data: last_used_time = last_used_data['LastUsedDate'].strftime('%Y-%m-%d %H:%M:%S') last_used_region = last_used_data['Region'] else: last_used_time = "从未使用" last_used_region = "-" # 写入单条数据到CSV csv_writer.writerow([profile_name, user_name, key_id, key_status, create_time, last_used_time, last_used_region]) print(f"账户 {profile_name} 数据拉取完成") except Exception as e: print(f"处理账户 {profile_name} 失败: {str(e)}") continue if __name__ == "__main__": main()
使用方法
- 先安装依赖库:
pip install boto3 - 把脚本里的
PROFILES列表替换成你本地~/.aws/credentials中实际配置的profile名称 - 运行脚本:
python3 iam_key_report.py - 运行结束后同目录下会生成
iam_access_keys_report.csv文件
注意事项
- 每个profile对应的IAM凭证需要有
iam:ListUsers、iam:ListAccessKeys、iam:GetAccessKeyLastUsed权限 - 密钥如果从未使用过,最后使用时间字段会显示
从未使用 - 如果不需要扫描某个账户,直接从
PROFILES列表中删除对应profile名称即可
内容的提问来源于stack exchange,提问作者S D
相关产品推荐
相关产品推荐

