【问题标题】:How to only allow one Service Role to PutObjects to an Amazon S3 bucket如何只允许一个服务角色将对象放入 Amazon S3 存储桶
【发布时间】:2021-11-10 16:15:12
【问题描述】:

我在 AWS 账户上有一个 Amazon S3 存储桶“my-bucket”。现在帐户中的每个人都可以下载对象并将其放入“我的存储桶”。但是,我希望每个人都能够从存储桶中下载/删除对象,并且只有一个服务角色(lambda)能够将对象放入桶。

lambda 角色已经可以访问存储桶的 PutObjects,所以我想我想制定一个存储桶策略,只允许我的 lambda 角色使用 PutObjects,但仍然允许其他人下载/删除存储桶上的对象。但是,我不确定该存储桶策略的外观。我想我必须使用条件?像什么?

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"MyRule",
      "Effect": "Deny",
      "Action":["s3:PutObject"],
      "Resource": ["arn:aws:s3:::my-bucket/*", "arn:aws:s3:::my-bucket*"],
      "Condition":{"NOT EQUAL TO LAMBDA ROLE???"}
    }
  ]
}

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda amazon-iam aws-policies


    【解决方案1】:

    Bucket 策略是基于资源的策略,因此可以使用该策略来限制对特定身份的访问 您可以准备如下策略供所有人下载和删除对象

    {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"PublicReadDelete",
          "Effect":"Allow",
          "Principal": "*",
          "Action":["s3:GetObject","s3:DeleteObject"],
          "Resource":["arn:aws-cn:s3:::/*"]
        }
      ]
    }
    

    以下 lambda 放置对象的策略

    {
      "Version":"2012-10-17",
      "Statement":[
        {
          "Sid":"LambdaUpload",
          "Effect":"Allow",
          "Principal": "<your lambda function ARN>",
          "Action":["s3:PutObject"],
          "Resource":["arn:aws-cn:s3:::/*"]
        }
      ]
    }
    

    您可以将这两个语句组合在同一个策略中。您只需要替换您的 lambda 函数 ARN 和 S3 存储桶 ARN 或名称

    【讨论】:

      【解决方案2】:

      您可以通过两种方式实现这一目标:

      1. 通过使用 Principal,您将在其中明确列出您的 Lambda 角色 arn
      2. 通过使用带条件的拒绝语句(您建议的方法)。

      使用选项 1,您将获得如下内容:

            "Sid": "AllowPutForLambda",
            "Effect": "Allow",
            "Principal": {
              "AWS": [
                "arn:aws:iam::01234567890:role/my-lambda-role"
              ]
            },
            "Action": [
              "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::my-bucket/*"
          }
      

      使用选项 2,它将如下所示:

          {
            "Sid": "DenyAllExceptMyPreciousLambda",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
              "s3:PutObject"
            ],
            "Resource": [
              "arn:aws:s3:::my-bucket/*",
              "arn:aws:s3:::my-bucket"
            ],
            "Condition": {
              "StringNotLike": {
                "aws:userid": [
                  "AROAID1GMAMBDAROLEID:*",
      
                ]
              }
            }
      

      其中"AROAID1GMAMBDAROLEID" 字符串是调用实体的unique identifier(在本例中为 Lambda IAM 角色的 IAM UserId)。

      您可以使用get-role aws-cli 命令获取您的 lambda 角色的唯一 ID:

      aws iam get-role --role-name MyLambdaRoleName

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 2021-10-09
        • 2013-03-31
        • 1970-01-01
        • 2020-04-07
        相关资源
        最近更新 更多