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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:33:17