如何只允许一个服务角色将对象放入 Amazon S3 存储桶

How to only allow one Service Role to PutObjects to an Amazon S3 bucket

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

lambda 角色已经可以访问存储桶的 PutObjects,所以我想我想制定一个存储桶策略,只允许我的 lambda 角色访问 PutObjects,但仍然允许其他人访问 download/delete 上的对象桶。但是,我不确定该桶政策会是什么样子。我想我必须使用条件?比如?

{
  "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???"}
    }
  ]
}

桶策略是基于资源的策略,因此原则可用于限制对特定身份的访问 大家可以准备如下的政策让大家下载删除object

{
  "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 或名称

您可以通过两种方式实现:

  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