【问题标题】:How to use AWS CLI to get all access keys only by how old they are如何使用 AWS CLI 仅根据它们的年龄来获取所有访问密钥
【发布时间】:2025-12-09 07:15:01
【问题描述】:

我想创建一个脚本,并且可能每 24 小时在一个 cron 作业中运行它,这将列出所有超过 60 天的访问密钥。

我还想将超过 60 天的密钥放入一个数组中,这样我就可以对其进行迭代并执行其他选项。

我正在查看Managing access keys for IAM users - AWS Identity and Access Management,它有一个aws iam get-access-key-last-used 命令,但这不是我想要的。但这是我能找到的壁橱里的东西。

我想要获取当前日期所在的密钥 - creation date > 60 days

我在想象我的脚本会是这样的:

# some of this is pseudocode just to 
# communicate what I'm envisioning.
# I don't actually know what to put
# here yet; need assistance.

myCommand = "aws cli get key where age > 60"
staleKeys=( $( $myCommand) )

for key in "${staleKeys[@]}"
do
   # log "${key}"
   # run another aws cli command with ${key} as a value
done

这可以通过 AWS CLI 实现吗?

【问题讨论】:

  • 当您列出访问密钥时,响应中的每个密钥都包含 CreateDate。您可以推断年龄。

标签: amazon-web-services amazon-iam aws-cli


【解决方案1】:

我使用以下 Python boto3 脚本,而不是 AWS CLI。

希望对想要使用boto3的人有所帮助:

import boto3
from datetime import datetime, timezone

def utc_to_local(utc_dt):
    return utc_dt.replace(tzinfo=timezone.utc).astimezone(tz=None)

def diff_dates(date1, date2):
    return abs(date2 - date1).days

resource = boto3.resource('iam')
client = boto3.client("iam")

KEY = 'LastUsedDate'

for user in resource.users.all():
    Metadata = client.list_access_keys(UserName=user.user_name)
    if Metadata['AccessKeyMetadata']:
        for key in user.access_keys.all():
            
            AccessId = key.access_key_id
            Status = key.status
            CreatedDate = key.create_date

            numOfDays = diff_dates(utc_to_local(datetime.utcnow()), utc_to_local(CreatedDate))
            LastUsed = client.get_access_key_last_used(AccessKeyId=AccessId)

            if (Status == "Active"):
                if KEY in LastUsed['AccessKeyLastUsed']:
                    print("User:", user.user_name,  "Key:", AccessId, "Last Used:", LastUsed['AccessKeyLastUsed'][KEY], "Age of Key:", numOfDays, "Days")
                else:
                    print("User:", user.user_name , "Key:",  AccessId, "Key is Active but NEVER USED")
            else:
                print("User:", user.user_name , "Key:",  AccessId, "Keys is InActive")
    else:
        print("User:", user.user_name , "No KEYS for this USER")

【讨论】:

    【解决方案2】:

    我推荐Getting credential reports for your AWS account - AWS Identity and Access Management。这是一个自动化过程,可以生成一个 CSV 文件,其中列出了有关凭据的大量信息,包括:

    • 创建或上次更改用户访问密钥的日期和时间
    • 用户的访问密钥最近用于签署 AWS API 请求的日期和时间

    可以通过调用generate-credential-report获取报告,稍等片刻,再调用get-credential-report。响应需要进行 base64 解码。结果如下所示:

    user,arn,user_creation_time,password_enabled,password_last_used,password_last_changed,password_next_rotation,mfa_active,access_key_1_active,access_key_1_last_rotated,access_key_1_last_used_date,access_key_1_last_used_region,access_key_1_last_used_service,access_key_2_active,access_key_2_last_rotated,access_key_2_last_used_date,access_key_2_last_used_region,access_key_2_last_used_service,cert_1_active,cert_1_last_rotated,cert_2_active,cert_2_last_rotated
    user1,arn:aws:iam::111111111111:user/user1,2019-04-08T05:57:22+00:00,true,2020-05-20T10:55:03+00:00,2019-04-18T00:43:43+00:00,N/A,false,true,2019-04-08T05:57:24+00:00,2019-12-05T21:23:00+00:00,us-west-2,iot,true,2019-11-18T09:38:54+00:00,N/A,N/A,N/A,false,N/A,false,N/A
    

    如果您决定自己生成信息,请注意list_access_keys() 仅返回有关单个用户的信息。因此,您需要遍历所有用户,并为每个用户调用list_access_keys() 以获取密钥的CreationDate

    使用示例见:How to scan your AWS account for old access keys using python - DEV Community

    【讨论】:

    • 感谢您的回复。我正在尝试使某些东西自动化。因此,拉下静态 CSV 意味着我需要编写额外的东西来解析工作表。没有办法从 CLI 执行此操作吗?
    • 我建议使用 Python 之类的脚本语言来请求文件并解析 CSV。使用 shell 脚本通常比使用“真正的”语言更难。但是,您可以使用 AWS CLI 请求报告和 shell 工具(如 cut)来处理 CSV 文件。
    • > 使用 shell 脚本通常比使用“真正的”语言更难。让我做出这个决定怎么样。我的问题是这可能来自 CLI。不要为我改进我的设计。如果必须,我会使用 python 来提取数据,但我希望不要走那条路。再次感谢。
    • CLI 可用于请求报告和下载报告。您需要自己完成其余的工作,包括 base64 解码和解析 CSV。我的答案中的文档链接包含有关如何从 AWS CLI 执行此操作的说明。
    最近更新 更多