如何在AWS中查询IAM用户访问密钥数量及密钥禁用日期
问题原因
你当前使用的list_access_keys接口返回字段仅包含访问密钥ID、密钥状态(Active/Inactive)、创建日期、关联用户名,本身不返回密钥禁用日期;同时现有代码仅直接打印接口全量返回值,没有做密钥数量统计、状态筛选的逻辑,自然拿不到目标结果。
注意:IAM服务本身不会持久化存储访问密钥的禁用时间戳,该类操作审计数据需要从CloudTrail记录的IAM操作日志中获取,未开启CloudTrail的场景无法回溯历史禁用的准确时间。
可直接运行的实现代码
import boto3 from datetime import datetime iam = boto3.client('iam') cloudtrail = boto3.client('cloudtrail') # 用分页器获取所有IAM用户,避免单页100条上限导致结果截断 user_paginator = iam.get_paginator('list_users') for user_page in user_paginator.paginate(): for user in user_page['Users']: username = user['UserName'] print(f"\n===== 核查用户: {username} =====") # 获取该用户名下所有访问密钥 key_paginator = iam.get_paginator('list_access_keys') access_keys = [] for key_page in key_paginator.paginate(UserName=username): access_keys.extend(key_page['AccessKeyMetadata']) # 统计密钥数量 key_count = len(access_keys) print(f"当前用户配置的访问密钥总数: {key_count}") if key_count == 2: print("* 该用户已配置2个访问密钥,符合核查标记条件") # 遍历密钥检查状态 for key in access_keys: key_id = key['AccessKeyId'] status = key['Status'] create_date = key['CreateDate'].strftime("%Y-%m-%d %H:%M:%S UTC") print(f"\n密钥ID: {key_id}") print(f"密钥状态: {status}") print(f"创建时间: {create_date}") # 获取密钥最后使用信息 last_used_info = iam.get_access_key_last_used(AccessKeyId=key_id) if 'LastUsedDate' in last_used_info['AccessKeyLastUsed']: last_used = last_used_info['AccessKeyLastUsed']['LastUsedDate'].strftime("%Y-%m-%d %H:%M:%S UTC") print(f"最后使用时间: {last_used}") else: print("最后使用时间: 密钥从未被使用过") # 已禁用密钥查询CloudTrail获取禁用时间 if status == 'Inactive': events = cloudtrail.lookup_events( LookupAttributes=[ { 'AttributeKey': 'EventName', 'AttributeValue': 'DeactivateAccessKey' }, ], StartTime=datetime(2024,1,1), # 可根据核查需求调整查询起始时间 EndTime=datetime.utcnow() ) deactivate_time = None for event in events['Events']: # 匹配对应密钥ID的禁用事件 if key_id in event['CloudTrailEvent']: deactivate_time = event['EventTime'].strftime("%Y-%m-%d %H:%M:%S UTC") break if deactivate_time: print(f"* 密钥禁用时间: {deactivate_time}") else: print("* 未查询到该密钥的禁用操作记录(可能CloudTrail未覆盖对应时段,或密钥禁用时间超出日志留存周期)")
关键说明
- 代码使用boto3内置分页器处理接口返回分页,避免单页返回上限导致的用户、密钥遗漏
- 对每个用户自动统计名下访问密钥总数,标记出配置了2个密钥的用户
- 对状态为
Inactive的已禁用密钥,会自动检索CloudTrail中的DeactivateAccessKey事件,匹配对应密钥ID后返回准确禁用时间 - 代码同时返回密钥的创建时间、最后使用时间作为辅助核查信息
- 运行代码的身份需要提前配置以下权限:
iam:ListUsers、iam:ListAccessKeys、iam:GetAccessKeyLastUsed、cloudtrail:LookupEvents - CloudTrail默认事件留存周期为90天,超出留存周期的操作事件无法被检索到
内容的提问来源于stack exchange,提问作者Alex Pătroi
相关产品推荐
相关产品推荐

