
Ein Sicherheitstoolkit für Amazon S3
Ein Sicherheits-Toolkit für Amazon S3

🍊 Kampferprobt bei Instacart
Ausführen:
pip install s3tk
Sie können die AWS CLI oder AWS Vault verwenden, um Ihre AWS-Anmeldeinformationen einzurichten:
pip install awscli
aws configure
Siehe IAM-Richtlinien, die für jeden Befehl benötigt werden.
Scannen Sie Ihre Buckets auf:
s3tk scan
Nur auf bestimmten Buckets ausführen
s3tk scan my-bucket my-bucket-2
Funktioniert auch mit Platzhaltern
s3tk scan "my-bucket*"
Bestätigen Sie das richtige Log-Bucket(s) und Präfix
s3tk scan --log-bucket my-s3-logs --log-bucket other-region-logs --log-prefix "{bucket}/"
CloudTrail Object-Level-Logging prüfen [experimentell]
s3tk scan --object-level-logging
Logging, Versionierung oder Standardverschlüsselung überspringen
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
E-Mail-Benachrichtigungen bei Fehlern erhalten (über SNS)
s3tk scan --sns-topic arn:aws:sns:...
Bucket-Richtlinien auflisten
s3tk list-policy
Nur auf bestimmten Buckets ausführen
s3tk list-policy my-bucket my-bucket-2
Benannte Anweisungen anzeigen
s3tk list-policy --named
Hinweis: Dies ersetzt die vorherige Richtlinie
Nur private Uploads
s3tk set-policy my-bucket --no-object-acl
Richtlinie löschen
s3tk delete-policy my-bucket
Öffentlichen Zugriff auf bestimmte Buckets blockieren
s3tk block-public-access my-bucket my-bucket-2
Verwenden Sie den --dry-run-Flag zum Testen
Logging für alle Buckets aktivieren
s3tk enable-logging --log-bucket my-s3-logs
Nur auf bestimmten Buckets
s3tk enable-logging my-bucket my-bucket-2 --log-bucket my-s3-logs
Log-Präfix festlegen (Standard: {bucket}/)
s3tk enable-logging --log-bucket my-s3-logs --log-prefix "logs/{bucket}/"
Verwenden Sie den --dry-run-Flag zum Testen
Einige Hinweise zum Logging:
Versionierung für alle Buckets aktivieren
s3tk enable-versioning
Nur auf bestimmten Buckets
s3tk enable-versioning my-bucket my-bucket-2
Verwenden Sie den --dry-run-Flag zum Testen
Standardverschlüsselung für alle Buckets aktivieren
s3tk enable-default-encryption
Nur auf bestimmten Buckets
s3tk enable-default-encryption my-bucket my-bucket-2
Dies verschlüsselt keine vorhandenen Objekte – verwenden Sie dafür den Befehl encrypt
Verwenden Sie den --dry-run-Flag zum Testen
ACL aller Objekte in einem Bucket scannen
s3tk scan-object-acl my-bucket
Nur bestimmte Objekte
s3tk scan-object-acl my-bucket --only "*.pdf"
Bestimmte Objekte ausschließen
s3tk scan-object-acl my-bucket --except "*.jpg"
ACL aller Objekte in einem Bucket zurücksetzen
s3tk reset-object-acl my-bucket
Dies macht alle Objekte privat. Siehe Bucket-Richtlinien für die Durchsetzung in Zukunft.
Verwenden Sie den --dry-run-Flag zum Testen
Geben Sie bestimmte Objekte auf die gleiche Weise wie bei scan-object-acl an
Alle Objekte in einem Bucket mit Server-seitiger Verschlüsselung verschlüsseln
s3tk encrypt my-bucket
Standardmäßig werden S3-verwaltete Schlüssel verwendet. Für KMS-verwaltete Schlüssel verwenden Sie:
s3tk encrypt my-bucket --kms-key-id arn:aws:kms:...
Für vom Kunden bereitgestellte Schlüssel verwenden Sie:
s3tk encrypt my-bucket --customer-key secret-key
Verwenden Sie den --dry-run-Flag zum Testen
Geben Sie bestimmte Objekte auf die gleiche Weise wie bei scan-object-acl an
Hinweis: Objekte verlieren dabei benutzerdefinierte ACLs
Alle unverschlüsselten Versionen von Objekten in einem Bucket löschen
s3tk delete-unencrypted-versions my-bucket
Aus Sicherheitsgründen werden keine aktuellen Versionen von Objekten gelöscht
Verwenden Sie den --dry-run-Flag zum Testen
Geben Sie bestimmte Objekte auf die gleiche Weise wie bei scan-object-acl an
Route 53 auf Buckets scannen, um sicherzustellen, dass Sie sie besitzen
s3tk scan-dns
Andernfalls könnten Sie anfällig für Subdomain-Übernahme sein
Anmeldeinformationen können in ~/.aws/credentials oder mit Umgebungsvariablen angegeben werden. Siehe diese Anleitung für eine Erklärung der Umgebungsvariablen.
Sie können ein zu verwendendes Profil mit folgendem Befehl angeben:
AWS_PROFILE=your-profile s3tk
Hier sind die Berechtigungen, die für jeden Befehl benötigt werden. Fügen Sie nur die Anweisungen hinzu, die Sie benötigen.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Scan",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketAcl",
"s3:GetBucketPolicy",
"s3:GetBucketPublicAccessBlock",
"s3:GetBucketLogging",
"s3:GetBucketVersioning",
"s3:GetEncryptionConfiguration"
],
"Resource": "*"
},
{
"Sid": "ScanObjectLevelLogging",
"Effect": "Allow",
"Action": [
"cloudtrail:ListTrails",
"cloudtrail:GetTrail",
"cloudtrail:GetEventSelectors",
"s3:GetBucketLocation"
],
"Resource": "*"
},
{
"Sid": "ScanDNS",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": "*"
},
{
"Sid": "ListPolicy",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "SetPolicy",
"Effect": "Allow",
"Action": [
"s3:PutBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "DeletePolicy",
"Effect": "Allow",
"Action": [
"s3:DeleteBucketPolicy"
],
"Resource": "*"
},
{
"Sid": "BlockPublicAccess",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketPublicAccessBlock"
],
"Resource": "*"
},
{
"Sid": "EnableLogging",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketLogging"
],
"Resource": "*"
},
{
"Sid": "EnableVersioning",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutBucketVersioning"
],
"Resource": "*"
},
{
"Sid": "EnableDefaultEncryption",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:PutEncryptionConfiguration"
],
"Resource": "*"
},
{
"Sid": "ResetObjectAcl",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObjectAcl",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "Encrypt",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
},
{
"Sid": "DeleteUnencryptedVersions",
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:GetObjectVersion",
"s3:DeleteObjectVersion"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
Amazon Athena eignet sich hervorragend zum Abfragen von S3-Logs. Erstellen Sie eine Tabelle und fragen Sie los:
SELECT
parse_datetime(requestdatetime, 'dd/MMM/yyyy:HH:mm:ss Z') AS time,
key,
remoteip,
useragent
FROM
s3_access_logs_db.mybucket_logs
WHERE
requester = '-'
AND httpstatus LIKE '2%'
AND key LIKE 'some-keys%'
ORDER BY 1
Amazon Athena eignet sich auch hervorragend zum Abfragen von CloudTrail-Logs. Erstellen Sie eine Tabelle und fragen Sie los:
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
Halten Sie die Dinge einfach und befolgen Sie das Prinzip der minimalen Rechte, um die Wahrscheinlichkeit von Fehlern zu verringern.
Nur private Uploads
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Führen Sie für Befehle, die über Bucket-Objekte iterieren (scan-object-acl, reset-object-acl, encrypt und delete-unencrypted-versions), s3tk auf einem EC2-Server aus, um minimale Latenz zu erreichen.
Die Befehle set-policy, block-public-access, enable-logging, enable-versioning und enable-default-encryption werden aus Gründen der Bequemlichkeit bereitgestellt. Wir empfehlen Terraform für die Verwaltung Ihrer Buckets.
resource "aws_s3_bucket" "my_bucket" {
bucket = "my-bucket"
acl = "private"
logging {
target_bucket = "my-s3-logs"
target_prefix = "my-bucket/"
}
versioning {
enabled = true
}
}
resource "aws_s3_bucket_public_access_block" "my_bucket" {
bucket = "${aws_s3_bucket.my_bucket.id}"
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
Ausführen:
pip install s3tk --upgrade
Um master zu verwenden, führen Sie Folgendes aus:
pip install git+https://github.com/ankane/s3tk.git --upgrade
Ausführen:
docker run -it ankane/s3tk aws configure
Übergeben Sie Ihre Anmeldeinformationen:
docker commit $(docker ps -l -q) my-s3tk
Und führen Sie aus:
docker run -it my-s3tk s3tk scan
Siehe Changelog
Jeder ist eingeladen, zur Verbesserung dieses Projekts beizutragen. Hier sind einige Möglichkeiten, wie Sie helfen können:
Um mit der Entwicklung zu beginnen:
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev