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

时间:2020-03-02 13:37:05

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

我需要创建一个AWS Bucket策略,该策略可以阻止除办公室IP外的所有外部IP地址,但仍允许Lambda函数访问Bucket。

我知道如何使用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和其他论坛上搜索了解决方案,但没有任何效果。

2 个答案:

答案 0 :(得分:0)

如果不让它们通过NAT网关,就无法将Lambda函数的IP地址列入白名单。为此,需要将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"
                ]
            }
        }
    },

答案 1 :(得分:0)

这在很大程度上受到 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"
                ]
            }
        }
    },