如何将对AWS S3存储桶的访问权限仅限制为特定角色?

时间:2019-12-20 19:59:02

标签: amazon-web-services amazon-s3 aws-api-gateway amazon-iam

在我的AWS项目中,我有一个lambda函数,由API Gateway中的API调用,该函数在S3存储桶中获取文件。

我尝试尽可能地保护我的S3存储桶,并在阅读thisthis之后,这是我在CloudFormation模板中所做的事情:

  • 在API的IAM角色的政策中:
  - Effect: 'Allow'
    Action:
      - "s3:GetObject"
    Resource: 'arn:aws:s3:::exampleS3Bucket/*'
  • 并在我的S3存储桶的策略中:
  - Effect: "Deny"
    Action:
      - "s3:*"
    Principal: "*"
    Resource:
      - 'arn:aws:s3:::exampleS3Bucket'
      - 'arn:aws:s3:::exampleS3Bucket/*'
    Condition:
      StringNotLike:
        aws:userId:
          - "<API_IAM_ROLE_ID>"

根据文档,您可以通过调用以下AWS CLI命令API_IAM_ROLE_ID来检索aws iam get-role --role-name <YOUR_IAM_ROLE>

但是我面临两个问题:

  • 它不起作用,我仍然遇到Access Denied错误
  • 即使它可以工作,它也不是一个干净的解决方案,尤其是当我想处理多种环境(开发,暂存,生产...)时

编辑

我还尝试了以下S3存储桶策略:

  - Effect: "Deny"
    Action:
      - "s3:*"
    NotPrincipal:
      AWS:
        - "arn:aws:iam::123456789012:root"
        - "arn:aws:iam::123456789012:role/my-api-role"
    Resource:
      - 'arn:aws:s3:::exampleS3Bucket'
      - 'arn:aws:s3:::exampleS3Bucket/*'

但是当我调用我的API时,即调用了调用S3.GetObject()的lambda时,我仍然遇到“访问被拒绝”异常。

我该如何解决?

谢谢。

2 个答案:

答案 0 :(得分:1)

拒绝访问特定存储桶可能很棘手。

例如,管理员可能具有修改角色和存储桶策略的能力,因此他们将能够重新获得对存储桶的访问。

一种常见的做法是将敏感信息放入另一个AWS账户中的存储桶中,然后仅向“主”账户中的特定用户提供对存储桶的访问权限。这样,默认设置是主帐户中没有人可以访问。由于不需要应用Deny策略,因此也简化了权限设计。

一个例子是存储敏感的HR信息,只有少数用户可以访问该数据。

答案 1 :(得分:0)

这是我最近的做法。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::MyExampleBucket",
        "arn:aws:s3:::MyExampleBucket/*"
      ],
      "Condition": {
        "StringNotLike": {
          "aws:userId": [
            "AROAEXAMPLEID:*",
            "ACCOUNT NUMBER"
          ]
        }
      }
    }
  ]
}

这是它的工作方式。

  • 允许:用户的IAM策略允许访问S3存储桶
  • 拒绝:存储桶策略用于拒绝对除角色用户ID之外的所有用户的访问。

获取角色的用户ID:

aws iam get-role --role-name ROLE-NAME

参考: https://aws.amazon.com/blogs/security/how-to-restrict-amazon-s3-bucket-access-to-a-specific-iam-role/