【问题标题】:How to remove "delete" permission on Amazon S3如何删除 Amazon S3 上的“删除”权限
【发布时间】:2012-02-22 16:12:44
【问题描述】:

在 Amazon S3 控制台中,我只看到“上传/删除”的权限选项。有没有办法允许上传但不能删除?

【问题讨论】:

    标签: permissions amazon-s3


    【解决方案1】:

    您在AWS Management Console 中直接看到的权限是基于可用于 S3 的初始且相对简单的Access Control Lists (ACL),它本质上区分了 READWRITE 权限,见Specifying a Permission:

    • READ - 允许被授权者列出存储桶中的对象
    • WRITE - 允许被授权者创建、覆盖和删除任何对象 桶

    这些限制已通过添加Bucket Policies(应用在存储桶级别的权限)和IAM Policies(应用在用户级别的权限)来解决,并且所有三个也可以一起使用(这可能会变得相当复杂,如下所述),请参阅Access Control 了解整张图片。

    您的用例可能要求提供相应的存储桶策略,您也可以直接从 S3 控制台添加该策略。单击添加存储桶策略会打开存储桶策略编辑器,其中包含几个示例的链接以及强烈推荐的AWS Policy Generator,它允许您组合策略解决您的用例。

    对于原本被锁定的存储桶,最简单的形式可能如下所示(请确保根据您的需要调整 PrincipalResource):

    {
      "Statement": [
        {
          "Action": [
            "s3:PutObject"
          ],
          "Effect": "Allow",
          "Resource": "arn:aws:s3:::<bucket_name>/<key_name>",
          "Principal": {
            "AWS": [
              "*"
            ]
          }
        }
      ]
    }
    

    根据您的用例,您可以通过组合各种 AllowDeny 操作等轻松组合非常复杂的策略 - 这显然也会产生无意的权限,因此像往常一样,适当的测试是关键;因此,请注意使用Using ACLs and Bucket Policies TogetherIAM and Bucket Policies Together 时的影响。

    最后,您可能还想看看我对Problems specifying a single bucket in a simple AWS user policy 的回答,它解决了另一个常见的政策陷阱。

    【讨论】:

    【解决方案2】:

    您可以将不删除策略附加到您的 s3 存储桶。例如,如果您不希望该 IAM 用户对任何存储桶或任何对象执行任何删除操作,您可以设置如下:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "Stmt1480692207000",
                "Effect": "Deny",
                "Action": [
                    "s3:DeleteBucket",
                    "s3:DeleteBucketPolicy",
                    "s3:DeleteBucketWebsite",
                    "s3:DeleteObject",
                    "s3:DeleteObjectVersion"
                ],
                "Resource": [
                    "arn:aws:s3:::*"
                ]
            }
        ]
    }
    

    此外,您可以使用策略模拟器 https://policysim.aws.amazon.com 检查您的策略,以检查您的设置是否符合您的预期。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      这很完美。感谢 Pung Worathiti Manosroi。结合他提到的政策如下:

      {    
      
      "Statement": [    
      
          {
              "Effect": "Allow",
              "Action": [
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:GetObjectAcl",
                  "s3:PutObjectAcl",
                  "s3:ListBucket",
                  "s3:GetBucketAcl",
                  "s3:PutBucketAcl",
                  "s3:GetBucketLocation"
              ],
              "Resource": "arn:aws:s3:::mybucketname/*",
              "Condition": {}
          },
          {
              "Effect": "Allow",
              "Action": "s3:ListAllMyBuckets",
              "Resource": "*",
              "Condition": {}
          },
          {
              "Effect": "Deny",
              "Action": [
                  "s3:DeleteBucket",
                  "s3:DeleteBucketPolicy",
                  "s3:DeleteBucketWebsite",
                  "s3:DeleteObject",
                  "s3:DeleteObjectVersion"
              ],
              "Resource": "arn:aws:s3:::mybucketname/*",    
      
              "Condition": {}    
      
          }
      ]
      }    
      

      【讨论】:

        【解决方案4】:

        是的,s3:DeleteObject 是一个选项:

        http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html

        但是,更改现有对象(这将允许有效地删除它)和创建新对象之间没有区别。

        【讨论】:

          猜你喜欢
          • 2015-01-16
          • 2022-11-05
          • 2020-10-23
          • 2012-07-10
          • 2021-04-24
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          • 2012-04-07
          相关资源
          最近更新 更多