Сценарий Python для получения списка пользователей iam, которые не использовали ключи доступа более 10 дней - PullRequest
0 голосов
/ 20 октября 2018

Я подготовил скрипт python, который получит список пользователей iam, которые не использовали свой ключ доступа более 10 дней.

Но я получаю ошибку ниже:

AttributeError: у объекта 'iam.User' нет атрибута 'accesskey_last_used'

import json
import boto3
import datetime
from dateutil.tz import tzutc

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

today = datetime.datetime.now()
final_report = ''
final_result = ''

number = int(1)

for user in resource.users.all():
   if user.accesskey_last_used is not None:
       delta = (today - user.access_key_last_used.replace(tzinfo=None)).days
   if delta >= 10:
       final_result= str(number) + " username: " + [user.user_name][0] + " - " + str(delta) + "days\n"
       final_report = final_report + final_result
       number = number + 1

print("final_report")

1 Ответ

0 голосов
/ 21 октября 2018

Сообщение об ошибке довольно точное.В объекте iam.User отсутствует атрибут accesskey_last_used.

Кроме того, пользователь может иметь несколько ключей доступа, и каждый из этих ключей доступа может иметь свойство AccessKeyLastUsed.

Поэтому, вам нужно будет использовать client звонки вместо resource звонков и проходить по каждому ключу доступа для каждого пользователя:

import boto3
import datetime
from dateutil.tz import tzutc

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

today = datetime.datetime.now()
final_report = ''
number = 1

# For every user
for user in resource.users.all():

    # Get Access Keys for the User
    keys_response = client.list_access_keys(UserName=user.user_name)
    last_access = None

    # For every Access Key associate with the user
    for key in keys_response['AccessKeyMetadata']:

        last_used_response = client.get_access_key_last_used(AccessKeyId=key['AccessKeyId'])
        if 'LastUsedDate' in last_used_response['AccessKeyLastUsed']:
            accesskey_last_used = last_used_response['AccessKeyLastUsed']['LastUsedDate']
            if last_access is None or accesskey_last_used < last_access:
                last_access = accesskey_last_used

    # More than x days since last access?
    if last_access is not None:
        delta = (today - last_access.replace(tzinfo=None)).days
        if delta >= 10:
            final_report += str(number) + " username: " + [user.user_name][0] + " - " + str(delta) + " days\n"
            number += 1

print(final_report)
...