Ein terminalbasierter AWS-Sicherheitsscanner mit über 102 Sicherheitsprüfungen in den Bereichen VPC, IAM, S3, CloudTrail, Container (ECS/EKS) und KI-Angriffserkennung. Erkennt gefährliche IAM-Berechtigungen, exponierte Secrets, falsch konfigurierte S3-Buckets, Container-Sicherheitslücken und neuartige LLMjacking-Bedrohungen.
Ein terminalbasierter AWS-Sicherheitsscanner mit 100+ Sicherheitsprüfungen in den Bereichen VPC, IAM, S3, CloudTrail, Container (ECS/EKS) und KI-Angriffserkennung. Erkennt gefährliche IAM-Berechtigungen, offengelegte Geheimnisse, falsch konfigurierte S3-Buckets, Containerschwachstellen und aufkommende LLMjacking-Bedrohungen.
Produktübersicht: docs/CAPABILITIES_OVERVIEW.md
*:*).env, .git, Anmeldeinformationen)Basierend auf Bedrohungsinformationen vom Februar 2025: 8-minütiger AWS-Einbruch
| Kategorie | Anzahl |
|---|---|
| Kern (IAM, VPC, S3, CloudTrail, Secrets) | 38 |
| Erweitert (Lambda, ELB, Route53, Inspector, etc.) | 35 |
| Containersicherheit (ECS + EKS) | 22 |
| KI-Angriffserkennung | 7 |
| Gesamt | 102 |
| Prüfung | Schweregrad | Beschreibung |
|---|---|---|
| Berechtigungserweiterung | 🔴 Kritisch | Benutzer kann zu Admin aufsteigen |
| Admin-Zugriff (:) | 🔴 Kritisch | Vollständiger AWS-Zugriff gewährt |
| Offengelegte Geheimnisse | 🔴 Kritisch | API-Schlüssel/Tokens in Lambda/EC2 |
| Öffentlicher S3-Bucket | 🔴 Kritisch | Bucket öffentlich zugänglich |
| Kein CloudTrail | 🔴 Kritisch | Keine Überwachungsprotokollierung |
| Offene SSH/RDP | 🔴 Kritisch | Port 22/3389 ins Internet |
| Privilegierter Container | 🔴 Kritisch | ECS-Container mit Root-Zugriff |
| GPU IMDSv1 | 🔴 Kritisch | GPU-Instanz-Anmeldeinformationen gefährdet |
| Kontoübergreifendes Vertrauen | 🟠 Hoch | Externes Konto kann Rolle übernehmen |
| EKS-Öffentlicher Endpunkt | 🟠 Hoch | Kubernetes-API öffentlich zugänglich |
| Bedrock keine Protokollierung | 🟠 Hoch | KI-Modellnutzung nicht geprüft |
# 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
# oder mit benannten Profilen
aws configure --profile myprofile
Ihre AWS-Anmeldeinformationen müssen schreibgeschützten Zugriff auf die gescannten Dienste haben. Die von AWS verwaltete Richtlinie ReadOnlyAccess funktioniert, oder siehe Erforderliche Berechtigungen unten.
Hinweis: aws-perimeter führt nur Leseoperationen durch und ändert niemals Ihre AWS-Ressourcen.
curl -sSfL https://raw.githubusercontent.com/thirukguru/aws-perimeter/main/install.sh | sh
go install github.com/thirukguru/aws-perimeter@latest
aws-perimeter # Run full security scan
aws-perimeter --output json # JSON output
aws-perimeter --profile prod # Specific AWS profile
aws-perimeter --region us-west-2 # Specific region
aws-perimeter --regions us-east-1,us-west-2 # Multi-region scan
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 # Multi-region with controlled concurrency
aws-perimeter --regions us-east-1,us-west-2 --max-parallel 4 --best-effort # Exit success if at least one region succeeds
aws-perimeter --rules # Print RULES.md to stdout (Markdown)
aws-perimeter --capabilities # Print capabilities overview to stdout (Markdown)
aws-perimeter --all-regions # Scan all enabled regions
aws-perimeter --org-scan --org-role-name OrganizationAccountAccessRole # Multi-account org scan
aws-perimeter --org-scan --max-parallel 5 # Org+region fanout concurrency
aws-perimeter --output html --output-file report.html # Generate HTML report
aws-perimeter --store --profile prod --region us-west-2 # Run + persist scan
aws-perimeter --trends --trend-days 30 --account-id 123456789012 # Show historical trend table
aws-perimeter history list --db-path ~/.aws-perimeter/history.db
aws-perimeter dashboard --port 8080
Bei Fanout-Modi (--regions, --all-regions, --org-scan) mit --output html --output-file ... schreibt aws-perimeter einen Bericht pro Scan-Einheit mit Region/Konto + Zeitstempel-Suffixen (z.B. security-report-us-east-1-20260210-213045.html oder security-report-123456789012-us-east-1-20260210-213045.html).
Im HTML-Modus wird die terminale Tabellenausgabe unterdrückt und es werden nur prägnante Zusammenfassungszeilen ausgegeben.
Wenn --output json verwendet wird, gibt aws-perimeter ein einzelnes gültiges JSON-Dokument ohne Banner-/Spinner-Rauschen aus, sodass es sicher für Pipelines ist.
aws-perimeter --profile prod --region us-west-2 --output json | jq .
# Multi-region JSON emits one aggregated top-level JSON document:
aws-perimeter --profile prod --regions us-east-1,us-west-2 --output json | jq .
# export docs via stdout redirection
aws-perimeter --rules > rules.md
aws-perimeter --capabilities > capabilities.md
Das mehrregionale JSON-Payload enthält:
summary (total_regions, success, failed, skipped)results (konsolidierte Scan-Payloads pro Region)failures (Region + Fehlerdetails, wenn ein Regionsscan fehlschlägt)Für mehrregionale und Organisationsscans in Nicht-JSON-Ausgabemodi druckt aws-perimeter am Ende der Ausführung eine konsolidierte Zusammenfassung:
account_id, account_name, region, status, duration und error.TOTAL, SUCCESS, FAILED, SKIPPED).--max-parallel und --best-effort--max-parallel steuert, wie viele Regions-/Konto-Scan-Einheiten gleichzeitig in Fanout-Modi (--regions, --all-regions, --org-scan) ausgeführt werden.--max-parallel 3 oder --max-parallel 4.--best-effort gilt für mehrregionale Scans: Der Befehl wird mit Erfolg (0) beendet, wenn mindestens eine Region erfolgreich ist, auch wenn einige Regionen fehlschlagen.--best-effort wird für jede fehlgeschlagene Region ein Exit-Code ungleich Null zurückgegeben.failures mit dem genauen Fehler.| Flag | Kurz | Beschreibung |
|---|---|---|
--profile | -p | Zu verwendendes AWS-Profil |
--region | -r | AWS-Region |
--regions | Kommagetrennte Regionen | |
--all-regions | Alle aktivierten Regionen scannen | |
--org-scan | Alle aktiven AWS-Organisationskonten scannen | |
--org-role-name | IAM-Rollenname, der in Mitgliedskonten angenommen werden soll | |
--external-id | Externe ID für kontoübergreifende Rollenübernahme | |
--output | -o | Ausgabeformat: table, json oder html |
--rules | Regelkatalog als Markdown ausgeben und beenden | |
--capabilities | Fähigkeiten als Markdown ausgeben und beenden | |
--output-file | -f | Ausgabedatei (erforderlich für html) |
--store | Scan-Ergebnisse in SQLite persistieren | |
--db-path | Benutzerdefinierter SQLite-DB-Pfad | |
--trends | Historische Trends anzeigen | |
--trend-days | Trendfenster in Tagen (Standard 30) | |
--compare | Zwei aktuelle Scans vergleichen | |
--export-json | Trends als JSON-Datei exportieren | |
--export-csv | Trends als CSV-Datei exportieren | |
--account-id | Kontofilter für Trends/Verlauf | |
--max-parallel |
Die folgenden Berechtigungen werden für die vollständige Funktionsabdeckung (einschließlich mehrregionaler und Organisationsscans) benötigt:
{
"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 wird nur beim Scannen verschlüsselter Objekte/Pakete benötigt (z.B. SSE-KMS S3-Objektlesevorgänge). Beschränken Sie dies in der Produktion auf die erforderlichen KMS-Schlüssel.
Für --org-scan muss der Verwaltungsprinzipal berechtigt sein, eine Mitgliedskonto-Rolle anzunehmen (Standard: OrganizationAccountAccessRole), z.B.:
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/OrganizationAccountAccessRole"
}
Die Vertrauensrichtlinie der Mitgliedskonto-Rolle muss ebenfalls zulassen, dass Ihr Scanner-Prinzipal (Benutzer/Rolle) sie annimmt (und eine sts:ExternalId-Bedingung einschließen, wenn Sie --external-id verwenden).
Tipp: Für einen schnellen Start hängen Sie die von AWS verwaltete Richtlinie
arn:aws:iam::aws:policy/ReadOnlyAccessan Ihren IAM-Benutzer/Ihre IAM-Rolle an.
| Phase | Status | Regeln |
|---|---|---|
| Phase 1 | ✅ Abgeschlossen | 73 |
| Phase 2 | 🔲 In Bearbeitung | +20 |
| Phase 2.5 | 🆕 KI-Angriffserkennung | +13 |
| Phase 3 | 🔲 Geplant | +15 |
| Phase 4 | 🔲 Geplant | Funktionen |
Apache-Lizenz 2.0
| Maximale gleichzeitige Regions-/Konto-Scan-Einheiten |
--best-effort | Bei mehrregionalen Scans Erfolg zurückgeben, wenn mindestens eine Region erfolgreich ist |
--dry-run | Vorschaumodus für Abhilfemaßnahmen |
--remediate | Unterstützte Abhilfemaßnahmen anwenden |
--dashboard-port | Dashboard-Port (Root-Flag; Dashboard-Unterbefehl verwendet --port) |
--version | -v | Versionsinformationen |