
Многопоточный инструмент для сбора инвентаризации AWS с акцентом на ресурсы и метаданные, связанные с безопасностью.
Многопоточный инструмент для сбора инвентаризации AWS с фокусом на безопасность, написанный на Ruby.
Этот инструмент создан для эффективного сбора большого объёма атрибутов и метаданных ресурсов AWS. Он стремится собрать практически всё, что имеет отношение к конфигурации безопасности и состоянию среды AWS.
Существующие инструменты (например, AWS Config), выполняющие сбор ресурсов, не обладают достаточным охватом и специфичностью для точной оценки состояния безопасности (например, подробные данные об атрибутах ресурсов, полностью разобранные документы политик и вложенные связи между ресурсами).
AWS Recon обрабатывает сбор из крупных аккаунтов, используя автоматические повторные попытки (из-за проблем с сетью или троттлингом API), автоматическую пагинацию больших ответов (> 100 ресурсов на вызов API) и многопоточные параллельные запросы для ускорения сбора.
** использование не означает одобрения
AWS Recon требует роль или учётные данные AWS с правами ReadOnlyAccess. Полный AdministratorAccess избыточен, но тоже будет работать. Политика SecurityAudit недостаточна, так как не предоставляет доступ ко многим сервисам.
Используйте Docker версии 19.x или выше для запуска предварительно собранного образа без необходимости установки чего-либо.
Если у вас уже установлен Ruby (2.6.x или 2.7.x), вы можете установить Ruby gem.
AWS Recon можно запустить локально через контейнер Docker или установив Ruby gem.
Для запуска через контейнер Docker передайте необходимые учётные данные AWS в команду docker run. Например:
$ docker run -t --rm \
-e AWS_REGION \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-v $(pwd)/output.json:/recon/output.json \
darkbitio/aws_recon:latest \
aws_recon -v -s EC2 -r global,us-east-1,us-east-2
Для локального запуска сначала установите gem:
$ gem install aws_recon
Fetching aws_recon-0.5.17.gem
Fetching aws-sdk-3.0.1.gem
Fetching parallel-1.20.1.gem
...
Successfully installed aws-sdk-3.0.1
Successfully installed parallel-1.20.1
Successfully installed aws_recon-0.5.17
Или добавьте его в ваш Gemfile с помощью bundle:
$ bundle add aws_recon
Fetching gem metadata from https://rubygems.org/
Resolving dependencies...
...
Using aws-sdk 3.0.1
Using parallel-1.20.1
Using aws_recon 0.5.17
AWS Recon будет использовать любые учётные данные AWS (см. требования), доступные в среде, где он запущен. Если вы собираете данные из нескольких аккаунтов, возможно, захотите использовать что-то вроде aws-vault для управления разными учётными данными.
$ aws-vault exec profile -- aws_recon
Обычные переменные окружения тоже подойдут.
$ AWS_PROFILE=<profile> aws_recon
Для запуска из контейнера Docker с учётными данными, управляемыми через aws-vault (вывод в stdout):
$ aws-vault exec <vault_profile> -- docker run -t --rm \
-e AWS_REGION \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
darkbitio/aws_recon:latest \
aws_recon -j -s EC2 -r global,us-east-1,us-east-2
Для запуска из контейнера Docker с учётными данными, управляемыми через aws-vault, и выводом в файл, необходимо выполнить несколько требований. Во-первых, Docker должен иметь доступ к примонтированию указанного вами пути (или родительского пути выше). Во-вторых, нужно создать пустой файл для сохранения вывода (например, output.json). Это связано с тем, что только этот файл монтируется в контейнер Docker во время выполнения. Например:
Создайте пустой файл.
$ touch output.json
Запустите контейнер aws_recon, указав выходной файл.
$ aws-vault exec <vault_profile> -- docker run -t --rm \
-e AWS_REGION \
-e AWS_ACCESS_KEY_ID \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-v $(pwd)/output.json:/recon/output.json \
darkbitio/aws_recon:latest \
aws_recon -s EC2 -v -r global,us-east-1,us-east-2
Возможно, вы захотите изначально использовать флаг -v или --verbose, чтобы видеть статус и активность во время сбора.
В многословном режиме на консоль будет выводиться:
<thread>.<region>.<service>.<operation>
Префикс t указывает, какой поток обрабатывает конкретный запрос. Регион, сервис и операция показывают, какая операция запроса выполняется в данный момент и где.
$ aws_recon -v
t0.global.EC2.describe_account_attributes
t2.global.S3.list_buckets
t3.global.Support.describe_trusted_advisor_checks
t2.global.S3.list_buckets.acl
t5.ap-southeast-1.WorkSpaces.describe_workspaces
t6.ap-northeast-1.Lightsail.get_instances
...
t2.us-west-2.WorkSpaces.describe_workspaces
t1.us-east-2.Lightsail.get_instances
t4.ap-southeast-1.Firehose.list_delivery_streams
t7.ap-southeast-1.Lightsail.get_instances
t0.ap-south-1.Lightsail.get_instances
t1.us-east-2.Lightsail.get_load_balancers
t7.ap-southeast-2.WorkSpaces.describe_workspaces
t2.eu-west-3.SageMaker.list_notebook_instances
t3.eu-west-2.SageMaker.list_notebook_instances
Finished in 46 seconds. Saving resources to output.json.
# сбор глобальных ресурсов S3 и EC2, а также us-east-1 и us-east-2
$ AWS_PROFILE=<profile> aws_recon -s S3,EC2 -r global,us-east-1,us-east-2
# сбор глобальных ресурсов S3 и EC2, а также us-east-1 и us-east-2
$ AWS_PROFILE=<profile> aws_recon --services S3,EC2 --regions global,us-east-1,us-east-2
# сохранение вывода в S3 bucket
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket
# сохранение вывода в S3 bucket с домашним регионом, отличным от us-east-1
$ AWS_PROFILE=<profile> aws_recon \
--services S3,EC2 \
--regions global,us-east-1,us-east-2 \
--verbose \
--s3-bucket my-recon-bucket:us-west-2
Пример вывода в формате OpenCSPM (NDJSON).
$ AWS_PROFILE=<profile> aws_recon -l \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom
или
$ AWS_PROFILE=<profile> aws_recon -j \
-s S3,EC2 \
-r global,us-east-1,us-east-2 \
-f custom > output.json
Исключения API, связанные с разрешениями, в большинстве случаев молча игнорируются. Эти ошибки обычно возникают по одной из следующих причин:
В режиме verbose вы увидите журналы исключений в выводе:
t2.us-east-1.EC2.describe_subnets.0
t4.us-east-1.SSM.describe_instance_information.0
t6.us-east-1.SecurityHub.InvalidAccessException <-----
t2.us-east-1.EC2.describe_addresses.0
t4.us-east-1.SSM.describe_parameters.0
t1.us-east-1.GuardDuty.list_detectors.0
Используйте опцию командной строки -q, чтобы повторно вызывать эти исключения, что упрощает диагностику проблем с доступом.
Traceback (most recent call last):
arn:aws:sts::1234567890:assumed-role/role/my-audit-role is not authorized to perform:
codepipeline:GetPipeline on resource: arn:aws:codepipeline:us-west-2:1234567890:pipeline
(Aws::CodePipeline::Errors::AccessDeniedException)
Точная операция API, вызвавшая исключение, указана в последней строке трассировки стека. Если вы не можете решить проблему с необходимыми разрешениями, исключите эти сервисы с помощью -x или --not-services, либо не используйте опцию -q, чтобы сбор мог продолжиться.
AWS Recon использует несколько потоков, чтобы преодолеть некоторые проблемы ввода-вывода при выполнении множества вызовов API к конечным точкам по всему миру.
Для глобальных сервисов, таких как IAM, Shield и Support, запросы не являются многопоточными. Модуль S3 является многопоточным, так как для каждого bucket требуется несколько дополнительных вызовов для сбора полных метаданных.
Для региональных сервисов для каждого сервиса в регионе создаётся поток (до предела потоков). По умолчанию используется до 8 потоков. Если ваши ресурсы распределены по многим регионам, вы можете увидеть ускорение, увеличив количество потоков с помощью -t X, где X — количество потоков.
AWS Recon выполнит минимум ~2000 вызовов API в новом/пустом аккаунте, просто для опроса поддерживаемых сервисов во всех 20 стандартных (не GovCloud, не China) регионах. Вероятность столкнуться с ограничением скорости API (троттлингом) велика в крупных аккаунтах, если вы включите больше потоков, чем по умолчанию (8).
Recon автоматически сделает паузу и будет соблюдать лимиты повторных попыток, указанные в ответе API. Если вы наблюдаете длительные паузы во время сбора, скорее всего, именно это и происходит. Повторите сбор с опцией -d или --debug, чтобы увидеть трассировку проводов и проверить, не подвергаетесь ли вы троттлингу. Если вы регулярно получаете ограничение скорости, рассмотрите возможность использования меньшего количества потоков или запроса более высоких лимитов от AWS.
Большинство пользователей захотят ограничить сбор соответствующими сервисами и регионами. Запуск без каких-либо исключений попытается собрать все ресурсы из всех регионов, включённых для аккаунта.
$ aws_recon -h
AWS Recon - AWS Inventory Collector (0.5.17)
Usage: aws_recon [options]
-r, --regions [REGIONS] Regions to scan, separated by comma (default: all)
-n, --not-regions [REGIONS] Regions to skip, separated by comma (default: none)
-s, --services [SERVICES] Services to scan, separated by comma (default: all)
-x, --not-services [SERVICES] Services to skip, separated by comma (default: none)
-c, --config [CONFIG] Specify config file for services & regions (e.g. config.yaml)
-b, --s3-bucket [BUCKET:REGION] Write output file to S3 bucket (default: '')
-o, --output [OUTPUT] Specify output file (default: output.json)
-f, --format [FORMAT] Specify output format (default: aws)
-t, --threads [THREADS] Specify max threads (default: 8, max: 128)
-l, --json-lines Output NDJSON/JSONL format (default: false)
-u, --user-data Collect EC2 instance user data (default: false)
-z, --skip-slow Skip slow operations (default: false)
-g, --skip-credential-report Skip generating IAM credential report (default: false)
-j, --stream-output Stream JSON lines to stdout (default: false)
-v, --verbose Output client progress and current operation
-q, --quit-on-exception Stop collection if an API error is encountered (default: false)
-d, --debug Output debug with wire trace info
-h, --help Print this help information
Вывод всегда в виде JSON — либо JSON lines, либо обычный JSON. Вывод записывается либо в файл (по умолчанию), либо в stdout (с помощью -j).
При записи в S3 bucket вывод JSON автоматически сжимается с помощью gzip.
Если у вас включены регионы, включённые вручную:
и вы используете STS для принятия роли в аккаунте, вам нужно включить токены STS v2 в аккаунте, из которого вы принимаете роль, чтобы иметь возможность запускать AWS Recon в этих регионах.
Токены версии 1 действительны только в регионах AWS, которые доступны по умолчанию. Эти токены не работают в регионах, включённых вручную, например, в Азиатско-Тихоокеанском регионе (Гонконг). Токены версии 2 действительны во всех регионах. Однако токены версии 2 длиннее и могут повлиять на системы, где вы временно храните токены.
Если вы используете статический ключ доступа/секрет, вы можете собирать данные из этих регионов независимо от версии токена STS.
Текущий «охват» по сервисам приведён ниже. Сервисы без охвата будут добавлены позже. PR приветствуются. :)
AWS Recon стремится собирать все ресурсы и метаданные, которые важны для оценки состояния безопасности вашего аккаунта (аккаунтов) AWS. Однако он не проверяет ресурсы на предмет состояния безопасности — это задача других инструментов, которые принимают вывод AWS Recon в качестве входных данных.
Одной из основных мотиваций для создания AWS Recon было создание инструмента, который легко поддерживать и расширять. Если вы считаете, что охват по определённому сервису можно улучшить, мы будем рады PR. Любой, кто имеет умеренное знакомство с Ruby, сможет повторить шаблон, используемый существующими сборщиками, для запроса конкретного сервиса и добавления результатов в коллекцию ресурсов.
Клонируйте этот репозиторий:
$ git clone [email protected]:darkbitio/aws-recon.git
$ cd aws-recon
Создайте sticky gemset, если используете RVM:
$ rvm use 2.7.2@aws_recon_dev --create --ruby-version
Запустите bin/setup для установки зависимостей. Затем выполните rake test для запуска тестов. Вы также можете запустить bin/console для интерактивной консоли, которая позволит вам экспериментировать.
Чтобы установить этот gem локально, выполните bundle exec rake install. Чтобы выпустить новую версию, обновите номер версии в version.rb, а затем выполните bundle exec rake release, который создаст git-тег для версии, отправит коммиты и теги git, а также отправит файл .gem на rubygems.org.
AWS Recon был вдохновлён отличной работой людей и команд, стоящих за этими инструментами: