【问题标题】:Access denied when principal set to aws lambda.amazonaws.com当主体设置为 aws lambda.amazonaws.com 时访问被拒绝
【发布时间】:2021-06-13 15:58:39
【问题描述】:

当我通过 boto3 使用 lambda 函数访问存储桶时,我使用 lambda 函数访问存储桶并收到“拒绝访问”错误。如果我在存储桶中将主体设置为“*”,一切正常。有什么问题?

 "Sid": "DenyIncorrectEncryptionHeader",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
...

【问题讨论】:

  • 您能说明一下您当前的配置吗?您是指存储桶策略,还是附加 IAM 角色的策略,或者 IAM 角色的信任策略(令人困惑,嗯!)。正确的配置应该是信任 Lambda 服务的 IAM 角色,该角色授予对 s3:GetObject 的访问权限(至少)。
  • @JohnRotenstein 存储桶策略

标签: amazon-web-services aws-lambda


【解决方案1】:

在存储桶策略中,授予权限的主体应该是 lambda 执行角色,而不是 lambda 服务 (lambda.amazonaws.com)。

添加更多详细信息,如果 lambda 执行角色与存储桶位于同一 AWS 账户中,则角色中的允许权限就足够了。只要存储桶策略中没有明确的拒绝。

但是,如果角色和存储桶位于不同的账户中,则该角色必须具有允许权限,并且存储桶策略必须向该角色授予允许权限。

【讨论】:

  • 如果我将角色放入其中,我会收到“无效策略”错误
  • 您能粘贴您的存储桶策略以便我检查吗?还要回到我提到的其他细节。您真的需要添加存储桶策略吗?因为如果这不是跨账户访问,您实际上并不需要 lambda 函数的存储桶策略来访问存储桶。
【解决方案2】:

步骤如下:

  • 使用 Lambda 用例创建一个 IAM 角色(这会创建一个允许 AWS Lambda 服务代入该角色的信任策略)
  • 向 IAM 角色添加一个授予所需 Amazon S3 权限的策略
  • 配置 AWS Lambda 函数以使用此 IAM 角色

对于您声明的要求,无需使用 Amazon S3 存储桶策略。

作为一般规则,在向所有人授予权限时使用存储桶策略,在向特定用户或组授予访问权限时应使用 IAM 策略。 (但是,使用存储桶策略可能还有其他情况,例如授予跨账户访问权限。)

【讨论】:

  • 但是我是否应该尝试限制仅此 lambda 函数的访问以拥有最少的权限?
  • 默认情况是任何地方都没有权限。然后,您可以创建 IAM 用户和 IAM 角色并授予他们访问服务和资源的权限。因此,确保对存储桶的最小权限的最简单方法是首先不将存储桶的权限分配给任何人。然后,只有这个 IAM 角色可以访问。当然,如果您将s3:* 权限分配给用户和角色(这绝不是一个好习惯!),这会变得更加困难,在这种情况下,将需要Deny 策略。但是,您没有在问题中提及任何此类安全要求。
  • 为什么我不能扮演 lambda 函数使用的标准角色?
  • 抱歉,我不明白您在上一条评论中要问什么。如果您有任何特定的安全目标,请随时使用详细信息更新您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2017-07-28
相关资源
最近更新 更多