
Un kit de herramientas de seguridad para Amazon S3
Un conjunto de herramientas de seguridad para Amazon S3

🍊 Probado en combate en Instacart
Ejecuta:
pip install s3tk
Puedes usar la AWS CLI o AWS Vault para configurar tus credenciales de AWS:
pip install awscli
aws configure
Consulta las políticas de IAM necesarias para cada comando.
Escanea tus buckets para buscar:
s3tk scan
Ejecutar solo en buckets específicos
s3tk scan my-bucket my-bucket-2
También funciona con comodines
s3tk scan "my-bucket*"
Confirma el/los bucket(s) de registro correcto(s) y el prefijo
s3tk scan --log-bucket my-s3-logs --log-bucket other-region-logs --log-prefix "{bucket}/"
Verificar el registro a nivel de objeto de CloudTrail [experimental]
s3tk scan --object-level-logging
Saltar registro, versionado o cifrado predeterminado
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
Recibir notificaciones por correo electrónico de fallos (a través de SNS)
s3tk scan --sns-topic arn:aws:sns:...
Listar políticas de bucket
s3tk list-policy
Ejecutar solo en buckets específicos
s3tk list-policy my-bucket my-bucket-2
Mostrar declaraciones nombradas
s3tk list-policy --named
Nota: Esto reemplaza la política anterior
Solo cargas privadas
s3tk set-policy my-bucket --no-object-acl
Eliminar política
s3tk delete-policy my-bucket
Bloquear acceso público en buckets específicos
s3tk block-public-access my-bucket my-bucket-2
Usa la bandera --dry-run para probar
Habilitar registro en todos los buckets
s3tk enable-logging --log-bucket my-s3-logs
Solo en buckets específicos
s3tk enable-logging my-bucket my-bucket-2 --log-bucket my-s3-logs
Establecer prefijo de registro ({bucket}/ por defecto)
s3tk enable-logging --log-bucket my-s3-logs --log-prefix "logs/{bucket}/"
Usa la bandera --dry-run para probar
Algunas notas sobre el registro:
Habilitar versionado en todos los buckets
s3tk enable-versioning
Solo en buckets específicos
s3tk enable-versioning my-bucket my-bucket-2
Usa la bandera --dry-run para probar
Habilitar cifrado predeterminado en todos los buckets
s3tk enable-default-encryption
Solo en buckets específicos
s3tk enable-default-encryption my-bucket my-bucket-2
Esto no cifra objetos existentes - usa el comando encrypt para esto
Usa la bandera --dry-run para probar
Escanea ACL en todos los objetos de un bucket
s3tk scan-object-acl my-bucket
Solo ciertos objetos
s3tk scan-object-acl my-bucket --only "*.pdf"
Excepto ciertos objetos
s3tk scan-object-acl my-bucket --except "*.jpg"
Restablecer ACL en todos los objetos de un bucket
s3tk reset-object-acl my-bucket
Esto hace que todos los objetos sean privados. Consulta las políticas de bucket para saber cómo aplicar esto en el futuro.
Usa la bandera --dry-run para probar
Especifica ciertos objetos de la misma manera que scan-object-acl
Cifrar todos los objetos de un bucket con cifrado del lado del servidor
s3tk encrypt my-bucket
Usa claves administradas por S3 por defecto. Para claves administradas por KMS, usa:
s3tk encrypt my-bucket --kms-key-id arn:aws:kms:...
Para claves proporcionadas por el cliente, usa:
s3tk encrypt my-bucket --customer-key secret-key
Usa la bandera --dry-run para probar
Especifica ciertos objetos de la misma manera que scan-object-acl
Nota: Los objetos perderán cualquier ACL personalizada
Eliminar todas las versiones no cifradas de objetos en un bucket
s3tk delete-unencrypted-versions my-bucket
Por seguridad, esto no eliminará ninguna versión actual de objetos
Usa la bandera --dry-run para probar
Especifica ciertos objetos de la misma manera que scan-object-acl
Escanea Route 53 en busca de buckets para asegurarte de que los posees
s3tk scan-dns
De lo contrario, podrías ser susceptible a toma de subdominio
Las credenciales se pueden especificar en ~/.aws/credentials o con variables de entorno. Consulta esta guía para una explicación de las variables de entorno.
Puedes especificar un perfil para usar con:
AWS_PROFILE=your-profile s3tk
Aquí están los permisos necesarios para cada comando. Incluye solo las declaraciones que necesites.
{
"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 es excelente para consultar registros de S3. Crea una tabla y haz consultas:
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 también es excelente para consultar registros de CloudTrail. Crea una tabla y haz consultas:
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
Mantén las cosas simples y sigue el principio de privilegio mínimo para reducir la probabilidad de errores.
GetObject en la política de bucket)Solo cargas privadas
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Para comandos que iteran sobre objetos de bucket (scan-object-acl, reset-object-acl, encrypt, y delete-unencrypted-versions), ejecuta s3tk en un servidor EC2 para una latencia mínima.
Los comandos set-policy, block-public-access, enable-logging, enable-versioning, y enable-default-encryption se proporcionan por conveniencia. Recomendamos Terraform para gestionar tus 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
}
Ejecuta:
pip install s3tk --upgrade
Para usar master, ejecuta:
pip install git+https://github.com/ankane/s3tk.git --upgrade
Ejecuta:
docker run -it ankane/s3tk aws configure
Confirma tus credenciales:
docker commit $(docker ps -l -q) my-s3tk
Y ejecuta:
docker run -it my-s3tk s3tk scan
Ver el registro de cambios
Se anima a todos a ayudar a mejorar este proyecto. Aquí hay algunas formas en que puedes ayudar:
Para comenzar con el desarrollo:
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev