我正在尝试找出一种方法,通过使用Python 3.6和Boto 3通过aws lambda函数让用户访问密钥年龄。我的问题是,如果存在用于此目的的 api 调用,我似乎找不到要使用的正确 api 调用。我似乎可以找到的最接近的两个是list_access_keys
我可以用来查找密钥的创建日期。get_access_key_last_used
可以给我上次使用钥匙的日期。但是,我似乎找不到的其他人都只是提供访问密钥年龄,如AWS IAM控制台用户视图所示。有没有办法简单地获取访问密钥年龄?
这个简单的代码在不转换大量时间等的情况下做同样的事情:
import boto3
from datetime import date
client = boto3.client('iam')
username = "<YOUR-USERNAME>"
res = client.list_access_keys(UserName=username)
accesskeydate = res['AccessKeyMetadata'][0]['CreateDate'].date()
currentdate = date.today()
active_days = currentdate - accesskeydate
print (active_days.days)
没有直接的方法。您可以使用以下代码片段来实现您正在尝试的操作:
import boto3, json, time, datetime, sys
client = boto3.client('iam')
username = "<YOUR-USERNAME>"
res = client.list_access_keys(UserName=username)
accesskeydate = res['AccessKeyMetadata'][0]['CreateDate'] ### Use for loop if you are going to run this on production. I just wrote it real quick
accesskeydate = accesskeydate.strftime("%Y-%m-%d %H:%M:%S")
currentdate = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())
accesskeyd = time.mktime(datetime.datetime.strptime(accesskeydate, "%Y-%m-%d %H:%M:%S").timetuple())
currentd = time.mktime(datetime.datetime.strptime(currentdate, "%Y-%m-%d %H:%M:%S").timetuple())
active_days = (currentd - accesskeyd)/60/60/24 ### We get the data in seconds. converting it to days
print (int(round(active_days)))
让我知道这是否按预期工作。
经过进一步测试,我想出了以下内容,这些方法在 Lambda 中运行。python3.6 中的此函数将在用户的 IAM 密钥为 90 天或更早时向用户发送电子邮件。
先决条件
所有 IAM 用户都有一个电子邮件标签,其中包含正确的电子邮件地址作为值。
例;
- IAM 用户标签键:电子邮件
- IAM 用户标签值:someone@gmail.com
使用的每一封电子邮件都需要在SES中确认
导入 boto3, os, time, datetime, sys, json 从日期时间导入日期 从 botocore.exceptions 导入客户端错误 IAM = boto3.client('iam'( email_list = [] def lambda_handler(event, context(: 打印("具有 90 天或更早的访问密钥的所有 IAM 用户电子邮件"( 对于 iam.list_users((["用户"] 中的用户列表: userKeys = iam.list_access_keys(UserName=userlist['UserName']( for keyValue in userKeys['AccessKeyMetadata']: 如果键值["状态"] == "活动": 当前日期 = date.today(( active_days = 当前日期 - \ keyValue['CreateDate'].date(( 如果 active_days>= 日期时间.时间增量(天=90(: 用户标签 = iam.list_user_tags( 用户名=键值['用户名']( email_tag = list(filter(lambda tag: tag['Key'] == 'email', userTags['Tags'](( if(len(email_tag( == 1(: 电子邮件 = email_tag[0]["值"] email_list.追加(电子邮件( 打印(电子邮件( email_unique = list(set(email_list(( 打印(email_unique( 收件人 = email_unique 发件人 ="AWS 安全性" AWS_REGION = os.environ['region'] 主题 ="IAM 访问密钥轮换" BODY_TEXT =("您的 IAM 访问密钥需要在 AWS 账户中轮换:123456789,因为它是 3 个月或更长时间。\r" "登录 AWS 并转到您的 IAM 用户以修复:https://console.aws.amazon.com/iam/home?#security_credential" ) BODY_HTML = "" AWS 安全性:IAM 访问密钥轮换:您的 IAM 访问密钥需要在 AWS 账户中轮换:123456789因为它是 3 个月或更长时间。登录 AWS 并转到您的 https://console.aws.amazon.com/iam/home?#security_credential 以创建一组新的密钥。确保禁用/删除以前的密钥对。 """ 字符集 = "UTF-8" client = boto3.client('ses',region_name=AWS_REGION( 尝试: 响应 = client.send_email( 目的地={ "收件人地址":收件人, }, 消息={ "正文":{ "Html": { "字符集":字符集, "数据":BODY_HTML, }, "文本":{ "字符集":字符集, "数据":BODY_TEXT, }, }, "主题":{ "字符集":字符集, "数据":主题, }, }, 源=发送者, ) 除了客户端错误为 e: print(e.response['Error']['Message']( 还: 打印("电子邮件已发送!消息 ID:"(, print(response['MessageId'](
使用上述方法,您只会获得访问密钥的年龄。但作为最佳实践或安全方法,您需要检查上次轮换密钥的时间轮换周期。如果密钥轮换期限超过 90 天,您可以提醒您的团队。
获取访问密钥轮换期限的唯一方法是使用 IAM 的凭证报告。下载它,解析它,并计算年龄。