
Un kit de sécurité pour Amazon S3
Une boîte à outils de sécurité pour Amazon S3

🍊 Éprouvée sur le terrain chez Instacart
Exécutez :
pip install s3tk
Vous pouvez utiliser AWS CLI ou AWS Vault pour configurer vos identifiants AWS :
pip install awscli
aws configure
Consultez les politiques IAM nécessaires pour chaque commande.
Analysez vos buckets pour :
s3tk scan
Exécuter uniquement sur des buckets spécifiques
s3tk scan mon-bucket mon-bucket-2
Fonctionne également avec des wildcards
s3tk scan "mon-bucket*"
Confirmer le(s) bucket(s) de journalisation et le préfixe corrects
s3tk scan --log-bucket mes-logs-s3 --log-bucket logs-autre-region --log-prefix "{bucket}/"
Vérifier la journalisation au niveau objet de CloudTrail [expérimental]
s3tk scan --object-level-logging
Ignorer la journalisation, le versionnage ou le chiffrement par défaut
s3tk scan --skip-logging --skip-versioning --skip-default-encryption
Recevoir des notifications par email des échecs (via SNS)
s3tk scan --sns-topic arn:aws:sns:...
Lister les politiques des buckets
s3tk list-policy
Exécuter uniquement sur des buckets spécifiques
s3tk list-policy mon-bucket mon-bucket-2
Afficher les instructions nommées
s3tk list-policy --named
Remarque : Ceci remplace la politique précédente
Uniquement les téléversements privés
s3tk set-policy mon-bucket --no-object-acl
Supprimer la politique
s3tk delete-policy mon-bucket
Bloquer l’accès public sur des buckets spécifiques
s3tk block-public-access mon-bucket mon-bucket-2
Utilisez l’option --dry-run pour tester
Activer la journalisation sur tous les buckets
s3tk enable-logging --log-bucket mes-logs-s3
Uniquement sur des buckets spécifiques
s3tk enable-logging mon-bucket mon-bucket-2 --log-bucket mes-logs-s3
Définir le préfixe de journalisation ({bucket}/ par défaut)
s3tk enable-logging --log-bucket mes-logs-s3 --log-prefix "logs/{bucket}/"
Utilisez l’option --dry-run pour tester
Quelques notes sur la journalisation :
Activer le versionnage sur tous les buckets
s3tk enable-versioning
Uniquement sur des buckets spécifiques
s3tk enable-versioning mon-bucket mon-bucket-2
Utilisez l’option --dry-run pour tester
Activer le chiffrement par défaut sur tous les buckets
s3tk enable-default-encryption
Uniquement sur des buckets spécifiques
s3tk enable-default-encryption mon-bucket mon-bucket-2
Ceci ne chiffre pas les objets existants – utilisez la commande encrypt pour cela
Utilisez l’option --dry-run pour tester
Analyser les ACL sur tous les objets d’un bucket
s3tk scan-object-acl mon-bucket
Uniquement certains objets
s3tk scan-object-acl mon-bucket --only "*.pdf"
Sauf certains objets
s3tk scan-object-acl mon-bucket --except "*.jpg"
Réinitialiser les ACL sur tous les objets d’un bucket
s3tk reset-object-acl mon-bucket
Ceci rend tous les objets privés. Consultez les politiques de bucket pour savoir comment imposer cette règle à l’avenir.
Utilisez l’option --dry-run pour tester
Spécifiez certains objets de la même manière que scan-object-acl
Chiffrer tous les objets d’un bucket avec le chiffrement côté serveur
s3tk encrypt mon-bucket
Utilisez les clés gérées par S3 par défaut. Pour les clés gérées par KMS, utilisez :
s3tk encrypt mon-bucket --kms-key-id arn:aws:kms:...
Pour les clés fournies par le client, utilisez :
s3tk encrypt mon-bucket --customer-key clé-secrète
Utilisez l’option --dry-run pour tester
Spécifiez certains objets de la même manière que scan-object-acl
Remarque : Les objets perdront toute ACL personnalisée
Supprimer toutes les versions non chiffrées des objets dans un bucket
s3tk delete-unencrypted-versions mon-bucket
Par sécurité, cela ne supprimera aucune version actuelle des objets
Utilisez l’option --dry-run pour tester
Spécifiez certains objets de la même manière que scan-object-acl
Analyser Route 53 pour les buckets afin de vérifier que vous les possédez
s3tk scan-dns
Sinon, vous pourriez être vulnérable à une prise de contrôle de sous-domaine
Les identifiants peuvent être spécifiés dans ~/.aws/credentials ou avec des variables d’environnement. Consultez ce guide pour une explication des variables d’environnement.
Vous pouvez spécifier un profil à utiliser avec :
AWS_PROFILE=votre-profil s3tk
Voici les autorisations nécessaires pour chaque commande. Incluez uniquement les instructions dont vous avez besoin.
{
"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:::mon-bucket",
"arn:aws:s3:::mon-bucket/*"
]
},
{
"Sid": "Encrypt",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::mon-bucket",
"arn:aws:s3:::mon-bucket/*"
]
},
{
"Sid": "DeleteUnencryptedVersions",
"Effect": "Allow",
"Action": [
"s3:ListBucketVersions",
"s3:GetObjectVersion",
"s3:DeleteObjectVersion"
],
"Resource": [
"arn:aws:s3:::mon-bucket",
"arn:aws:s3:::mon-bucket/*"
]
}
]
}
Amazon Athena est excellent pour interroger les logs S3. Créez une table et interrogez-la :
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 est également excellent pour interroger les logs CloudTrail. Créez une table et interrogez-la :
SELECT
eventtime,
eventname,
useridentity.username,
requestparameters
FROM
cloudtrail_logs
WHERE
eventname LIKE '%Bucket%'
ORDER BY 1
Gardez les choses simples et suivez le principe du moindre privilège pour réduire les risques d’erreurs.
GetObject dans la politique du bucket)Uniquement les téléversements privés
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObjectAcl",
"Resource": "arn:aws:s3:::mon-bucket/*"
}
]
}
Pour les commandes qui itèrent sur les objets du bucket (scan-object-acl, reset-object-acl, encrypt et delete-unencrypted-versions), exécutez s3tk sur un serveur EC2 pour une latence minimale.
Les commandes set-policy, block-public-access, enable-logging, enable-versioning et enable-default-encryption sont fournies pour plus de commodité. Nous recommandons Terraform pour gérer vos buckets.
resource "aws_s3_bucket" "my_bucket" {
bucket = "mon-bucket"
acl = "private"
logging {
target_bucket = "mes-logs-s3"
target_prefix = "mon-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
}
Exécutez :
pip install s3tk --upgrade
Pour utiliser la branche master, exécutez :
pip install git+https://github.com/ankane/s3tk.git --upgrade
Exécutez :
docker run -it ankane/s3tk aws configure
Validez vos identifiants :
docker commit $(docker ps -l -q) my-s3tk
Et exécutez :
docker run -it my-s3tk s3tk scan
Consultez le journal des modifications
Tout le monde est encouragé à aider à améliorer ce projet. Voici quelques façons de contribuer :
Pour commencer le développement :
git clone https://github.com/ankane/s3tk.git
cd s3tk
pip install --group dev