
Терминальный сканер безопасности AWS с более чем 102 проверками безопасности по VPC, IAM, S3, CloudTrail, контейнерам (ECS/EKS) и обнаружению AI-атак. Обнаруживает опасные разрешения IAM, раскрытые секреты, неправильно настроенные корзины S3, уязвимости контейнеров и возникающие угрозы LLMjacking.
Терминальный AWS Security Scanner с 100+ проверками безопасности по VPC, IAM, S3, CloudTrail, контейнерам (ECS/EKS) и обнаружением AI-атак. Обнаруживает опасные разрешения IAM, раскрытые секреты, неправильно настроенные S3-бакеты, уязвимости контейнеров и новые угрозы LLMjacking.
Обзор продукта: docs/CAPABILITIES_OVERVIEW.md
*:*).env, .git, учётные данные)Основано на разведданных об угрозах за февраль 2025: взлом AWS за 8 минут
| Категория | Количество |
|---|---|
| Основные (IAM, VPC, S3, CloudTrail, Секреты) |
# macOS
brew install awscli
# Linux
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip && sudo ./aws/install
aws configure
# или используйте именованные профили
aws configure --profile myprofile
Ваши учётные данные AWS должны иметь доступ только на чтение к сканируемым сервисам. Управляемая политика AWS ReadOnlyAccess подходит, или см. Необходимые разрешения ниже.
Примечание: aws-perimeter выполняет только операции чтения и никогда не изменяет ваши ресурсы AWS.
curl -sSfL https://raw.githubusercontent.com/thirukguru/aws-perimeter/main/install.sh | sh
go install github.com/thirukguru/aws-perimeter@latest
aws-perimeter # Запустить полное сканирование безопасности
aws-perimeter --output json # Вывод в JSON
aws-perimeter --profile prod # Указать профиль AWS
aws-perimeter --region us-west-2 # Указать регион
aws-perimeter --regions us-east-1,us-west-2 # Мультирегиональное сканирование
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 # Мультирегиональное с контролем параллелизма
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 --best-effort # Выход с успехом, если хотя бы один регион успешен
aws-perimeter --rules # Вывести RULES.md в stdout (Markdown)
aws-perimeter --capabilities # Вывести обзор возможностей в stdout (Markdown)
aws-perimeter --all-regions # Сканировать все включённые регионы
aws-perimeter --org-scan --org-role-name OrganizationAccountAccessRole # Мультиаккаунтное сканирование организации
aws-perimeter --org-scan --max-parallel 5 # Параллелизм организация+регионы
aws-perimeter --output html --output-file report.html # Сгенерировать HTML-отчёт
aws-perimeter --store --profile prod --region us-west-2 # Запустить + сохранить результат
aws-perimeter --trends --trend-days 30 --account-id 123456789012 # Показать таблицу исторических трендов
aws-perimeter history list --db-path ~/.aws-perimeter/history.db
aws-perimeter dashboard --port 8080
Для режимов разветвления (--regions, --all-regions, --org-scan) с --output html --output-file ... aws-perimeter записывает по одному отчёту на единицу сканирования с суффиксами региона/аккаунта и временной метки (например, security-report-us-east-1-20260210-213045.html или security-report-123456789012-us-east-1-20260210-213045.html).
В HTML-режиме табличный вывод в терминал подавляется, выводятся только краткие сводные строки.
При использовании --output json aws-perimeter выдаёт единый валидный JSON-документ без баннеров/индикаторов загрузки, поэтому безопасен для конвейеров.
aws-perimeter --profile prod --region us-west-2 --output json | jq .
# Мультирегиональный JSON выдаёт один агрегированный JSON-документ верхнего уровня:
aws-perimeter --profile prod --regions us-east-1,us-west-2 --output json | jq .
# экспорт документации через перенаправление stdout
aws-perimeter --rules > rules.md
aws-perimeter --capabilities > capabilities.md
Мультирегиональный JSON включает:
summary (total_regions, success, failed, skipped)results (консолидированные данные сканирования по регионам)failures (регион + детали ошибки, если сканирование региона не удалось)Для мультирегиональных сканирований и сканирований организации в не-JSON режимах вывода aws-perimeter печатает сводную таблицу в конце выполнения:
account_id, account_name, region, status, duration и error.TOTAL, SUCCESS, FAILED, SKIPPED).--max-parallel и --best-effort--max-parallel управляет количеством единиц сканирования (регион/аккаунт), выполняемых одновременно в режимах разветвления (--regions, --all-regions, --org-scan).--max-parallel 3 или --max-parallel 4.--best-effort применяется к мультирегиональным сканированиям: команда завершается успехом (0), когда хотя бы один регион успешен, даже если некоторые регионы завершились ошибкой.--best-effort любой регион с ошибкой возвращает ненулевой код завершения.failures с точным описанием ошибки.Следующие разрешения необходимы для полного покрытия функциональности (включая мультирегиональное сканирование и сканирование организации):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:GetCallerIdentity",
"sts:AssumeRole",
"organizations:DescribeOrganization",
"organizations:ListAccounts",
"ec2:Describe*",
"ec2:GetEbsEncryptionByDefault",
"iam:List*",
"iam:Get*",
"iam:GenerateCredentialReport",
"s3:ListAllMyBuckets",
"s3:GetBucket*",
"s3:GetEncryptionConfiguration",
"cloudtrail:DescribeTrails",
"cloudtrail:GetTrailStatus",
"cloudtrail:LookupEvents",
"lambda:ListFunctions",
"lambda:GetFunctionConfiguration",
"lambda:GetFunction",
"ecr:DescribeRepositories",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer",
"ecs:ListClusters",
"ecs:DescribeClusters",
"ecs:ListServices",
"ecs:DescribeServices",
"ecs:DescribeTaskDefinition",
"eks:ListClusters",
"eks:DescribeCluster",
"eks:ListNodegroups",
"eks:DescribeNodegroup",
"bedrock:ListProvisionedModelThroughputs",
"bedrock:ListCustomModels",
"bedrock:GetModelInvocationLoggingConfiguration",
"guardduty:ListDetectors",
"guardduty:GetDetector",
"guardduty:ListFindings",
"guardduty:GetFindings",
"securityhub:DescribeHub",
"securityhub:GetFindings",
"config:Describe*",
"kms:ListKeys",
"kms:DescribeKey",
"kms:GetKeyRotationStatus",
"kms:Decrypt",
"rds:DescribeDB*",
"dynamodb:ListTables",
"dynamodb:DescribeTable",
"dynamodb:DescribeContinuousBackups",
"secretsmanager:ListSecrets",
"elasticloadbalancing:Describe*",
"backup:List*",
"apigateway:GET",
"cloudfront:List*",
"cloudfront:Get*",
"cloudwatch:GetMetricStatistics",
"sns:ListTopics",
"sqs:ListQueues"
],
"Resource": "*"
}
]
}
kms:Decrypt требуется только при сканировании зашифрованных объектов/пакетов (например, чтение объектов S3 с SSE-KMS). В production ограничьте эту операцию необходимыми ключами KMS.
Для --org-scan управляющий участник должен иметь разрешение принимать роль аккаунта-участника (по умолчанию OrganizationAccountAccessRole), например:
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
}
Политика доверия роли аккаунта-участника также должна разрешать вашему субъекту (пользователю/роли) принимать эту роль (и включать условие sts:ExternalId, если вы используете --external-id).
Совет: Для быстрого старта прикрепите управляемую политику AWS
arn:aws:iam::aws:policy/ReadOnlyAccessк вашему IAM-пользователю/роли.
Apache License 2.0
| 38 |
| Расширенные (Lambda, ELB, Route53, Inspector и др.) | 35 |
| Безопасность контейнеров (ECS + EKS) | 22 |
| Обнаружение AI-атак | 7 |
| Всего | 102 |
| Проверка | Серьёзность | Описание |
|---|
| Эскалация привилегий | 🔴 Критический | Пользователь может повысить права до администратора |
| Административный доступ (:) | 🔴 Критический | Предоставлен полный доступ к AWS |
| Раскрытые секреты | 🔴 Критический | Ключи API/токены в Lambda/EC2 |
| Публичный S3-бакет | 🔴 Критический | Бакет общедоступен |
| Отсутствие CloudTrail | 🔴 Критический | Нет аудита логирования |
| Открытые SSH/RDP | 🔴 Критический | Порты 22/3389 в интернет |
| Привилегированный контейнер | 🔴 Критический | Контейнер ECS с root-доступом |
| GPU IMDSv1 | 🔴 Критический | Учётные данные GPU-инстанса уязвимы |
| Доверие между аккаунтами | 🟠 Высокий | Внешний аккаунт может принять роль |
| Публичный endpoint EKS | 🟠 Высокий | Kubernetes API общедоступен |
| Отсутствие логирования Bedrock | 🟠 Высокий | Использование AI-моделей не аудируется |
| Флаг | Сокращение | Описание |
|---|
--profile | -p | Используемый профиль AWS |
--region | -r | Регион AWS |
--regions | Регионы через запятую | |
--all-regions | Сканировать все включённые регионы | |
--org-scan | Сканировать все активные аккаунты AWS Organization | |
--org-role-name | Имя IAM-роли для принятия в аккаунтах-участниках | |
--external-id | Внешний ID для принятия роли между аккаунтами | |
--output | -o | Формат вывода: table, json или html |
--rules | Вывести каталог правил в Markdown и выйти | |
--capabilities | Вывести возможности в Markdown и выйти | |
--output-file | -f | Файл вывода (обязателен для html) |
--store | Сохранить результаты сканирования в SQLite | |
--db-path | Пользовательский путь к БД SQLite | |
--trends | Показать исторические тренды | |
--trend-days | Окно тренда в днях (по умолчанию 30) | |
--compare | Сравнить два последних сканирования | |
--export-json | Экспортировать файл трендов JSON | |
--export-csv | Экспортировать файл трендов CSV | |
--account-id | Фильтр по аккаунту для трендов/истории | |
--max-parallel | Максимальное количество параллельных единиц сканирования регион/аккаунт | |
--best-effort | Для мультирегиональных сканирований — возврат успеха, если хотя бы один регион успешен | |
--dry-run | Режим предварительного просмотра исправлений | |
--remediate | Применить поддерживаемые исправления | |
--dashboard-port | Порт панели управления (корневой флаг; подкоманда dashboard использует --port) | |
--version | -v | Информация о версии |
| Фаза | Статус | Правила |
|---|
| Фаза 1 | ✅ Завершена | 73 |
| Фаза 2 | 🔲 В процессе | +20 |
| Фаза 2.5 | 🆕 Обнаружение AI-атак | +13 |
| Фаза 3 | 🔲 Запланировано | +15 |
| Фаза 4 | 🔲 Запланировано | Функции |