You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:02:11