Was macht AWS S3 Bucket-Berechtigungen prüfen?
Wann verwenden
- Bei der Durchführung einer Sicherheitsbewertung von AWS-Umgebungen, um öffentlich zugängliche Daten zu identifizieren
- Beim Onboarding eines neuen AWS-Kontos und der Etablierung einer Sicherheitsgrundlinie für Speicherressourcen
- Bei der Reaktion auf eine Warnung zu potenzieller S3-Datenexposition von AWS Trusted Advisor oder Security Hub
- Wenn Compliance-Frameworks (SOC 2, PCI DSS, HIPAA) eine regelmäßige Überprüfung der Datenzugriffskontrollen erfordern
- Bei einem Sicherheitsvorfall oder einer Kompromittierung von Zugangsdaten, die eine sofortige Überprüfung aller zugänglichen S3-Ressourcen erforderlich macht
Nicht verwenden für die Prüfung von Nicht-AWS-Objektspeichern (anbieterspezifische Tools verwenden), für Echtzeit-Überwachung (S3 Event Notifications mit Lambda verwenden) oder für die Prüfung von S3-Zugriffsmustern (S3 Access Analyzer oder CloudTrail S3-Datenereignisse verwenden).
Voraussetzungen
- AWS CLI v2 mit Anmeldeinformationen, die Berechtigungen für
s3:GetBucketPolicy,s3:GetBucketAcl,s3:GetBucketPublicAccessBlock,s3:GetEncryptionConfigurationunds3:ListAllMyBucketshaben - Prowler installiert (
pip install prowler) für automatisierte CIS-Benchmark-Prüfungen - S3audit oder ein ähnliches Aufzählungstool für die schnelle Erkennung öffentlicher Buckets
- Zugriff auf AWS Organizations, wenn die Prüfung über mehrere Konten hinweg erfolgt
- Python 3.8+ mit boto3 für benutzerdefinierte Prüfskripte
Arbeitsablauf
Schritt 1: Alle S3-Buckets und den Block Public Access auf Kontoebene auflisten
Prüfen Sie zuerst die S3 Block Public Access-Einstellungen auf Kontoebene und listen Sie dann alle Buckets mit ihren Regionen auf.
# S3 Block Public Access-Einstellungen auf Kontoebene prüfen
aws s3control get-public-access-block \
--account-id $(aws sts get-caller-identity --query Account --output text) \
--output json
# Alle Buckets mit Erstellungsdaten auflisten
aws s3api list-buckets \
--query 'Buckets[*].[Name,CreationDate]' \
--output table
# Regionen für jeden Bucket abrufen
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
region=$(aws s3api get-bucket-location --bucket "$bucket" --query 'LocationConstraint' --output text)
echo "$bucket -> ${region:-us-east-1}"
done
Schritt 2: Public Access Block und ACL-Konfiguration jedes Buckets prüfen
Durchlaufen Sie alle Buckets, um deren individuelle Public Access Blocks und ACL-Zuweisungen zu bewerten.
# Pro-Bucket Block Public Access-Einstellungen prüfen
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
echo "=== $bucket ==="
aws s3api get-public-access-block --bucket "$bucket" 2>/dev/null || echo " Kein Block Public Access konfiguriert"
# ACL auf öffentliche Zuweisungen prüfen
aws s3api get-bucket-acl --bucket "$bucket" \
--query 'Grants[?Grantee.URI==`http://acs.amazonaws.com/groups/global/AllUsers` || Grantee.URI==`http://acs.amazonaws.com/groups/global/AuthenticatedUsers`]' \
--output json
done
Schritt 3: Bucket-Richtlinien auf übermäßig großzügigen Zugriff analysieren
Überprüfen Sie Bucket-Richtlinien auf Wildcard-Prinzipale, fehlende Bedingungen und Anweisungen, die breiten Zugriff erlauben.
# Bucket-Richtlinien extrahieren und analysieren
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
policy=$(aws s3api get-bucket-policy --bucket "$bucket" --output text 2>/dev/null)
if [ -n "$policy" ]; then
echo "=== $bucket Richtlinie ==="
echo "$policy" | python3 -c "
import json, sys
policy = json.load(sys.stdin)
for stmt in policy.get('Statement', []):
principal = stmt.get('Principal', {})
effect = stmt.get('Effect', '')
if principal == '*' or principal == {'AWS': '*'}:
print(f' WARNUNG: {effect} mit Wildcard-Prinzipal')
print(f' Aktionen: {stmt.get(\"Action\", \"\")}')
print(f' Bedingung: {stmt.get(\"Condition\", \"KEINE\")}')
"
fi
done
Schritt 4: Verschlüsselungs- und Versionierungseinstellungen überprüfen
Stellen Sie sicher, dass alle Buckets serverseitige Verschlüsselung und Versionierung für den Datenschutz aktiviert haben.
# Verschlüsselungs- und Versionierungsstatus für alle Buckets prüfen
for bucket in $(aws s3api list-buckets --query 'Buckets[*].Name' --output text); do
echo "=== $bucket ==="
# Verschlüsselungskonfiguration
aws s3api get-bucket-encryption --bucket "$bucket" 2>/dev/null \
&& echo " Verschlüsselung: AKTIVIERT" \
|| echo " Verschlüsselung: DEAKTIVIERT"
# Versionierungsstatus
aws s3api get-bucket-versioning --bucket "$bucket" \
--query 'Status' --output text
# Logging-Status
aws s3api get-bucket-logging --bucket "$bucket" \
--query 'LoggingEnabled' --output text 2>/dev/null
done
Schritt 5: Prowler S3-spezifische Prüfungen ausführen
Führen Sie die auf S3 fokussierten Prüfungen von Prowler aus, die auf den CIS AWS Foundations Benchmark abgestimmt sind.
# Prowler S3-spezifische Prüfungen ausführen
prowler aws \
--checks s3_bucket_public_access \
s3_bucket_default_encryption \
s3_bucket_policy_public_write_access \
s3_bucket_server_access_logging_enabled \
s3_bucket_versioning_enabled \
s3_bucket_acl_prohibited \
-M json-ocsf \
-o ./prowler-s3-audit/
# Zusammenfassung anzeigen
prowler aws --checks s3 -M csv -o ./prowler-s3-audit/
Schritt 6: IAM Access Analyzer für S3-Öffentlichkeits- und Kontoübergreifende Erkenntnisse nutzen
Nutzen Sie den IAM Access Analyzer, um Buckets zu identifizieren, die extern oder öffentlich geteilt werden.
# Access Analyzer-Erkenntnisse für S3 auflisten
aws accessanalyzer list-findings \
--analyzer-arn $(aws accessanalyzer list-analyzers --query 'analyzers[0].arn' --output text) \
--filter '{"resourceType": {"eq": ["AWS::S3::Bucket"]}}' \
--query 'findings[*].[resource,status,condition,principal]' \
--output table
# Analyzer erstellen, falls keiner existiert
aws accessanalyzer create-analyzer \
--analyzer-name s3-access-audit \
--type ACCOUNT
Schritt 7: Prüfbericht erstellen und beheben
Fassen Sie die Erkenntnisse in einem umsetzbaren Bericht zusammen und wenden Sie Abhilfemaßnahmen für kritische Probleme an.
# Schnelle Abhilfe: Block Public Access auf einem Bucket aktivieren
aws s3api put-public-access-block \
--bucket TARGET_BUCKET \
--public-access-block-configuration \
'BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true'
# Standardverschlüsselung mit SSE-S3 aktivieren
aws s3api put-bucket-encryption \
--bucket TARGET_BUCKET \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"aws:kms","KMSMasterKeyID":"alias/aws/s3"},"BucketKeyEnabled":true}]}'
# Versionierung aktivieren
aws s3api put-bucket-versioning \
--bucket TARGET_BUCKET \
--versioning-configuration Status=Enabled
Schlüsselkonzepte
| Begriff | Definition |
|---|---|
| S3 Block Public Access | Konto- und bucket-weite Einstellungen, die ACLs und Richtlinien überschreiben, um unabhängig von einzelnen Ressourcenkonfigurationen öffentlichen Zugriff zu verhindern |
| Bucket-Richtlinie | JSON-basierte Ressourcenrichtlinie, die an einen Bucket angehängt ist und definiert, wer auf den Bucket zugreifen kann und welche Aktionen sie ausführen können |
| ACL (Access Control List) | Legacy-S3-Zugriffskontrollmechanismus, der Berechtigungen an AWS-Konten oder vordefinierte Gruppen wie AllUsers oder AuthenticatedUsers vergibt |
| IAM Access Analyzer | AWS-Dienst, der Ressourcenrichtlinien analysiert, um Ressourcen zu identifizieren, die mit externen Entitäten oder der Öffentlichkeit geteilt werden |
| Serverseitige Verschlüsselung | Verschlüsselung, die von S3 auf Objektebene mit SSE-S3, SSE-KMS oder SSE-C angewendet wird, bevor Daten auf die Festplatte geschrieben werden |
| CIS AWS Foundations Benchmark | Sicherheitsbest-Practice-Standard des Center for Internet Security mit spezifischen Kontrollen für die S3-Bucket-Konfiguration |
Tools & Systeme
- AWS CLI: Primäre Schnittstelle zum Abfragen von S3-Bucket-Konfigurationen, Richtlinien, ACLs und Verschlüsselungseinstellungen
- Prowler: Open-Source-Sicherheitstool mit über 50 S3-spezifischen Prüfungen, ausgerichtet an CIS-, PCI DSS- und HIPAA-Kontrollen
- IAM Access Analyzer: AWS-eigener Dienst zur kontinuierlichen Überwachung von Ressourcenrichtlinien, die externen Zugriff gewähren
- S3audit: Leichtgewichtiges Tool zur schnellen Aufzählung öffentlicher S3-Buckets in einem Konto
- ScoutSuite: Multi-Cloud-Audit-Tool, das S3-Konfigurationsdaten sammelt und risikobewertete HTML-Berichte generiert
Häufige Szenarien
Szenario: Identifizieren eines öffentlich lesbaren Buckets mit Kundendaten
Kontext: Ein Sicherheitsingenieur erhält eine Trusted Advisor-Warnung über einen öffentlich zugänglichen S3-Bucket. Der Bucket wurde von einem Entwicklungsteam für eine Demo erstellt und nie abgesichert.
Vorgehen:
- Führen Sie
aws s3api get-bucket-aclaus und finden Sie eine Zuweisung anAllUsersmitREAD-Berechtigung - Prüfen Sie
get-bucket-policyund entdecken Sie eine Richtlinie mitPrincipal: "*"unds3:GetObject - Bestätigen Sie, dass Block Public Access auf Bucket- oder Kontoebene nicht aktiviert ist
- Zählen Sie den Bucket-Inhalt auf, um die Datensensitivität zu bewerten
- Aktivieren Sie sofort Block Public Access auf dem Bucket
- Überprüfen Sie CloudTrail S3-Datenereignisse, um festzustellen, ob unbefugter Zugriff erfolgt ist
- Melden Sie den Fund mit Zeitplan, Dateninventar und Bestätigung der Abhilfemaßnahmen
Fallstricke: Die Aktivierung von Block Public Access kann Anwendungen beeinträchtigen, die absichtlich öffentliche Inhalte bereitstellen (statische Websites). Überprüfen Sie immer die beabsichtigte Verwendung des Buckets, bevor Sie Einschränkungen anwenden. Prüfen Sie auf CloudFront-Distributionen oder andere Dienste, die auf den öffentlichen Zugriff des Buckets angewiesen sind.
Ausgabeformat
S3 Bucket-Berechtigungsprüfbericht
=====================================
Konto: 123456789012 (Produktion)
Datum: 2026-02-23
Prüfer: Sicherheits-Engineering-Team
Anzahl Buckets: 47
KONTOEBENE EINSTELLUNGEN:
Block Public Access: AKTIVIERT (alle vier Einstellungen)
KRITISCHE ERKENNTNISSE:
[S3-001] Öffentlicher Lesezugriff über ACL
Bucket: marketing-assets-prod
Problem: AllUsers-Gruppe hat READ-Berechtigung über ACL erhalten
Risiko: Jeder Internetnutzer kann Bucket-Inhalte auflisten und herunterladen
Datensensitivität: Enthält kundenorientierte, aber nicht sensible Marketing-Assets
Abhilfe: AllUsers-ACL-Zuweisung entfernen, Block Public Access aktivieren
[S3-002] Wildcard-Prinzipal in Bucket-Richtlinie
Bucket: data-exchange-partner
Problem: Richtlinie erlaubt s3:GetObject mit Principal "*" und ohne VPC/IP-Bedingung
Risiko: Für Partnerzugriff vorgesehen, aber für jeden mit Bucket-Namen zugänglich
Abhilfe: Bedingung aws:SourceVpce oder aws:SourceIp hinzufügen, um Zugriff einzuschränken
ZUSAMMENFASSUNG:
Buckets mit öffentlichem Zugriff: 3 / 47
Buckets ohne Verschlüsselung: 5 / 47
Buckets ohne Versionierung: 12 / 47
Buckets ohne Zugriffsprotokollierung: 18 / 47
Buckets mit übermäßig breiten Richtlinien: 7 / 47