Cloudsplaining — это инструмент оценки безопасности AWS IAM, который выявляет нарушения принципа наименьших привилегий и генерирует отчет с приоритетом по рискам.
Cloudsplaining — это инструмент для оценки безопасности AWS IAM, который выявляет нарушения принципа минимальных привилегий и генерирует HTML-отчёт с приоритизацией рисков.
Полную документацию можно найти в проекте на ReadTheDocs.
Cloudsplaining выявляет нарушения принципа минимальных привилегий в политиках AWS IAM и генерирует наглядный HTML-отчёт. Он может сканировать все политики в вашем аккаунте AWS, в нескольких аккаунтах AWS или один файл политики.
Инструмент помогает найти IAM-действия, в которых не используются ограничения ресурсов. Он также помогает расставить приоритеты при устранении уязвимостей, помечая политики IAM, которые создают следующие риски для аккаунта AWS без каких-либо ограничений:
s3:GetObject, ssm:GetParameter, secretsmanager:GetSecretValue)Cloudsplaining также находит роли IAM, которые могут быть использованы вычислительными сервисами AWS (такими как EC2, ECS, EKS или Lambda). Такие роли могут представлять больший риск, чем роли пользователей, особенно если вычислительный сервис AWS работает на инстансе, прямо или косвенно доступном из интернета. Обозначение таких ролей особенно полезно для пентестеров (или атакующих) в определённых сценариях. Например, если злоумышленник получает права на выполнение ssm:SendCommand и существуют привилегированные EC2-инстансы с установленным агентом SSM, он может фактически получить их привилегии. Удалённое выполнение кода через агент AWS Systems Manager уже было известным путём повышения привилегий/эксплуатации, но Cloudsplaining может упростить выявление таких случаев. См. пример отчёта.
Вы также можете указать собственный файл исключений, чтобы отфильтровать результаты, которые являются ложными срабатываниями по разным причинам. Например, пользовательские политики по замыслу разрешительные, тогда как системные роли обычно более ограничительные. У вас также могут быть исключения, специфичные для стратегии работы с несколькими аккаунтами или архитектуры приложений AWS.
Policy Sentry показал нам, что наконец-то стало возможным масштабируемо создавать политики IAM в соответствии с принципом минимальных привилегий. До выхода Policy Sentry было слишком легко найти документы политик IAM, в которых отсутствовали ограничения ресурсов. Рассмотрим политику ниже, которая позволяет субъекту IAM (роли или пользователю) выполнять s3:PutObject для любого S3-бакета в аккаунте AWS:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": "*"
}
]
}
Это плохо. В идеале доступ должен быть ограничен в соответствии с ARN ресурсов, например, так:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Policy Sentry делает это действительно простым. Как только разработчики Infrastructure as Code или администраторы AWS ознакомятся с этим инструментом (который довольно прост в использовании), мы заметили, что внедрение начинается очень быстро. Однако, если вы уже используете AWS, вероятно, у вас есть большой объем невыполненных задач по политикам IAM, которые можно было бы улучшить. Если у вас есть сотни учетных записей AWS с десятками политик в каждой, как можно защитить эти учетные записи AWS, программно выявляя политики, которые следует исправить?
Вот почему мы написали Cloudsplaining.
Cloudsplaining выявляет нарушения принципа наименьших привилегий в политиках AWS IAM и генерирует красивый HTML-отчет. Он может сканировать все политики в вашей учетной записи AWS, в нескольких учетных записях AWS или сканировать один файл политики.
brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining brew install cloudsplaining
#### Pip3```bash
pip3 install --user cloudsplaining
cloudsplaining из командной строки, выполнив cloudsplaining --help.Чтобы включить автодополнение Bash, добавьте это в ваш .bashrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=bash_source cloudsplaining)"
Чтобы включить автодополнение ZSH, добавьте это в ваш .zshrc:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=zsh_source cloudsplaining)"
Вы также можете отсканировать один файл политики для выявления рисков вместо целой учетной записи.```bash cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json
Результат будет включать описание находки и список IAM actions, которые не используют ограничения ресурсов.
Результат будет выглядеть следующим образом:```console
Issue found: Data Exfiltration
Actions: s3:GetObject
Issue found: Resource Exposure
Actions: ecr:DeleteRepositoryPolicy, ecr:SetRepositoryPolicy, s3:BypassGovernanceRetention, s3:DeleteAccessPointPolicy, s3:DeleteBucketPolicy, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccessPointPolicy, s3:PutAccountPublicAccessBlock, s3:PutBucketAcl, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutObjectAcl, s3:PutObjectVersionAcl
Issue found: Unrestricted Infrastructure Modification
Actions: ecr:BatchDeleteImage, ecr:CompleteLayerUpload, ecr:CreateRepository, ecr:DeleteLifecyclePolicy, ecr:DeleteRepository, ecr:DeleteRepositoryPolicy, ecr:InitiateLayerUpload, ecr:PutImage, ecr:PutImageScanningConfiguration, ecr:PutImageTagMutability, ecr:PutLifecyclePolicy, ecr:SetRepositoryPolicy, ecr:StartImageScan, ecr:StartLifecyclePolicyPreview, ecr:TagResource, ecr:UntagResource, ecr:UploadLayerPart, s3:AbortMultipartUpload, s3:BypassGovernanceRetention, s3:CreateAccessPoint, s3:CreateBucket, s3:DeleteAccessPoint, s3:DeleteAccessPointPolicy, s3:DeleteBucket, s3:DeleteBucketPolicy, s3:DeleteBucketWebsite, s3:DeleteObject, s3:DeleteObjectTagging, s3:DeleteObjectVersion, s3:DeleteObjectVersionTagging, s3:GetObject, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccelerateConfiguration, s3:PutAccessPointPolicy, s3:PutAnalyticsConfiguration, s3:PutBucketAcl, s3:PutBucketCORS, s3:PutBucketLogging, s3:PutBucketNotification, s3:PutBucketObjectLockConfiguration, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutBucketRequestPayment, s3:PutBucketTagging, s3:PutBucketVersioning, s3:PutBucketWebsite, s3:PutEncryptionConfiguration, s3:PutInventoryConfiguration, s3:PutLifecycleConfiguration, s3:PutMetricsConfiguration, s3:PutObject, s3:PutObjectAcl, s3:PutObjectLegalHold, s3:PutObjectRetention, s3:PutObjectTagging, s3:PutObjectVersionAcl, s3:PutObjectVersionTagging, s3:PutReplicationConfiguration, s3:ReplicateDelete, s3:ReplicateObject, s3:ReplicateTags, s3:RestoreObject, s3:UpdateJobPriority, s3:UpdateJobStatus
Мы можем сканировать весь AWS аккаунт и создавать отчеты. Для этого мы используем API-вызов AWS IAM get-account-authorization-details, который загружает большой JSON-файл (около 100 КБ на аккаунт), содержащий все детали IAM для данного аккаунта. Это включает данные о пользователях, группах, ролях, политиках, управляемых клиентом, и политиках, управляемых AWS.
У вас должны быть настроены учетные данные AWS, которые могут использоваться CLI.
У вас должны быть права на выполнение iam:GetAccountAuthorizationDetails. Политика arn:aws:iam::aws:policy/SecurityAudit включает это право, как и многие другие, предоставляющие доступ на чтение к сервису IAM.
Чтобы загрузить детали авторизации аккаунта, убедитесь, что вы аутентифицированы в AWS, затем выполните команду download в cloudsplaining:```bash
cloudsplaining download
* Если вы предпочитаете использовать файл `~/.aws/credentials` вместо переменных окружения, вы можете указать имя профиля:```bash
cloudsplaining download --profile myprofile
Он загрузит JSON-файл в вашу текущую директорию, содержащий детальную информацию об авторизации вашей учётной записи.
Инструмент Cloudsplaining не пытается понять контекст всего, что происходит в вашем аккаунте AWS. Часть контекста можно определить программно: применяется ли политика к профилю инстанса, прикреплена ли политика, используются ли встроенные политики IAM и используются ли управляемые политики AWS. Но только вы знаете контекст проектирования вашей инфраструктуры AWS и стратегию IAM.
Поэтому важно устранять ложные срабатывания, зависящие от контекста. Это можно сделать с помощью файла исключений. Мы включили команду, которая сгенерирует для вас шаблон файла исключений, чтобы вам не пришлось запоминать требуемый формат.
Вы можете создать шаблон исключений с помощью следующей команды:```bash cloudsplaining create-exclusions-file
This will generate a file in your current directory titled `exclusions.yml`.
Now when you run the `scan` command, you can use the exclusions file like this:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Для получения дополнительной информации о структуре файла исключений см. Фильтрация ложных срабатываний
Теперь, когда мы загрузили файл авторизации аккаунта, мы можем просканировать все политики AWS IAM с помощью cloudsplaining.
Выполните следующую команду:```bash cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
Будет создан HTML-отчет, как [этот](https://opensource.salesforce.com/cloudsplaining/):
> 
Также будет создан файл необработанных данных в формате JSON:
* `default-iam-results.json`: Этот файл содержит необработанный вывод отчета в формате JSON. Вы можете использовать этот файл данных для работы с результатами сканирования в различных целях. Например, вы можете написать Python-скрипт, который анализирует эти данные и автоматически создает задачи в JIRA или рабочие элементы Salesforce. Пример записи показан ниже. Полный пример можно посмотреть на [examples/files/iam-results-example.json](https://github.com/salesforce/cloudsplaining/blob/master/examples/files/iam-results-example.json)```json
{
"example-authz-details": [
{
"AccountID": "012345678901",
"ManagedBy": "Customer",
"PolicyName": "InsecureUserPolicy",
"Arn": "arn:aws:iam::012345678901:user/userwithlotsofpermissions",
"ActionsCount": 2,
"ServicesCount": 1,
"Actions": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Services": [
"s3"
]
}
]
}
Смотрите папку examples/files для примеров вывода.
Ограничение ресурсов — это лучшая практика, особенно для системных ролей/профилей экземпляров, но иногда это сделано намеренно. Например, рассмотрим ситуацию, когда на профиле экземпляра для EC2-инстанса, который разворачивает Terraform, используется пользовательская политика IAM. В этом случае широкие разрешения являются требованиями дизайна — поэтому мы не хотим включать их в результаты.
Вы можете создать шаблон исключений с помощью следующей команды:```bash cloudsplaining create-exclusions-file
Это создаст файл в вашей текущей директории с именем `exclusions.yml`.
Файл исключений по умолчанию выглядит так:```yaml
# Policy names to exclude from evaluation
# Suggestion: Add policies here that are known to be overly permissive by design, after you run the initial report.
policies:
- "AWSServiceRoleFor*"
- "*ServiceRolePolicy"
- "*ServiceLinkedRolePolicy"
- "AdministratorAccess" # Otherwise, this will take a long time
- "service-role*"
- "aws-service-role*"
# Don't evaluate these roles, users, or groups as part of the evaluation
roles:
- "service-role*"
- "aws-service-role*"
users:
- ""
groups:
- ""
# Read-only actions to include in the results, such as s3:GetObject
# By default, it includes Actions that could lead to Data Exfiltration
include-actions:
- "s3:GetObject"
- "ssm:GetParameter"
- "ssm:GetParameters"
- "ssm:GetParametersByPath"
- "secretsmanager:GetSecretValue"
# Write actions to include from the results, such as kms:Decrypt
exclude-actions:
- ""
policies укажите путь к именам политик, которые вы хотите исключить.MyRole, укажите MyRole или MyR* в списке roles.users и groups.Теперь при выполнении команды scan вы можете использовать файл исключений следующим образом:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
### Сканирование нескольких аккаунтов AWS
Если ваш пользователь IAM или роль IAM имеют разрешения `sts:AssumeRole` на общую роль IAM в нескольких аккаунтах AWS, вы можете использовать команду `scan-multi-account`.
Эта диаграмма иллюстрирует, как работает процесс:

> Примечание: Если вы новичок в настройке межаккаунтного доступа, ознакомьтесь с [официальным учебником AWS по делегированию доступа между аккаунтами AWS с помощью ролей IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html). Это может помочь вам настроить описанную выше архитектуру.
* Во-первых, вам нужно создать файл конфигурации multi-account. Выполните следующую команду:```bash
cloudsplaining create-multi-account-config-file \
-o multi-account-config.yml
multi-account-config.yml со следующим содержимым:```yaml
accounts:
default_account: 123456789012
prod: 123456789013
test: 123456789014> Примечание: Обратите внимание, что формат файла выше включает `account_name: accountID`. Отредактируйте содержимое файла, указав желаемое имя учетной записи и ID учетной записи. Включите столько ID учетных записей, сколько необходимо.
Для следующего шага предположим, что:
* У нас есть роль в целевых аккаунтах, которая называется `CommonSecurityRole`.
* Учетные данные вашего пользователя IAM находятся в профиле AWS Credentials с именем `scanning-user`.
* Этот пользователь имеет разрешения `sts:AssumeRole` для принятия роли `CommonSecurityRole` во всех ваших целевых аккаунтах, указанных в YAML-файле, который мы создали ранее.
* Вы хотите сохранить вывод в корзину S3 с именем `my-results-bucket`
Используя приведенные выше данные, вы можете выполнить следующую команду:```bash
cloudsplaining scan-multi-account \
-c multi-account-config.yml \
--profile scanning-user \
--role-name CommonSecurityRole \
--output-bucket my-results-bucket
Обратите внимание, что если вы запустите вышеуказанное без флага
--profile, оно будет выполнено в соответствии со стандартным порядком приоритетов учетных данных AWS (т. е. переменные окружения, профили учетных данных, учетные данные контейнера ECS, а затем учетные данные профиля EC2 Instance Profile).
Cloudsplaining поддерживает настройку разделов «Руководство» и «Приложения» HTML-отчета для включения рекомендаций и документации по безопасности вашей организации.
Поместите HTML-файлы в корневую папку вашего проекта:
custom-guidance.html — Пользовательское содержание руководства по безопасностиcustom-appendices.html — Пользовательское содержание приложенийecho '
Follow these organization-specific steps:
echo '
Additional company resources:
cloudsplaining download
cloudsplaining download --profile someprofile
cloudsplaining scan --input-file default.json
cloudsplaining scan --input-file default.json --exclusions-file exclusions.yml
cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json --exclusions-file examples/example-exclusions.yml
cloudsplaining create-multi-account-config-file -o accounts.yml cloudsplaining scan-multi-account -c accounts.yml -r TargetRole --output-directory ./
## Часто задаваемые вопросы
**Будет ли сканировать все политики по умолчанию?**
Нет, она будет сканировать только политики, прикрепленные к IAM-принципалам.
**Скачает ли команда download все версии политик?**
Не по умолчанию. Если вы хотите это сделать, укажите флаг `--include-non-default-policy-versions`. Обратите внимание, что инструмент `scan` в настоящее время не работает с нестандартными версиями.
**Я следовал инструкциям по установке, но не могу выполнить программу через командную строку. Что мне делать?**
Скорее всего, это проблема с вашим PATH. Переменная окружения PATH не учитывает бинарные пакеты, установленные с помощью `pip3`. На Mac вы, вероятно, можете исправить это, введя команду ниже, в зависимости от установленных версий. Ваш результат может отличаться.```bash
export PATH=$HOME/Library/Python/3.7/bin/:$PATH
Я следовал инструкциям по установке, но получаю ModuleNotFoundError с сообщением No module named policy_sentry.analysis.expand. Что мне делать?
Попробуйте обновиться до последней версии Cloudsplaining. Эта ошибка была исправлена в версии 0.0.10.