Percebi que todos os tutoriais que encontrei sobre acesso ao S3 para o Discourse concediam ao usuário autoridade absoluta sobre o bucket — eles permitem a permissão ‘s3:*’.
Essa é uma política extremamente imprudente, pois concede controle significativamente maior sobre o bucket do que o razoável. Se você estiver usando o S3 para armazenamento de backups do Discourse, um atacante desenfreado seria capaz de excluir seu bucket e seus backups ao sair.
Existem duas maneiras de combater isso: uma, uma política mais restrita…
{
"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": "*"
}
]
}
… e duas, aplicar algumas precauções sensatas à política do bucket. (Isso, na verdade, vai muito além do mínimo necessário, mas eu estava com pressa e não tive tempo para experimentar, e é melhor do que o que encontrei.) Recomendo ativar o versionamento e, em seguida, configurar uma regra de ciclo de vida para “versões anteriores” que as remova após um período razoável, como 21 dias. A política fornecida permitiria a rotação de logs e a exclusão de arquivos, mas não concederia ao usuário com credenciais do S3 acesso para restaurar ou eliminar versões anteriores. Isso significa que, embora eles pudessem excluir um backup, um atacante desenfreado não poderia apagá-lo do histórico de versões antes que um administrador com credenciais de root pudesse recuperá-lo.
Obrigado!