【问题标题】:AWS Bucket Policy to Allow Lambda but block all other external IPs允许 Lambda 但阻止所有其他外部 IP 的 AWS 存储桶策略
【发布时间】:2021-01-30 09:44:04
【问题描述】:

我需要创建一个 AWS 存储桶策略来阻止除我们的办公室 IP 之外的所有外部 IP 地址,但仍允许 Lambda 函数访问存储桶。

我知道如何使用 AWS VPC 和 NAT 来完成这项工作,但是由于涉及的高成本,客户不想激活这些。

到目前为止,这是我的存储桶策略的样子,但它不起作用:

{
"Version": "2008-10-17",
"Statement": [
    {
        "Sid": "GiveSESPermissionToWriteEmail",
        "Effect": "Allow",
        "Principal": {
            "Service": "ses.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::files-dev/*"
    },
    {
        "Sid": "SourceIP",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::files-dev/*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "81.111.111.111/24"
                ]
            }
        }
    },
    {
        "Sid": "GiveLambdaPermisssion",
        "Effect": "Allow",
        "Principal": {
            "AWS": [
                "arn:aws:iam::6XXXXXX:role/app-backend-dev-lambdaFunctionRole-1XXXX"
            ],
            "Service": "lambda.amazonaws.com"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::files-dev/*"
    }
]

}

我想我已经阅读了所有我能找到的与此相关的 AWS 文档,但我找不到我要找的东西。这可能是因为他们的文档非常混乱,并且没有涵盖所有功能。我还在 StackOverflow 和其他论坛上搜索过解决方案,但没有任何效果。

【问题讨论】:

  • 在默认情况下禁用对存储桶的所有访问时,为什么需要“阻止所有外部 IP 地址” 的策略?除非您通过策略允许,否则不允许访问任何存储桶,因此不清楚为什么您不会删除该不适当的访问授权,而不是尝试加倍努力并抵消不应存在的授权。你能解释一下吗?
  • 当我开始这个项目时,这个存储桶是公开的。直到现在还可以。它托管了一些每个人都需要访问的文件。现在我们正在通过托管在不同服务器上的脚本获取文件,我们需要为该服务器提供对存储桶的 IP 访问权限,同时也需要 lambda。像你说的那样扭转事情不会有太大的作用,或者我错过了什么。我仍然需要反转规则,然后授予对 IP 的访问权限,而不是拒绝然后授予对 lambda 的访问权限。所以基本上我需要反过来做同样的事情,还是我做错了什么?
  • 我已经尝试过相反的方法,但不行。如果我删除公共访问权限,那么我将无法允许我的办公室 IP 访问存储桶中的文件。我需要对存储桶的访问权限是公开的,但只允许 1 个 IP 地址 + lambda 函数权限来查看文件。
  • “如果我删除公共访问权限” ...您的意思是什么?如果您谈论的是block public access settings,那么您可能误解了该功能的目的,这解释了您为什么要努力做到这一点。

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


【解决方案1】:

如果不让 Lambda 函数的 IP 地址通过 NAT 网关,您将无法将它们列入白名单。这样做需要将 AWS 的每个 IP 地址都列入白名单,这不仅是一个非常难以管理的 IP 列表,而且完全不安全,因为它会将任何拥有 AWS 账户的人列入白名单。

问题在于您当前拥有的 "NotIpAddress" 规则将始终适用,因此它始终会拒绝您的 Lambda 函数。我相信解决这个问题的方法是在SourceIP 规则中添加一个NotPrincipal 子句,这样它就不适用于Lambda 函数调用。类似于以下内容:

    {
        "Sid": "SourceIP",
        "Effect": "Deny",
        "NotPrincipal": {"AWS": [
            "arn:aws:iam::6XXXXXX:role/app-backend-dev-lambdaFunctionRole-1XXXX"
        ]},
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::files-dev/*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "81.111.111.111/24"
                ]
            }
        }
    },

【讨论】:

  • 上面的方法我试过了,可惜没用。
  • 为了回答你的问题,我不想将 lambda IP 列入白名单。我想根据角色或 lambda 函数的 arn 或任何有效的方法向存储桶授予 Lambda 权限。但是对于知识,我还尝试将 eu-west 区域中的整个 Lambda IP 范围列入白名单,该函数正在运行,但它也不起作用
  • 您可以尝试暂时禁用此规则,以确保这是导致 Lambda 问题的原因。分配给 Lambda 函数的 IAM 角色是否允许它访问此存储桶?
  • 是的,我已经玩了几天的存储桶策略了。如果我删除它,它会起作用。我有一个用于测试的沙盒 lambda 函数。我也尝试过使用 NotPrincipal 和 Service 而不是 Role,然后将服务指定为:“lambda.amazonaws.com”。当我这样做时,它完全忽略了我的规则。 (lambda 有效,但每个人都可以访问存储桶)。难道不应该只在 AWS 服务调用是 Lambda 的情况下才忽略它吗?他们的文档真的没有意义。
  • 非常接近!缺少的部分是 lambda 使用 假定角色,而不是角色本身。 See here.
【解决方案2】:

这在很大程度上受到了 Mark B 的回答的启发,但已修复为包含 assumed role principal

请注意,假定的角色是sts 而不是iam

    {
        "Sid": "SourceIP",
        "Effect": "Deny",
        "NotPrincipal": {"AWS": [
            "arn:aws:iam::6XXXXXX:role/app-backend-dev-lambdaFunctionRole-1XXXX",
            "arn:aws:sts::6XXXXXX:assumed-role/app-backend-dev-lambdaFunctionRole-1XXXX/lambda-name"

        ]},
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::files-dev/*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "81.111.111.111/24"
                ]
            }
        }
    },

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2022-01-25
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    相关资源
    最近更新 更多