You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 03:05:19