使用AWS Lambda生成IAM报告时last_login与password_age字段为空的原因
IAM用户报告中last_login和password_age字段为空的原因分析
核心原因拆解
1. get_login_profile API的局限性
你通过client.get_login_profile(UserName=username).get('PasswordLastUsed')获取登录时间,这个API有两个关键限制:
- 仅对设置了控制台登录密码的用户生效:如果IAM用户没有创建登录配置(无法通过控制台登录),调用该API会抛出
NoSuchEntityException。你说代码能正常运行,说明涉及的用户都有登录配置,但另一个问题是: PasswordLastUsed仅记录控制台登录或使用密码调用API的时间:如果用户仅通过Access Key进行API操作,这个字段不会更新,始终为空。
2. 用户从未登录过
如果IAM用户刚创建且设置了密码,但从未通过控制台/密码登录过,PasswordLastUsed字段不会存在,.get('PasswordLastUsed')会返回None,导致last_login为空,进而依赖它计算的password_age也变为None,最终在Excel中显示为空。
3. IAM数据更新延迟
IAM的PasswordLastUsed字段存在最长24小时的更新延迟,即使用户刚完成登录,也可能需要一段时间才能在API中查询到该值,导致临时为空。
代码修复建议
你的代码未处理get_login_profile的异常,若遇到无登录配置的用户,Lambda会直接报错终止,建议添加异常捕获:
try: login_profile = client.get_login_profile(UserName=username) last_login = login_profile.get('PasswordLastUsed') except client.exceptions.NoSuchEntityException: last_login = None
补充:获取全场景登录时间的方案
如果需要覆盖Access Key登录的情况,可通过CloudTrail查询用户所有登录事件,示例代码片段:
cloudtrail = boto3.client('cloudtrail') response = cloudtrail.lookup_events( LookupAttributes=[ {'AttributeKey': 'Username', 'AttributeValue': username}, {'AttributeKey': 'EventName', 'AttributeValue': 'ConsoleLogin'} ], MaxResults=1, SortOrder='Descending' ) if response['Events']: last_login = pd.Timestamp(response['Events'][0]['EventTime']) else: last_login = None
注意:使用该方案需要Lambda角色具备cloudtrail:LookupEvents权限,且目标账户已启用CloudTrail并记录相关事件。
内容的提问来源于stack exchange,提问作者neeson.lee
相关产品推荐
相关产品推荐

