Блог Amazon Web Services
Непрерывный мониторинг неиспользуемых ролей IAM с помощью AWS Config
Оригинал статьи: ссылка (Michael Chan, AWS Identity Developer Advocate и Roland AbiHanna, Sr. Solutions Architect)
Облачная разработка способствует итеративному подходу с частыми итерациями для развития ваших приложений и инфраструктуры. Такой же итеративный подход следует применять и к создаваемым вами ролям AWS Identity and Access Management (IAM). Периодическая проверка того, что все созданные вами роли IAM всё ещё используются, может снизить операционную сложность за счёт избавления от необходимости отслеживать неиспользуемые роли. Это также улучшает безопасность: идентификация неиспользуемых ролей помогает снизить вероятность ненадлежащего или непреднамеренного доступа к вашей критической инфраструктуре и рабочим нагрузкам.
IAM API предоставляет вам информацию о том, когда та или иная роль в последний раз использовалась для выполнения запроса к AWS API. В этом посте я продемонстрирую, как можно определить неактивные роли, используя время последнего использования ролей, и настроить непрерывный мониторинг активности ролей с помощью AWS Config.
Использованные сервисы и функциональность AWS
Это решение использует следующие сервисы и функциональность:
- AWS IAM: Данный сервис позволяет безопасно управлять доступом к сервисам и ресурсам AWS. Он предоставляет API для получения времени последнего использования ролей IAM для выполнения запроса к AWS API, а также регион, в котором был сделан запрос.
- AWS Config: Данный сервис позволяет непрерывно отслеживать и сохранять конфигурации ресурсов AWS. Он будет периодически запускать ваши AWS Config Rule (см. следующий пункт) и сохранять статус соответствия конфигурации ресурсов требованиям.
- AWS Config Rule: Этот ресурс предоставляет возможность установить требуемые параметры конфигурации для конкретных ресурсов AWS или для всего аккаунта AWS. Далее, он проверит статус соответствия конфигурации ресурсов AWS требованиям. Вы можете задать правила, определяющие соответствие ролей требованиям. Они позволят вам пометить недавно использованные роли IAM как «соответствующие», а неактивные – как «несоответствующие».
- AWS Lambda: Данный сервис позволяет выполнять программный код без создания серверов или управления ими. Функция Lambda будет использоваться для выполнения вызовов API для получения информации о времени последнего использования ролей и для проверки соответствия ролей требованиям AWS Config.
- Amazon Simple Storage Service (Amazon S3): Это – высокодоступное и надёжное хранилище объектов. Вы будете использовать его для хранения исходного кода в zip-архиве для развёртывания функции Lambda.
- AWS CloudFormation: Этот сервис предоставляет универсальный язык для описания и создания всех ресурсов облачной инфраструктуры AWS. Вы будете использовать его для создания всех ресурсов, описанных в этом решении.
Логика решения
Данное решение идентифицирует неиспользуемые роли IAM в вашем аккаунте. Для этого, вы будете использовать функцию AWS Lambda для проверки всех ролей IAM в вашем аккаунте. Сначала вы определите неиспользуемые роли, основываясь на установленном вами временном окне (число дней с момента последнего использования роли). В данном примере используется 60 дней, но этот параметр настраивается. Затем вы определите статус их соответствия требованиям на основе времени создания и информации о времени последнего использования. Наконец, вы отправите результаты в AWS Config, который сохранит статус соответствия или несоответствия каждой из ролей. Если роль не будет соответствовать требованиям, вы сможете принять меры по исправлению ситуации, например, запретить выполнение всех действий с использованием этой роли.
Необходимые условия
Это решение имеет следующие необходимые условия:
- Утилита командной строки AWS (AWS CLI) должна быть установлена и настроена на вашем компьютере.
- AWS Config должен быть включён в вашем аккаунте AWS. Для получения дополнительной информации см. раздел «Начало работы с AWS Config«.
Архитектура решения
Как показано на диаграмме выше, AWS Config (1) проверяет AWS Config Rule с настраиваемой периодичностью (2), что, в свою очередь, запускает функцию Lambda (3). Функция Lambda запрашивает список всех ролей в аккаунте AWS и определяет дату их создания, а также время последнего использования каждой роли, которые предоставляются через GetAccountAuthorizationDetails IAM API (4). После того, как функция Lambda проверит соответствие всех ваших ролей требованиям, она отправляет статус их соответствия требованиям в AWS Config (5). AWS Config сохраняет историю изменений статуса соответствия всех ролей, проанализированных AWS Config Rule, установленным требованиям. Также, если такая опция настроена, уведомления об изменении статуса соответствия требованиям могут быть отправлены в тему (topic) Amazon Simple Notification Service (Amazon SNS). Статус соответствия можно либо посмотреть в консоли управления AWS, либо получить его с помощью AWS CLI или AWS SDK.
Развёртывание решения
Ресурсы для этого решения создаются через шаблон AWS CloudFormation. Прежде чем развернуть решение в вашем аккаунте с помощью шаблона AWS CloudFormation, вам необходимо подготовить исходный код функции Lambda.
Шаг 1: Подготовка к развёртыванию функции Lambda
Для начала, запустите командную строку *nix (Linux, Mac или подсистема Windows для Linux). Выполните приведённые ниже команды, чтобы создать пустую папку с именем iam-role-last-used
, в которую вы поместите исходный код Lambda.
Обратите внимание, что каталог, который вы создали, и код, который будет в нём содержаться, позднее будут сжаты в zip-архив командой AWS CLI cloudformation package
. Эта команда также загрузит zip-архив с исходным кодом в ваш бакет S3. Позже, команда cloudformation deploy
будет ссылаться на этот бакет S3 при развёртывании шаблона решения.
Теперь создайте слой Lambda с последней версией boto3 SDK. Это гарантирует, что ваша функция Lambda будет использовать последнюю версию boto3 SDK и позволит вам управлять зависимостями при её развёртывании. Это можно сделать, следуя шагам с 1 по 4 в этой инструкции. Обязательно запишите ARN-идентификатор созданного вами слоя Lambda, поскольку он вам понадобится позже.
Наконец, откройте файл lambda_function.py
в текстовом редакторе или интегрированной среде разработки (IDE) и скопируйте следующий исходный код в файл lambda_function.py
:
Рассмотрим, как работает вышеупомянутый код. AWS Config Rule запускает функцию Lambda, вызывая функцию evaluate_compliance()
. Функция evaluate_compliance()
делает следующее:
- Запрашивает информацию о всех ролях IAM с помощью GetAccountAuthorizationDetails API, как уже упоминалось ранее. Эта информация включает в себя дату создания каждой роли, а также время последнего её использования.
- Помечает роль как соответствующую требованиям, если имя роли соответствует одному из шаблонов из списка
whitelisted_role_pattern_list
. Этот список шаблонов передается в Config Rule через параметр конфигурации шаблона CloudFormation с именемRolePatternWhitelist
. В разделе «Игнорируемые роли» ниже приведены инструкции о том, как это сделать. - Помечает роль как соответствующую требованиям, если её возраст в днях (
role_age_in_days
) меньше или равен параметруMaxDaysForLastUsed
(max_days_for_last_used
). Это значение также передаётся через параметр конфигурации шаблона CloudFormation. Этот параметр используется для конфигурации временного интервала, в течение которого роль может быть неактивна. - Если ни одно из вышеперечисленных условий не выполняется, то вызывается функция
determine_last_used()
, и роль помечается как несоответствующая требованиям, если значение параметраdays_unused
больше, чем значение параметраmax_age_in_days
. - В конце, функция
evaluate_compliance()
вызывает функциюput_evaluations()
, чтобы сохранить статус соответствия ролей требованиям в AWS Config.
Шаг 2: Развёртывание шаблона AWS CloudFormation
Далее, создайте файл для шаблона CloudFormation с названием iam-role-last-used.yml
. Этот шаблон использует AWS Serverless Application Model (AWS SAM), которая является расширением CloudFormation. AWS SAM упрощает развёртывание и избавляет вас от необходимости вручную загружать zip-архив с исходным кодом функции Lambda в бакет Amazon S3. Чтобы убедиться, что при развёртывании шаблона zip-архив с исходным кодом будет найден, поместите этот файл рядом с созданным вами ранее каталогом iam-role-last-used
. Затем скопируйте код, приведённый ниже, и сохраните его в файл iam-role-last-used.yml
.
Ниже приведена краткая информация о данном шаблоне CloudFormation.
- Параметры (эти переменные можно переопределять):
MaxDaysForLastUsed
– максимальное количество дней, в течение которого роль может быть неактивна прежде, чем она получит статус несоответствующей требованиям.NameOfSolution
– название решения: оно используется для именования создаваемых ресурсов.RolePatternWhitelist
– список ролей, перечисленных через разделитель («|»), которые всегда помечаются как соответствующие требованиям (см. раздел «Игнорируемые роли» ниже).LambdaLayerArn
– ARN-идентификатор слоя Lambda, созданного вами ранее на шаге 1.
- Ресурсы (эти ресурсы будут созданы в вашем аккаунте AWS):
LambdaInvokePermission
– разрешение для AWS Config запускать вашу функцию Lambda.LambdaExecutionRole
– роль IAM, которая будет использоваться функцией Lambda. Эта роль включает в себя политики с разрешениями производить следующие действия: iam:GetAccountAuthorizationDetails, config:PutEvaluations, logs:CreateLogStream, и logs:PutLogEvents. Действие PutEvaluations позволяет функции сохранять в AWS Config статус соответствия ресурсов требованиям. Действия CreateLogStream и PutLogEvents позволяют сохранять логи вашей функции Lambda в AWS CloudWatch Logs.CheckRoleLastUsedLambda
– описывает вашу функцию Lambda и её параметры.LambdaLogGroup
– группа CloudWatch Logs, где будут сохранены логи вашей функции Lambda.ConfigCustomRule
– описывает AWS Config Rule и его параметры.
Используйте команду AWS CLI cloudformation package
с шаблоном CloudFormation, который вы сохранили ранее, чтобы создать zip-архив, содержащий исходный код вашей функции Lambda и загрузить его в указанный вами бакет S3, как показано ниже. Обязательно замените <YOUR REGION> на регион, в котором вы развёртываете решение и <YOUR S3 BUCKET> на имя бакета, не включая префикс s3://
:
В результате будет создан файл iam-role-last-used-transformed.yml
, содержащий ссылку на бакет и путь к zip-архиву, содержащему исходный код, необходимые CloudFormation для развёртывания функции Lambda.
Теперь, разверните решение в вашем аккаунте AWS с помощью команды cloudformation deploy
, приведённой ниже. Вы можете задать другие значения для NameOfSolution
, MaxDaysForLastAccess
, или RolePatternWhitelist
, используя опцию --parameter-overrides
. В противном случае будут использоваться значения по умолчанию, которые указаны в верхней части шаблона CloudFormation, в разделе Parameters. Не забудьте заменить <YOUR REGION> на регион, в котором вы развёртываете решение, и <YOUR LAMBDA LAYER ARN> на ARN-идентификатор слоя Lambda, созданного вами ранее на шаге 1.
Развёртывание решения обычно занимает всего несколько минут и заканчивается сообщением AWS CLI об успешном завершении команды:
Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - iam-role-last-used
Шаг 3: Просмотр результатов
Теперь, когда развёртывание завершено, вы можете просмотреть результаты проверки соответствия требованиям, перейдя в консоль AWS Config.
- Выберите тот же регион, в котором был развёрнут шаблон CloudFormation.
- Выберите Rules в левой панели, в результате чего откроется текущий список Config Rules в вашем аккаунте AWS.
- Выберите Config Rule iam-role-last-used для просмотра детальной информации, как показано на изображении 2.
Если в поле Overall rule status отображается время последнего запуска проверки, первоначальная проверка соответствия завершена. Для успешного завершения проверки может потребоваться подождать несколько минут, если результаты ещё недоступны. Вы можете несколько раз обновить консоль в веб-браузере, чтобы проверить, завершена ли проверка.
После завершения проверки ваших ролей на соответствие требованиям вы сможете просмотреть результаты на этой же странице. На скриншоте ниже видно, что есть несколько несоответствующих требованиям ролей. Вы можете переключаться между просмотром соответствующих и несоответствующих требованиям ролей с помощью выпадающего меню в разделе Compliance status.
Вы можете навести курсор на символ «i», чтобы увидеть причину, по который роль была помечена как несоответствующая требованиям (см. изображение 4).
Шаг 4: Экспорт отчёта о соответствии требованиям
Возможно, после успешного завершения проверки, вы захотите создать экспортируемый отчёт о соответствии требованиям. Вы можете использовать AWS CLI для написания скриптов и автоматического создания отчётов для ваших команд разработки, или команды безопасности. Они могут использовать эти отчёты для дальнейшей проверки несоответствующих требованиям ролей и принятия мер, если та или иная роль больше не нужна. Команда AWS CLI, представленная ниже, демонстрирует, как можно это сделать. Обратите внимание, что команда, приведённая ниже, состоит из одной строки:
Результат будет аналогичен приведённым ниже строкам, колонки будут отделены друг от друга отступами. В первой колонке выводится название роли. Во второй колонке указывается статус соответствия. Последняя колонка объясняет причину статуса соответствия или несоответствия:
AdminRole COMPLIANT Was last used in us-west-2 46 days ago Ec2DevRole NON_COMPLIANT No record of usage
Исправление несоответствующих требованиям ролей
Теперь, когда у вас есть отчет о несоответствующих требованиям ролях, вы должны решить, что с ними делать. Если ваши команды согласны с тем, что роль не является необходимой, исправление может заключаться в простом удалении роли. Если вы не уверены, вы можете сохранить роль, но запретить выполнение всех действий. Вы можете сделать это, прикрепив новую политику, запрещающую все действия для всех ресурсов. Повторное включение роли будет очень простым, достаточно будет удалить добавленную политику. В противном случае, если роль необходима, но не часто используется, вы можете внести её в список игнорируемых ролей с помощью метода, описанного ниже.
Игнорируемые роли
Игнорируемые роли будут помечены как соответствующие требованиям, даже если они не используются. У вас могут быть такие роли, как роль для реагирования на инциденты безопасности или для других экстренных ситуаций, которые требуют внесения в список разрешённых ролей.
Список игнорируемых ролей настраивается параметром RolePatternWhitelist
шаблона CloudFormation и хранится как параметр AWS Config Rule. Синтаксис использует шаблон соответствия имен файлов UNIX. Если необходимо указать несколько шаблонов для названия ролей, используйте символ «|» в качестве разделителя между ними. При этом, каждый шаблон будет сопоставлен с именем роли, включая путь. Например, если необходимо внести в список игнорируемых ролей роли breakglass-role
, security-incident-response-role
и security-audit-role
, то параметр RolePatternWhitelist шаблона CloudFormation будет выглядеть следующим образом:
/breakglass-role|/security-*
Важно: Используйте звёздочки (*) аккуратно, так как они будут соответствовать любому количеству любых символов в названии роли!
Дополнительная функциональность
В этой статье я постарался сохранить архитектуру и код простыми, чтобы сделать решение более лёгким для использования. Однако вы можете дополнительно настроить решение с помощью следующей функциональности:
- Решение можно развернуть в качестве AWS Config Rule, которое централизованно развёртывается через AWS Organizations для проверки всех аккаунтов AWS, входящих в вашу AWS Organization. Единственное, что требуется изменить, это установить
ASSUME_ROLE_MODE = True
в предоставленном исходном коде. Также необходимо внести изменения в разрешение для AWS Config запускать функцию Lambda, которые позволят другим аккаунтам из вашей AWS Organization напрямую вызывать эту функцию Lambda. - Ручное или автоматическое исправление несоответствующих ролей может быть выполнено через AWS Config путём настройки пользовательского исправления. AWS Config применяет исправление с помощью документов автоматизации AWS Systems Manager Automation.
Выводы
В этой статье я показал вам, как использовать AWS IAM и AWS Config для реализации непрерывного мониторинга безопасности, который обеспечивает прозрачность ваших ролей IAM и времени их последнего использования. Я также показал, как просматривать результаты проверки соответствия ролей IAM требованиям в консоли управления AWS и экспортировать результаты с помощью AWS CLI. Наконец, я предложил различные опции исправления и возможность составления списка разрешённых ролей, которые необходимы, но при этом редко используются. Эти методы могут помочь вам улучшить методы обеспечения безопасности и соответствия требованиям, предотвращая непреднамеренный доступ через роли IAM.
Дополнительная информация
- How to Use AWS Config to Monitor for and Respond to Amazon S3 Buckets Allowing Public Access
- How to Centrally Manage AWS Config Rules across Multiple AWS Accounts
- AWS Config Rules Update: Aggregate Compliance Data Across Accounts and Regions
- AWS Lambda Layers
- Best Practices for Working with AWS Lambda Functions
- What Is the AWS Serverless Application Model (AWS SAM)?
- AWS Systems Manager
- Security Pillar — AWS Well-Architected Framework