
Um kit de ferramentas de segurança para Amazon S3
Um kit de ferramentas de segurança para Amazon S3

🍊 Testado em batalha na Instacart
Execute:
pip install s3tk
Você pode usar o AWS CLI ou o AWS Vault para configurar suas credenciais AWS:
pip install awscli
aws configure
Consulte as políticas IAM necessárias para cada comando.
Digitalize seus buckets para:
s3tk scan
Executar apenas em buckets específicos
s3tk scan my-bucket my-bucket-2
Também funciona com curingas
s3tk scan "my-bucket*"
Confirme o(s) bucket(s) de log e prefixo corretos
s3tk scan --log-bucket my-s3-logs --log-bucket other-region-logs --log-prefix "{bucket}/"
Verificar logging no nível de objeto do CloudTrail [experimental]
s3tk scan --object-level-logging
Pular logging, versionamento ou criptografia padrão
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
Obter notificações por e-mail de falhas (via SNS)
s3tk scan --sns-topic arn:aws:sns:...
Listar políticas de bucket
s3tk list-policy
Executar apenas em buckets específicos
s3tk list-policy my-bucket my-bucket-2
Mostrar declarações nomeadas
s3tk list-policy --named
Nota: Isso substitui a política anterior
Apenas uploads privados
s3tk set-policy my-bucket --no-object-acl
Excluir política
s3tk delete-policy my-bucket
Bloquear acesso público em buckets específicos
s3tk block-public-access my-bucket my-bucket-2
Use a flag --dry-run para testar
Habilitar logging em todos os buckets
s3tk enable-logging --log-bucket my-s3-logs
Apenas em buckets específicos
s3tk enable-logging my-bucket my-bucket-2 --log-bucket my-s3-logs
Definir prefixo de log ({bucket}/ por padrão)
s3tk enable-logging --log-bucket my-s3-logs --log-prefix "logs/{bucket}/"
Use a flag --dry-run para testar
Algumas notas sobre logging:
Habilitar versionamento em todos os buckets
s3tk enable-versioning
Apenas em buckets específicos
s3tk enable-versioning my-bucket my-bucket-2
Use a flag --dry-run para testar
Habilitar criptografia padrão em todos os buckets
s3tk enable-default-encryption
Apenas em buckets específicos
s3tk enable-default-encryption my-bucket my-bucket-2
Isso não criptografa objetos existentes – use o comando encrypt para isso
Use a flag --dry-run para testar
Digitalizar ACL em todos os objetos de um bucket
s3tk scan-object-acl my-bucket
Apenar certos objetos
s3tk scan-object-acl my-bucket --only "*.pdf"
Exceto certos objetos
s3tk scan-object-acl my-bucket --except "*.jpg"
Redefinir ACL em todos os objetos de um bucket
s3tk reset-object-acl my-bucket
Isso torna todos os objetos privados. Consulte políticas de bucket para saber como impor daqui para frente.
Use a flag --dry-run para testar
Especifique certos objetos da mesma forma que scan-object-acl
Criptografar todos os objetos em um bucket com criptografia do lado do servidor
s3tk encrypt my-bucket
Use chaves gerenciadas pelo S3 por padrão. Para chaves gerenciadas pelo KMS, use:
s3tk encrypt my-bucket --kms-key-id arn:aws:kms:...
Para chaves fornecidas pelo cliente, use:
s3tk encrypt my-bucket --customer-key secret-key
Use a flag --dry-run para testar
Especifique certos objetos da mesma forma que scan-object-acl
Nota: Os objetos perderão qualquer ACL personalizada
Excluir todas as versões não criptografadas de objetos em um bucket
s3tk delete-unencrypted-versions my-bucket
Por segurança, isso não excluirá nenhuma versão atual dos objetos
Use a flag --dry-run para testar
Especifique certos objetos da mesma forma que scan-object-acl
Digitalizar o Route 53 em busca de buckets para garantir que você é o proprietário
s3tk scan-dns
Caso contrário, você pode estar suscetível a subdomain takeover
As credenciais podem ser especificadas em ~/.aws/credentials ou com variáveis de ambiente. Consulte este guia para obter uma explicação sobre as variáveis de ambiente.
Você pode especificar um perfil a ser usado com:
AWS_PROFILE=your-profile s3tk
Aqui estão as permissões necessárias para cada comando. Inclua apenas as declarações necessárias.
{
"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/*"
]
}
]
}
O Amazon Athena é excelente para consultar logs do S3. Crie uma tabela e faça 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
O Amazon Athena também é excelente para consultar logs do CloudTrail. Crie uma tabela e faça consultas:
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
Mantenha as coisas simples e siga o princípio do menor privilégio para reduzir a chance de erros.
GetObject na política do bucket)Apenas uploads privados
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Para comandos que iteram sobre objetos do bucket (scan-object-acl, reset-object-acl, encrypt e delete-unencrypted-versions), execute o s3tk em um servidor EC2 para obter latência mínima.
Os comandos set-policy, block-public-access, enable-logging, enable-versioning e enable-default-encryption são fornecidos por conveniência. Recomendamos o Terraform para gerenciar seus 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
}
Execute:
pip install s3tk --upgrade
Para usar o master, execute:
pip install git+https://github.com/ankane/s3tk.git --upgrade
Execute:
docker run -it ankane/s3tk aws configure
Salve suas credenciais:
docker commit $(docker ps -l -q) my-s3tk
E execute:
docker run -it my-s3tk s3tk scan
Veja o changelog
Todos são incentivados a ajudar a melhorar este projeto. Aqui estão algumas maneiras de ajudar:
Para começar a desenvolver:
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev