我只是想向一些更聪明的人提出这个想法,以确保我没有忽视一些显而易见的事情:
我想使用允许自动修剪备份的众多备份脚本之一将我的 Linux 服务器备份到 S3。因此,我的 S3 IAM 策略显然必须授予该用户 GET、PUT 和 DELETE 权限。但由于 DELETE 权限将存在,我需要针对最坏的情况制定计划,即黑客获得对我的服务器的 root 访问权限并使用存储的凭据删除 S3 上的备份。为了消除这种可能性,我考虑了以下配置:
- 存储桶上启用了版本控制(黑客可以删除文件,但它们仅在 S3 上被标记为已删除,并且可以由我恢复)
- 存储桶上启用的生命周期策略可自动删除旧版本(最终消除文件的所有版本以最大限度地降低存储成本)
然后,唯一拥有存储桶删除或版本删除权限的用户将是我的主亚马逊账户用户,我将使用 MFA 进行配置。
我这里是否遗漏了任何明显的特征?
我确实找到了这声称…
您可以在 [...] 上使用对象过期功能,但是,您不能将其与 S3 版本控制结合使用
...我猜那是过时的信息?在我的快速非正式实验中,似乎可以使用对象过期的版本控制。
多谢!
答案1
是的,您链接的博客文章(来自 2011 年)似乎包含过时的信息。来自文档:
如果存储桶已启用版本控制(或版本控制已暂停),则该
Expiration
操作会通过添加删除标记作为新的当前版本来逻辑删除当前版本。该NoncurrentVersionExpiration
操作将永久删除非当前版本。http://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectExpiration.html
您的计划的唯一问题是,删除已删除对象(以节省存储空间)的生命周期策略与针对恶意删除内容的灾难恢复保护有些矛盾。您必须快速发现漏洞,否则生命周期策略将清除您看似已删除但实际上隐藏的对象。
这并不是说你的策略在理论上不好——我认为它是好的,因为我使用过类似的东西——但是清除不再需要的对象可能需要比生命周期策略所能提供的更复杂,并且可能需要按计划运行并有附加规则的自定义逻辑。
答案2
假设您可以使用生命周期策略以适合您的方式删除和/或存档旧版本,则根本不需要授予脚本删除权限。这种方法与 AWS CLI 工具结合使用对我来说效果很好。
我的存储桶策略如下:
{
"Version": "2012-10-17",
"Id": "IDHERE",
"Statement": [
{
"Sid": "ToSendBackups",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::IAMUSERHERE"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::BUCKETHERE/*"
},
{
"Sid": "BucketOps",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::IAMUSERHERE"
},
"Action": [
"s3:ListBucketVersions",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::BUCKETHERE"
}
]
}
另外,请注意,如果您要将文件存档到 Glacier,则需要将存档文件保留至少 90 天,因为“对于 90 天之前删除的项目,将按每 GB 0.03 美元的比例收费”(http://aws.amazon.com/glacier/pricing/),因此如果您先删除它们,使用 Glacier 将不会为您保存任何内容。