繁体   English   中英

AWS 存储桶策略允许 Lambda 但阻止所有其他外部 IP

[英]AWS Bucket Policy to Allow Lambda but block all other external IPs

我需要创建一个 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 和其他论坛上搜索了解决方案,但没有任何效果。

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

问题是您当前拥有的"NotIpAddress"规则始终适用,因此它始终会拒绝您的 Lambda 函数。 我认为解决这个问题的办法是增加一个NotPrincipal条款的SourceIP规则,因此它并不适用于拉姆达函数调用。 类似于以下内容:

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

这在很大程度上受到 Mark B's answer 的启发,但固定为包括假定的角色 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"
                ]
            }
        }
    },

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM