Um scanner de segurança AWS baseado em terminal com mais de 102 verificações de segurança em VPC, IAM, S3, CloudTrail, contêineres (ECS/EKS) e detecção de ataques de IA. Detecta permissões IAM perigosas, segredos expostos, buckets S3 mal configurados, vulnerabilidades em contêineres e ameaças emergentes de LLMjacking.
Um Scanner de Segurança AWS baseado em terminal com mais de 100 verificações de segurança em VPC, IAM, S3, CloudTrail, contêineres (ECS/EKS) e detecção de ataques de IA. Detecta permissões IAM perigosas, segredos expostos, buckets S3 mal configurados, vulnerabilidades em contêineres e ameaças emergentes de LLMjacking.
Visão geral do produto: docs/CAPABILITIES_OVERVIEW.md
*:*).env, .git, credenciais)Baseado em inteligência de ameaças de fevereiro de 2025: violação AWS de 8 minutos
| Categoria | Contagem |
|---|---|
| Núcleo (IAM, VPC, S3, CloudTrail, Segredos) | 38 |
| Estendido (Lambda, ELB, Route53, Inspector, etc.) | 35 |
| Segurança de Contêineres (ECS + EKS) | 22 |
| Detecção de Ataques de IA | 7 |
| Total | 102 |
| Verificação | Severidade | Descrição |
|---|---|---|
| Escalação de Privilégios | 🔴 Crítico | Usuário pode escalar para administrador |
| Acesso de Administrador (:) | 🔴 Crítico | Acesso total AWS concedido |
| Segredos Expostos | 🔴 Crítico | Chaves/tokens de API no Lambda/EC2 |
| Bucket S3 Público | 🔴 Crítico | Bucket acessível publicamente |
| Sem CloudTrail | 🔴 Crítico | Sem registro de auditoria |
| SSH/RDP Abertos | 🔴 Crítico | Porta 22/3389 para internet |
| Contêiner Privilegiado | 🔴 Crítico | Contêiner ECS com acesso root |
| GPU IMDSv1 | 🔴 Crítico | Credenciais de instância GPU vulneráveis |
| Confiança entre Contas | 🟠 Alto | Conta externa pode assumir papel |
| Endpoint Público do EKS | 🟠 Alto | API Kubernetes acessível publicamente |
| Bedrock sem Registro | 🟠 Alto | Uso do modelo de IA não auditado |
# 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
# ou use perfis nomeados
aws configure --profile myprofile
Suas credenciais AWS devem ter acesso somente leitura aos serviços que estão sendo varridos. A política gerenciada AWS ReadOnlyAccess funciona, ou veja Permissões AWS Necessárias abaixo.
Nota: aws-perimeter realiza apenas operações de leitura e nunca modifica seus recursos AWS.
curl -sSfL https://raw.githubusercontent.com/thirukguru/aws-perimeter/main/install.sh | sh
go install github.com/thirukguru/aws-perimeter@latest
aws-perimeter # Executar varredura de segurança completa
aws-perimeter --output json # Saída JSON
aws-perimeter --profile prod # Perfil AWS específico
aws-perimeter --region us-west-2 # Região específica
aws-perimeter --regions us-east-1,us-west-2 # Varredura multirregião
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 # Multirregião com concorrência controlada
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 --best-effort # Sair com sucesso se pelo menos uma região for bem-sucedida
aws-perimeter --rules # Imprimir RULES.md no stdout (Markdown)
aws-perimeter --capabilities # Imprimir visão geral de capacidades no stdout (Markdown)
aws-perimeter --all-regions # Varrer todas as regiões habilitadas
aws-perimeter --org-scan --org-role-name OrganizationAccountAccessRole # Varredura de organização multi-conta
aws-perimeter --org-scan --max-parallel 5 # Concorrência de fanout org+região
aws-perimeter --output html --output-file report.html # Gerar relatório HTML
aws-perimeter --store --profile prod --region us-west-2 # Executar + persistir varredura
aws-perimeter --trends --trend-days 30 --account-id 123456789012 # Mostrar tabela de tendências históricas
aws-perimeter history list --db-path ~/.aws-perimeter/history.db
aws-perimeter dashboard --port 8080
Para modos fanout (--regions, --all-regions, --org-scan) com --output html --output-file ..., aws-perimeter escreve um relatório por unidade de varredura com sufixos de região/conta e timestamp (por exemplo security-report-us-east-1-20260210-213045.html ou security-report-123456789012-us-east-1-20260210-213045.html).
No modo HTML, a saída da tabela do terminal é suprimida e apenas linhas de resumo concisas são impressas.
Quando --output json é usado, o aws-perimeter emite um único documento JSON válido sem ruído de banner/spinner, tornando-o seguro para pipelines.
aws-perimeter --profile prod --region us-west-2 --output json | jq .
# JSON multirregião emite um documento JSON agregado de nível superior:
aws-perimeter --profile prod --regions us-east-1,us-west-2 --output json | jq .
# exportar docs via redirecionamento stdout
aws-perimeter --rules > rules.md
aws-perimeter --capabilities > capabilities.md
O payload JSON multirregião inclui:
summary (total_regions, success, failed, skipped)results (cargas de varredura consolidadas por região)failures (região + detalhes do erro quando uma varredura de região falha)Para varreduras multirregião e de organização em modos de saída não JSON, aws-perimeter imprime um resumo consolidado no final da execução:
account_id, account_name, region, status, duration e error.TOTAL, SUCCESS, FAILED, SKIPPED).--max-parallel e --best-effort--max-parallel controla quantas unidades de varredura de região/conta são executadas concorrentemente em modos fanout (--regions, --all-regions, --org-scan).--max-parallel 3 ou --max-parallel 4.--best-effort se aplica a varreduras multirregião: o comando sai com sucesso (0) quando pelo menos uma região é bem-sucedida, mesmo que algumas regiões falhem.--best-effort, qualquer região com falha retorna um código de saída diferente de zero.failures com o erro exato.| Flag | Abreviado | Descrição |
|---|---|---|
--profile | -p | Perfil AWS a usar |
--region | -r | Região AWS |
--regions | Regiões separadas por vírgula | |
--all-regions | Varrer todas as regiões habilitadas | |
--org-scan | Varrer todas as contas ativas da Organização AWS | |
--org-role-name | Nome do papel IAM a assumir nas contas membro | |
--external-id | ID externo para assumir papel entre contas | |
--output | -o | Formato de saída: table, json ou html |
--rules | Imprimir catálogo de regras em Markdown e sair | |
--capabilities | Imprimir capacidades em Markdown e sair | |
--output-file | -f | Arquivo de saída (obrigatório para html) |
--store | Persistir resultados da varredura no SQLite | |
--db-path | Caminho personalizado do banco SQLite | |
--trends | Mostrar tendências históricas | |
--trend-days | Janela de tendências em dias (padrão 30) | |
--compare | Comparar duas varreduras recentes | |
--export-json | Exportar arquivo JSON de tendências | |
--export-csv | Exportar arquivo CSV de tendências | |
--account-id | Filtro de conta para tendências/histórico | |
As seguintes permissões são necessárias para cobertura completa de funcionalidades (incluindo varredura multirregião e de organização):
{
"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 é necessário apenas ao varrer objetos/pacotes criptografados (por exemplo, leituras de objetos S3 SSE-KMS). Escopar isso para as chaves KMS necessárias em produção.
Para --org-scan, o principal de gerenciamento deve ter permissão para assumir um papel de conta membro (padrão: OrganizationAccountAccessRole), por exemplo:
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
}
A política de confiança do papel da conta membro também deve permitir que seu principal de varredura (usuário/papel) o assuma (e incluir condição sts:ExternalId se você usar --external-id).
Dica: Para início rápido, anexe a política gerenciada AWS
arn:aws:iam::aws:policy/ReadOnlyAccessao seu usuário/papel IAM.
| Fase | Status | Regras |
|---|---|---|
| Fase 1 | ✅ Completa | 73 |
| Fase 2 | 🔲 Em Andamento | +20 |
| Fase 2.5 | 🆕 Detecção de Ataques de IA | +13 |
| Fase 3 | 🔲 Planejada | +15 |
| Fase 4 | 🔲 Planejada | Recursos |
Apache License 2.0
--max-parallel| Máx. unidades de varredura de região/conta simultâneas |
--best-effort | Para varreduras multirregião, retornar sucesso se pelo menos uma região for bem-sucedida |
--dry-run | Modo de pré-visualização de remediação |
--remediate | Aplicar remediações suportadas |
--dashboard-port | Porta do dashboard (flag raiz; subcomando dashboard usa --port) |
--version | -v | Informações de versão |