Uno scanner di sicurezza AWS basato su terminale con oltre 102 controlli di sicurezza su VPC, IAM, S3, CloudTrail, container (ECS/EKS) e rilevamento di attacchi AI. Rileva permessi IAM pericolosi, segreti esposti, bucket S3 configurati in modo errato, vulnerabilità dei container e minacce emergenti LLMjacking.
Uno Scanner di Sicurezza AWS basato su terminale con oltre 100 controlli di sicurezza su VPC, IAM, S3, CloudTrail, container (ECS/EKS) e rilevamento di attacchi AI. Rileva permessi IAM pericolosi, segreti esposti, bucket S3 malconfigurati, vulnerabilità dei container e minacce emergenti di LLMjacking.
Panoramica del prodotto: docs/CAPABILITIES_OVERVIEW.md
*:*).env, .git, credenziali)Basato su intelligence sulle minacce di febbraio 2025: violazione AWS in 8 minuti
| Categoria | Conteggio |
|---|---|
| Core (IAM, VPC, S3, CloudTrail, Segreti) | 38 |
| Estesi (Lambda, ELB, Route53, Inspector, ecc.) | 35 |
| Sicurezza Container (ECS + EKS) | 22 |
| Rilevamento Attacchi AI | 7 |
| Totale | 102 |
| Controllo | Gravità | Descrizione |
|---|---|---|
| Escalation Privilegi | 🔴 Critico | L'utente può escalare ad admin |
| Accesso Admin (:) | 🔴 Critico | Accesso completo AWS concesso |
| Segreti Esposti | 🔴 Critico | Chiavi API/token in Lambda/EC2 |
| Bucket S3 Pubblico | 🔴 Critico | Bucket accessibile pubblicamente |
| Nessun CloudTrail | 🔴 Critico | Nessun logging di audit |
| SSH/RDP Aperti | 🔴 Critico | Porta 22/3389 verso internet |
| Container Privilegiato | 🔴 Critico | Container ECS con accesso root |
| GPU IMDSv1 | 🔴 Critico | Credenziali istanza GPU vulnerabili |
| Trust Cross-Account | 🟠 Alto | Account esterno può assumere ruolo |
| Endpoint Pubblico EKS | 🟠 Alto | API Kubernetes accessibile pubblicamente |
| Bedrock Nessun Logging | 🟠 Alto | Utilizzo modello AI non auditato |
# 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
# oppure utilizza profili nominativi
aws configure --profile myprofile
Le tue credenziali AWS devono avere accesso di sola lettura ai servizi sottoposti a scansione. La policy gestita AWS ReadOnlyAccess funziona, oppure consulta Permessi Richiesti qui sotto.
Nota: aws-perimeter esegue solo operazioni di lettura e non modifica mai le tue risorse AWS.
curl -sSfL https://raw.githubusercontent.com/thirukguru/aws-perimeter/main/install.sh | sh
go install github.com/thirukguru/aws-perimeter@latest
aws-perimeter # Esegue scansione di sicurezza completa
aws-perimeter --output json # Output JSON
aws-perimeter --profile prod # Profilo AWS specifico
aws-perimeter --region us-west-2 # Regione specifica
aws-perimeter --regions us-east-1,us-west-2 # Scansione multi-regione
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 # Multi-regione con concorrenza controllata
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 --best-effort # Esce con successo se almeno una regione ha successo
aws-perimeter --rules # Stampa RULES.md su stdout (Markdown)
aws-perimeter --capabilities # Stampa panoramica capacità su stdout (Markdown)
aws-perimeter --all-regions # Scansiona tutte le regioni abilitate
aws-perimeter --org-scan --org-role-name OrganizationAccountAccessRole # Scansione org multi-account
aws-perimeter --org-scan --max-parallel 5 # Concorrenza org+regione fanout
aws-perimeter --output html --output-file report.html # Genera report HTML
aws-perimeter --store --profile prod --region us-west-2 # Esegui + persisti scansione
aws-perimeter --trends --trend-days 30 --account-id 123456789012 # Mostra tabella trend storici
aws-perimeter history list --db-path ~/.aws-perimeter/history.db
aws-perimeter dashboard --port 8080
Per le modalità fanout (--regions, --all-regions, --org-scan) con --output html --output-file ..., aws-perimeter scrive un report per unità di scansione con suffissi regione/account + timestamp (ad esempio security-report-us-east-1-20260210-213045.html o security-report-123456789012-us-east-1-20260210-213045.html).
In modalità HTML, l'output della tabella terminale viene soppresso e vengono stampate solo righe di riepilogo concise.
Quando si utilizza --output json, aws-perimeter emette un singolo documento JSON valido senza banner/rumore di spinner, quindi è sicuro per pipeline.
aws-perimeter --profile prod --region us-west-2 --output json | jq .
# Multi-regione JSON emette un unico documento JSON aggregato di primo livello:
aws-perimeter --profile prod --regions us-east-1,us-west-2 --output json | jq .
# esporta documenti tramite reindirizzamento stdout
aws-perimeter --rules > rules.md
aws-perimeter --capabilities > capabilities.md
Il payload JSON multi-regione include:
summary (total_regions, success, failed, skipped)results (carichi di scansione consolidati per regione)failures (regione + dettagli errore quando una scansione di regione fallisce)Per scansioni multi-regione e org in modalità di output non JSON, aws-perimeter stampa un riepilogo consolidato alla fine dell'esecuzione:
account_id, account_name, region, status, duration e error.TOTAL, SUCCESS, FAILED, SKIPPED).--max-parallel e --best-effort--max-parallel controlla quante unità di scansione regione/account vengono eseguite contemporaneamente nelle modalità fanout (--regions, --all-regions, --org-scan).--max-parallel 3 o --max-parallel 4.--best-effort si applica alle scansioni multi-regione: il comando esce con successo (0) quando almeno una regione ha successo, anche se alcune regioni falliscono.--best-effort, qualsiasi regione fallita restituisce un codice di uscita non zero.failures con l'errore esatto.| Flag | Short | Descrizione |
|---|---|---|
--profile | -p | Profilo AWS da utilizzare |
--region | -r | Regione AWS |
--regions | Regioni separate da virgola | |
--all-regions | Scansiona tutte le regioni abilitate | |
--org-scan | Scansiona tutti gli account attivi dell'organizzazione AWS | |
--org-role-name | Nome del ruolo IAM da assumere negli account membri | |
--external-id | External ID per assume role cross-account | |
--output | -o | Formato output: table, json o html |
--rules | Stampa catalogo regole Markdown ed esci | |
--capabilities | Stampa capacità Markdown ed esci | |
--output-file | -f | File di output (richiesto per html) |
--store | Persisti risultati scansione in SQLite | |
--db-path | Percorso SQLite personalizzato | |
--trends | Mostra trend storici | |
--trend-days | Finestra trend in giorni (default 30) | |
--compare | Confronta due scansioni recenti | |
--export-json | Esporta file JSON trend | |
--export-csv | Esporta file CSV trend | |
--account-id | Filtro account per trend/storico | |
--max-parallel |
I seguenti permessi sono richiesti per la copertura completa delle funzionalità (inclusa scansione multi-regione e org):
{
"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 è richiesto solo quando si scansionano oggetti/pacchetti crittografati (ad esempio letture oggetti S3 SSE-KMS). Limitare a chiavi KMS richieste in produzione.
Per --org-scan, il principal di gestione deve essere autorizzato ad assumere un ruolo negli account membri (default: OrganizationAccountAccessRole), ad esempio:
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
}
La policy di trust del ruolo nell'account membro deve anche consentire al tuo principal scanner (utente/ruolo) di assumerlo (e includere la condizione sts:ExternalId se usi --external-id).
Suggerimento: Per un avvio rapido, allega la policy gestita AWS
arn:aws:iam::aws:policy/ReadOnlyAccessal tuo utente/ruolo IAM.
| Fase | Stato | Regole |
|---|---|---|
| Fase 1 | ✅ Completata | 73 |
| Fase 2 | 🔲 In Corso | +20 |
| Fase 2.5 | 🆕 Rilevamento Attacchi AI | +13 |
| Fase 3 | 🔲 Pianificata | +15 |
| Fase 4 | 🔲 Pianificata | Funzionalità |
Apache License 2.0
| Max unità di scansione regione/account concorrenti |
--best-effort | Per scansioni multi-regione, restituisci successo se almeno una regione ha successo |
--dry-run | Modalità anteprima remediation |
--remediate | Applica remediation supportate |
--dashboard-port | Porta dashboard (flag radice; sottocomando dashboard usa --port) |
--version | -v | Informazioni versione |