Как использовать AWS CLI, чтобы получить все ключи доступа только по возрасту

Я хочу создать сценарий и, возможно, запускать его в задании cron каждые 24 часа, в котором будут перечислены все ключи доступа старше 60 дней.

Я также хочу засунуть ключи старше 60 дней в массив, чтобы я мог перебирать его и выполнять другие варианты.

Я ищу Управление ключами доступа для пользователей IAM - AWS Identity и Управление доступом, и в нем есть 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?


person MGoBlue93    schedule 05.11.2020    source источник
comment
Когда вы перечисляете ключи доступа, каждый ключ в ответе включает CreateDate. Вы можете сделать вывод о возрасте.   -  person jarmod    schedule 05.11.2020


Ответы (2)


Я использую следующий скрипт 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")
person Steven Yong    schedule 25.01.2021

Я рекомендую Получение отчетов об учетных данных для вашей учетной записи AWS - AWS Identity and Access Управление. Это автоматизированный процесс, с помощью которого можно создать файл CSV, в котором содержится много информации об учетных данных, в том числе:

  • Дата и время создания или последнего изменения ключа доступа пользователя.
  • Дата и время, когда последний раз ключ доступа пользователя использовался для подписи запроса API AWS.

Отчет можно получить, позвонив 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 ключей.

Пример использования см .: Как сканировать свою учетную запись AWS на наличие старых ключей доступа с помощью Python - Сообщество DEV

person John Rotenstein    schedule 05.11.2020
comment
Спасибо за ответ. Я пытаюсь что-то автоматизировать. Таким образом, получение статического CSV означает, что мне нужно написать дополнительный материал для анализа листа. Нет способа сделать это из интерфейса командной строки? - person MGoBlue93; 06.11.2020
comment
Я бы рекомендовал использовать язык сценариев, например Python, для запроса файла и анализа CSV. Использование сценария оболочки обычно сложнее, чем использование реального языка. Однако вы можете использовать интерфейс командной строки AWS для запроса отчетов и инструментов оболочки, таких как cut, для обработки файла CSV. - person John Rotenstein; 07.11.2020
comment
›Использование сценария оболочки обычно сложнее, чем использование реального языка. Как насчет того, чтобы позволить мне принять это решение. Мой вопрос: возможно ли это из интерфейса командной строки. Не улучшай мой дизайн для меня. Если придется, я буду использовать python для извлечения данных, но я надеялся не пойти по этому пути. Спасибо еще раз. - person MGoBlue93; 07.11.2020
comment
Интерфейс командной строки можно использовать для запроса отчета и загрузки отчета. Все остальное вам нужно будет сделать самостоятельно, включая декодирование base64 и синтаксический анализ CSV. Ссылка на документацию в моем ответе включает инструкции о том, как это сделать из интерфейса командной строки AWS. - person John Rotenstein; 07.11.2020