如何修改IAM策略防止AWS S3对象被覆盖?
如何通过IAM策略防止S3对象被覆盖(已启用Object Lock)
问题背景
现有用于AWS S3存储桶读写的IAM策略如下:
{"Version": "2012-10-17", "Statement": [{"Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": ["arn:aws:s3:::yp-media"]}, {"Sid": "VisualEditor1", "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject"], "Resource": ["arn:aws:s3:::yio-media/Designs/Greeting_Cards/*"]}, {"Sid": "VisualEditor2", "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*"}]}
该策略允许用户覆盖现有文件。已为存储桶启用Object Lock选项,但拥有上述策略的用户通过AWS控制台上传文件时仍可覆盖对象。尝试添加以下Deny语句后问题依然存在:
{"Sid": "VisualEditor4", "Effect": "Deny", "Action": ["s3:GetBucketObjectLockConfiguration", "s3:GetObjectRetention", "s3:PutObjectRetention", "s3:PutBucketObjectLockConfiguration", "s3:PutObjectLegalHold", "s3:GetObjectLegalHold", "s3:BypassGovernanceRetention"], "Resource": "*"}
解决方案
要实现防止覆盖现有对象的目标,需结合版本控制和IAM策略条件限制,具体修改如下:
1. 确认存储桶已开启版本控制
Object Lock依赖S3版本控制功能,若未开启版本控制,覆盖操作会直接替换原对象,Object Lock无法生效。需先在S3控制台或通过CLI为目标存储桶启用版本控制。
2. 修改IAM策略,添加PutObject的条件限制
在原有的PutObject允许语句中添加条件,仅允许创建新对象,禁止覆盖现有对象。同时调整Deny语句的资源范围,避免全局影响:
修改后的完整策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": ["arn:aws:s3:::yp-media"] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject"], "Resource": ["arn:aws:s3:::yio-media/Designs/Greeting_Cards/*"], "Condition": { "Null": { "s3:ExistingObjectVersionId": "true" } } }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Sid": "DenyObjectLockModifications", "Effect": "Deny", "Action": [ "s3:PutBucketObjectLockConfiguration", "s3:PutObjectRetention", "s3:PutObjectLegalHold", "s3:BypassGovernanceRetention" ], "Resource": [ "arn:aws:s3:::yio-media", "arn:aws:s3:::yio-media/Designs/Greeting_Cards/*" ] } ] }
关键修改说明
- PutObject条件限制:
"Null": {"s3:ExistingObjectVersionId": "true"}表示仅当目标路径下没有现有对象(即ExistingObjectVersionId为空)时,才允许执行PutObject操作。若对象已存在,该条件不满足,上传会被拒绝。 - 缩小Deny语句范围:将Deny的资源限定为目标存储桶和指定路径,避免影响其他S3资源;同时移除不必要的
Get类操作限制,仅禁止修改Object Lock配置、绕过治理模式保留等可能破坏保护的操作。 - 配合版本控制:开启版本控制后,即使有覆盖操作也会生成新版本,但通过IAM条件直接禁止覆盖行为,从权限层面彻底阻止替换现有对象。
内容的提问来源于stack exchange,提问作者dc09
相关产品推荐
相关产品推荐

