
Un toolkit di sicurezza per Amazon S3
Un toolkit di sicurezza per Amazon S3

🍊 Testato sul campo presso Instacart
Esegui:
pip install s3tk
Puoi usare AWS CLI o AWS Vault per configurare le tue credenziali AWS:
pip install awscli
aws configure
Vedi le politiche IAM necessarie per ogni comando.
Scansiona i tuoi bucket per:
s3tk scan
Esegui solo su bucket specifici
s3tk scan my-bucket my-bucket-2
Funziona anche con wildcard
s3tk scan "my-bucket*"
Conferma il/i bucket di log e il prefisso corretti
s3tk scan --log-bucket my-s3-logs --log-bucket other-region-logs --log-prefix "{bucket}/"
Controlla il logging a livello di oggetto di CloudTrail [sperimentale]
s3tk scan --object-level-logging
Salta logging, versioning o crittografia predefinita
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
Ricevi notifiche email degli errori (tramite SNS)
s3tk scan --sns-topic arn:aws:sns:...
Elenca le policy dei bucket
s3tk list-policy
Esegui solo su bucket specifici
s3tk list-policy my-bucket my-bucket-2
Mostra le dichiarazioni con nome
s3tk list-policy --named
Nota: Questo sostituisce la policy precedente
Solo caricamenti privati
s3tk set-policy my-bucket --no-object-acl
Elimina policy
s3tk delete-policy my-bucket
Blocca l'accesso pubblico su bucket specifici
s3tk block-public-access my-bucket my-bucket-2
Usa il flag --dry-run per testare
Abilita il logging su tutti i bucket
s3tk enable-logging --log-bucket my-s3-logs
Solo su bucket specifici
s3tk enable-logging my-bucket my-bucket-2 --log-bucket my-s3-logs
Imposta il prefisso dei log ({bucket}/ di default)
s3tk enable-logging --log-bucket my-s3-logs --log-prefix "logs/{bucket}/"
Usa il flag --dry-run per testare
Alcune note sul logging:
Abilita il versioning su tutti i bucket
s3tk enable-versioning
Solo su bucket specifici
s3tk enable-versioning my-bucket my-bucket-2
Usa il flag --dry-run per testare
Abilita la crittografia predefinita su tutti i bucket
s3tk enable-default-encryption
Solo su bucket specifici
s3tk enable-default-encryption my-bucket my-bucket-2
Questo non crittografa gli oggetti esistenti - usa il comando encrypt per questo
Usa il flag --dry-run per testare
Scansiona ACL su tutti gli oggetti in un bucket
s3tk scan-object-acl my-bucket
Solo alcuni oggetti
s3tk scan-object-acl my-bucket --only "*.pdf"
Eccetto alcuni oggetti
s3tk scan-object-acl my-bucket --except "*.jpg"
Reimposta ACL su tutti gli oggetti in un bucket
s3tk reset-object-acl my-bucket
Questo rende privati tutti gli oggetti. Vedi le policy dei bucket per come imporlo in futuro.
Usa il flag --dry-run per testare
Specifica alcuni oggetti nello stesso modo di scan-object-acl
Crittografa tutti gli oggetti in un bucket con la crittografia lato server
s3tk encrypt my-bucket
Usa chiavi gestite da S3 di default. Per chiavi gestite da KMS, usa:
s3tk encrypt my-bucket --kms-key-id arn:aws:kms:...
Per chiavi fornite dal cliente, usa:
s3tk encrypt my-bucket --customer-key secret-key
Usa il flag --dry-run per testare
Specifica alcuni oggetti nello stesso modo di scan-object-acl
Nota: Gli oggetti perderanno eventuali ACL personalizzate
Elimina tutte le versioni non crittografate degli oggetti in un bucket
s3tk delete-unencrypted-versions my-bucket
Per sicurezza, questo non eliminerà le versioni correnti degli oggetti
Usa il flag --dry-run per testare
Specifica alcuni oggetti nello stesso modo di scan-object-acl
Scansiona Route 53 per i bucket per assicurarti di possederli
s3tk scan-dns
Altrimenti, potresti essere suscettibile a subdomain takeover
Le credenziali possono essere specificate in ~/.aws/credentials o con variabili d'ambiente. Vedi questa guida per una spiegazione delle variabili d'ambiente.
Puoi specificare un profilo da usare con:
AWS_PROFILE=your-profile s3tk
Qui ci sono le autorizzazioni necessarie per ogni comando. Includi solo le dichiarazioni di cui hai bisogno.
{
"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 è ottimo per interrogare i log S3. Crea una tabella e interroga liberamente:
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 è ottimo anche per interrogare i log di CloudTrail. Crea una tabella e interroga liberamente:
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
Mantieni le cose semplici e segui il principio del minimo privilegio per ridurre la possibilità di errori.
GetObject nella policy del bucket)Solo caricamenti privati
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Per i comandi che iterano sugli oggetti del bucket (scan-object-acl, reset-object-acl, encrypt e delete-unencrypted-versions), esegui s3tk su un server EC2 per una latenza minima.
I comandi set-policy, block-public-access, enable-logging, enable-versioning e enable-default-encryption sono forniti per comodità. Raccomandiamo Terraform per la gestione dei tuoi bucket.
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
}
Esegui:
pip install s3tk --upgrade
Per usare master, esegui:
pip install git+https://github.com/ankane/s3tk.git --upgrade
Esegui:
docker run -it ankane/s3tk aws configure
Fai il commit delle tue credenziali:
docker commit $(docker ps -l -q) my-s3tk
Ed esegui:
docker run -it my-s3tk s3tk scan
Visualizza il changelog
Tutti sono incoraggiati ad aiutare a migliorare questo progetto. Ecco alcuni modi in cui puoi aiutare:
Per iniziare con lo sviluppo:
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev