如何获取AWS IAM用户的最后活动时间Last ActivityTime
AWS IAM控制台「最后活动时间」字段获取方式
client.list_users()返回的PasswordLastUsed字段本身就不适合用来判断用户最后活动时间:它只会记录用户使用根密码/IAM用户密码登录控制台的时间,完全覆盖不了访问密钥调用API、联邦身份登录、角色临时凭证访问这类无密码访问场景,统计逻辑和控制台展示的「Last activity」列不一致。
IAM控制台的最后活动列,底层对接的是IAM Access Advisor的统计数据,统计范围覆盖用户所有类型的访问行为:控制台密码登录、AK/SK接口调用、联邦/角色身份的访问记录,取的是用户最近一次访问任意AWS服务的时间。
你可以通过以下两种方式拿到和控制台完全一致的数据:
方式1:调用Access Advisor官方接口(推荐)
不需要自己拉取全量CloudTrail日志做统计,直接调用IAM内置的Access Advisor接口即可,数据和控制台同源:
- 调用
generate_service_last_accessed_details接口传入目标用户ARN,生成查询任务拿到任务ID
对应boto3示例代码:import boto3 iam = boto3.client('iam') # 替换为待查询的IAM用户ARN user_arn = "arn:aws:iam::你的账号ID:user/用户名" job_resp = iam.generate_service_last_accessed_details(Arn=user_arn) job_id = job_resp['JobId'] - 轮询调用
get_service_last_accessed_details查询任务状态,直到任务完成import time while True: result = iam.get_service_last_accessed_details(JobId=job_id) if result['JobStatus'] == 'COMPLETED': break time.sleep(2) - 遍历返回的各服务访问记录,取所有
LastAuthenticated字段的最大值,就是该用户的最后活动时间,和控制台展示值完全匹配last_activity = None for svc in result['ServicesLastAccessed']: if 'LastAuthenticated' not in svc: continue svc_last_time = svc['LastAuthenticated'] if not last_activity or svc_last_time > last_activity: last_activity = svc_last_time print(last_activity)
方式2:CloudTrail日志查询(适用更长时间范围场景)
Access Advisor默认仅保留最近400天的访问记录,如果需要查询更早的活动数据,可以开启CloudTrail管理事件审计,过滤userIdentity.arn为目标用户ARN的所有事件,取eventTime字段的最大值即可,该方式可覆盖你CloudTrail日志留存周期内的全部访问行为。
注意事项
- Access Advisor的数据不是实时生成的,通常存在最多4小时的同步延迟,和控制台展示的延迟规则一致
- 做闲置用户清理、权限审计时,不要用
PasswordLastUsed作为活跃判断依据,会漏掉所有非密码方式的访问,导致误判

内容的提问来源于stack exchange,提问作者eugercek
相关产品推荐
相关产品推荐

