
Un scanner de sécurité AWS en terminal avec plus de 102 vérifications de sécurité couvrant VPC, IAM, S3, CloudTrail, les conteneurs (ECS/EKS) et la détection d'attaques IA. Détecte les autorisations IAM dangereuses, les secrets exposés, les buckets S3 mal configurés, les vulnérabilités de conteneurs et les menaces émergentes de détournement LLM (LLMjacking).
Un scanner de sécurité AWS en terminal avec plus de 100 vérifications de sécurité couvrant VPC, IAM, S3, CloudTrail, les conteneurs (ECS/EKS) et la détection d'attaques IA. Détecte les permissions IAM dangereuses, les secrets exposés, les buckets S3 mal configurés, les vulnérabilités des conteneurs et les menaces émergentes de LLMjacking.
Aperçu du produit : docs/CAPABILITIES_OVERVIEW.md
*:*).env, .git, identifiants)Basé sur le renseignement de menaces de février 2025 : brèche AWS en 8 minutes
| Catégorie | Nombre |
|---|---|
| Core (IAM, VPC, S3, CloudTrail, Secrets) |
# 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 utilisez des profils nommés
aws configure --profile monprofil
Vos identifiants AWS doivent disposer d'un accès en lecture seule aux services scannés. La politique gérée AWS ReadOnlyAccess fonctionne, ou voir Permissions Requises ci-dessous.
Remarque : aws-perimeter n'effectue que des opérations de lecture et ne modifie jamais vos ressources AWS.
curl -sSfL https://raw.githubusercontent.com/thirukguru/aws-perimeter/main/install.sh | sh
go install github.com/thirukguru/aws-perimeter@latest
aws-perimeter # Exécuter un scan de sécurité complet
aws-perimeter --output json # Sortie JSON
aws-perimeter --profile prod # Profil AWS spécifique
aws-perimeter --region us-west-2 # Région spécifique
aws-perimeter --regions us-east-1,us-west-2 # Scan multirégion
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 # Multirégion avec concurrence contrôlée
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 --best-effort # Quitter avec succès si au moins une région réussit
aws-perimeter --rules # Afficher RULES.md sur stdout (Markdown)
aws-perimeter --capabilities # Afficher l'aperçu des capacités sur stdout (Markdown)
aws-perimeter --all-regions # Scanner toutes les régions activées
aws-perimeter --org-scan --org-role-name OrganizationAccountAccessRole # Scan multi-compte de l'organisation
aws-perimeter --org-scan --max-parallel 5 # Concurrence d'éclatement Org+Région
aws-perimeter --output html --output-file report.html # Générer un rapport HTML
aws-perimeter --store --profile prod --region us-west-2 # Exécuter + persister le scan
aws-perimeter --trends --trend-days 30 --account-id 123456789012 # Afficher le tableau de tendances historiques
aws-perimeter history list --db-path ~/.aws-perimeter/history.db
aws-perimeter dashboard --port 8080
Pour les modes d'éclatement (--regions, --all-regions, --org-scan) avec --output html --output-file ..., aws-perimeter écrit un rapport par unité de scan avec des suffixes région/compte et horodatage (par exemple security-report-us-east-1-20260210-213045.html ou security-report-123456789012-us-east-1-20260210-213045.html).
En mode HTML, la sortie du tableau terminal est supprimée et seules des lignes récapitulatives concises sont imprimées.
Lorsque --output json est utilisé, aws-perimeter émet un seul document JSON valide sans bruit de bannière/spinner, donc sûr pour les pipelines.
aws-perimeter --profile prod --region us-west-2 --output json | jq .
# Le JSON multirégion émet un seul document JSON agrégé de premier niveau :
aws-perimeter --profile prod --regions us-east-1,us-west-2 --output json | jq .
# exporter la documentation via redirection stdout
aws-perimeter --rules > rules.md
aws-perimeter --capabilities > capabilities.md
Le payload JSON multirégion inclut :
summary (total_regions, success, failed, skipped)results (charges utiles de scan consolidées par région)failures (région + détails d'erreur en cas d'échec d'un scan régional)Pour les scans multirégion et organisation en modes de sortie non JSON, aws-perimeter imprime un résumé consolidé à la fin de l'exécution :
account_id, account_name, region, status, duration et error.TOTAL, SUCCESS, FAILED, SKIPPED).--max-parallel et --best-effort--max-parallel contrôle le nombre d'unités de scan région/compte exécutées simultanément dans les modes d'éclatement (--regions, --all-regions, --org-scan).--max-parallel 3 ou --max-parallel 4.--best-effort s'applique aux scans multirégion : la commande quitte avec succès (0) quand au moins une région réussit, même si certaines échouent.--best-effort, toute région en échec renvoie un code de sortie non nul.failures avec l'erreur exacte.Les permissions suivantes sont nécessaires pour une couverture complète des fonctionnalités (y compris multirégion et scan d'organisation) :
{
"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 est requis uniquement lors de l'analyse d'objets/packages chiffrés (par exemple, lectures d'objets S3 SSE-KMS). Limitez cette action aux clés KMS nécessaires en production.
Pour --org-scan, le principal de gestion doit être autorisé à assumer un rôle du compte membre (par défaut : OrganizationAccountAccessRole), par exemple :
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
}
La politique de confiance du rôle du compte membre doit également permettre à votre principal de scan (utilisateur/rôle) de l'assumer (et inclure la condition sts:ExternalId si vous utilisez --external-id).
Astuce : Pour un démarrage rapide, attachez la politique gérée AWS
arn:aws:iam::aws:policy/ReadOnlyAccessà votre utilisateur/rôle IAM.
Apache License 2.0
| 38 |
| Étendues (Lambda, ELB, Route53, Inspector, etc.) | 35 |
| Sécurité des Conteneurs (ECS + EKS) | 22 |
| Détection d'Attaques IA | 7 |
| Total | 102 |
| Vérification | Sévérité | Description |
|---|
| Escalade de privilèges | 🔴 Critique | L'utilisateur peut passer administrateur |
| Accès Admin (:) | 🔴 Critique | Accès AWS complet accordé |
| Secrets exposés | 🔴 Critique | Clés API/tokens dans Lambda/EC2 |
| Bucket S3 public | 🔴 Critique | Bucket accessible publiquement |
| Pas de CloudTrail | 🔴 Critique | Aucune journalisation d'audit |
| SSH/RDP ouvert | 🔴 Critique | Ports 22/3389 vers Internet |
| Conteneur privilégié | 🔴 Critique | Conteneur ECS avec accès root |
| GPU IMDSv1 | 🔴 Critique | Identifiants d'instance GPU vulnérables |
| Confiance跨-compte | 🟠 Élevée | Un compte externe peut assumer un rôle |
| Point de terminaison public EKS | 🟠 Élevée | API Kubernetes accessible publiquement |
| Bedrock sans journalisation | 🟠 Élevée | Utilisation du modèle IA non audité |
| Flag | Court | Description |
|---|
--profile | -p | Profil AWS à utiliser |
--region | -r | Région AWS |
--regions | Régions séparées par des virgules | |
--all-regions | Scanner toutes les régions activées | |
--org-scan | Scanner tous les comptes actifs de l'organisation AWS | |
--org-role-name | Nom du rôle IAM à assumer dans les comptes membres | |
--external-id | ID externe pour l'assomption de rôle跨-compte | |
--output | -o | Format de sortie : table, json ou html |
--rules | Afficher le catalogue de règles Markdown et quitter | |
--capabilities | Afficher les capacités Markdown et quitter | |
--output-file | -f | Fichier de sortie (requis pour html) |
--store | Persister les résultats du scan dans SQLite | |
--db-path | Chemin personnalisé de la base SQLite | |
--trends | Afficher les tendances historiques | |
--trend-days | Fenêtre de tendance en jours (par défaut 30) | |
--compare | Comparer deux scans récents | |
--export-json | Exporter le fichier JSON des tendances | |
--export-csv | Exporter le fichier CSV des tendances | |
--account-id | Filtre de compte pour les tendances/historique | |
--max-parallel | Nombre maximal d'unités de scan région/compte simultanées | |
--best-effort | Pour les scans multirégion, retourner succès si au moins une région réussit | |
--dry-run | Mode aperçu de remédiation | |
--remediate | Appliquer les remédiations prises en charge | |
--dashboard-port | Port du tableau de bord (flag racine ; la sous-commande dashboard utilise --port) | |
--version | -v | Informations de version |
| Phase | Statut | Règles |
|---|
| Phase 1 | ✅ Complète | 73 |
| Phase 2 | 🔲 En cours | +20 |
| Phase 2.5 | 🆕 Détection d'Attaques IA | +13 |
| Phase 3 | 🔲 Planifiée | +15 |
| Phase 4 | 🔲 Planifiée | Fonctionnalités |