J’ai remarqué que tous les tutoriels que j’ai trouvés pour l’accès S3 de Discourse accordaient à l’utilisateur une autorité absolue sur le bucket — ils permettent l’autorité ‘s3:*’.
C’est une politique extrêmement imprudente, car elle permet un contrôle bien plus important sur le bucket que ce qui est raisonnable. Si vous utilisez S3 pour le stockage des sauvegardes de Discourse, un attaquer enragé pourrait supprimer votre bucket et vos sauvegardes en partant.
Il existe deux façons de contrer cela : d’abord, une politique plus stricte…
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*",
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::whatever-bucket",
"arn:aws:s3:::whatever-bucket/*"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:HeadBucket"
],
"Resource": "*"
}
]
}
… et deuxièmement, appliquer des précautions raisonnables à la politique du bucket. (Ceci va en fait bien au-delà du strict minimum nécessaire, mais j’étais pressé et n’avais pas le temps d’expérimenter, et c’est mieux que ce que j’ai trouvé.) Je recommande d’activer la gestion des versions, puis de définir une règle de cycle de vie pour les « versions précédentes » afin qu’elles soient supprimées après un délai raisonnable, comme 21 jours. La politique donnée permettrait la rotation des journaux et la suppression de fichiers, mais elle n’autoriserait pas l’utilisateur disposant des identifiants S3 à restaurer ou purger les versions précédentes. Cela signifie que, bien qu’ils puissent supprimer une sauvegarde, un attaquant enragé ne pourrait pas l’effacer de l’historique des versions avant qu’un administrateur disposant des identifiants root ne puisse la récupérer.
Merci !