【问题标题】:Restrict lambda permissions to access VPCs限制 lambda 权限以访问 VPC
【发布时间】:2021-04-02 19:54:51
【问题描述】:

将 lambda 函数部署到 VPC 时,您需要向 lambda 的执行角色授予一系列与网络接口相关的权限。 AWS manuals 建议为此使用 AWSLambdaVPCAccessExecutionRole 托管策略,如下所示:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface",
                "ec2:AssignPrivateIpAddresses",
                "ec2:UnassignPrivateIpAddresses"
            ],
            "Resource": "*"
        }
    ]
}

如您所见,此策略不限制 lambda 可以修改的网络接口,因此可能会使其与自己的 VPC 之外的网络发生混乱。我想限制 lambda 可以对它实际部署到的 VPC 或子网执行的操作。但是,到目前为止,我还没有为此制定可行的政策。

我尝试像这样检查策略中的 VPC:

"Condition": {"StringEquals": {"ec2:Vpc": "${my_vpc_arn}" }}

但仍然被拒绝。

CloudTrail 事件包含以下授权消息)使用aws sts decode-authorization-message 解码):https://pastebin.com/P9t3QWEY 我看不到任何有用的密钥来检查。

那么是否可以将 VPC 部署的 lambda 限制为仅修改特定的网络接口?

【问题讨论】:

    标签: amazon-web-services lambda amazon-iam policy vpc


    【解决方案1】:

    您不能将策略限制为单个 NI,因为在创建它们之前您不知道它们的 ID。但是您应该能够使用以下 lambda 执行策略限制对特定 VPC 的访问:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AccessToSpecificVPC",
                "Effect": "Allow",
                "Action": [
                    "ec2:CreateNetworkInterface",
                    "ec2:DeleteNetworkInterface",
                    "ec2:UnassignPrivateIpAddresses",
                    "ec2:AssignPrivateIpAddresses",
                    "ec2:DescribeNetworkInterfaces"
                ],
                "Resource": "*",
                "Condition": {
                    "ArnLikeIfExists": {
                        "ec2:Vpc": "arn:aws:ec2:<your-region>:<your-account-id>:vpc/<vpc-id>"
                    }
                }
            },
            {
                "Sid": "CWLogsPermissions",
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogStream",
    
                    "logs:CreateLogGroup",
                    "logs:PutLogEvents"
                ],
                "Resource": "*"
            }
        ]
    }
    

    【讨论】:

    • 使用 'IfExists' 部分确实有效,谢谢!但是,我想知道这是否真的意味着在创建 lambda 时修改接口与将其更新为常规 IAM 用户/角色不同。 IE。当我发出 ec2:CreateNetworkInterface 它将在请求中有 ec2:Vpc 密钥,而在 lambda 部署期间它没有。如果是这样,那么这个解决方案是正确的。
    • @demosito 你可以获得更多关于ifExistshere的信息。正如那里所解释的,有时执行某些操作需要访问各种资源。如果没有IfExist,则将对每个此类资源强制执行该条件,即使它可能不支持此类条件,从而导致拒绝。 Ifexists 将条件应用于提供此类条件键的资源和操作。
    • 我理解这一点,但是,即使“Action”包含单个条目(我使用 ec2:CreateNetworkInterface 测试),没有 IfExists 的条件也不起作用。这意味着 ec2:Vpc 密钥确实不存在于该请求中,尽管根据 docs 它应该。这使我得出结论,在部署 lambda 函数期间,这些操作的执行方式有所不同。
    【解决方案2】:

    Lambda 服务需要能够在您的 VPC 中创建和删除网络接口。这是因为共享的 ENI 将部署在 VPC 中。一旦所有的执行上下文被终止,这个共享的 ENI 将再次被删除。这也解释了为什么需要 describe 权限,因为服务可能需要确定是否已经为特定 lambda 函数部署了共享 ENI。

    不幸的是,这意味着您不能将删除/修改操作限制为任何特定的 ENI,因为它们是动态创建和删除的。

    根据documentation,角色需要的具体权限是:

    • ec2:CreateNetworkInterface
    • ec2:DescribeNetworkInterfaces
    • ec2:删除网络接口

    我检查了 documentation 和 Create + Delete 操作允许(以及其他)以下条件:

    • ec2:子网
    • ec2:Vpc

    这意味着它应该是可能的。也许将ec2:* 权限与上述条件分离到他们自己的语句中可能会对您有所帮助。

    【讨论】:

    • 感谢您的回复,但就像我说的,我尝试使用“Condition”检查您提出的确切条件(ec2:Vpc 和 ec2:Subnet):{“StringEquals”:{“ec2 :Vpc": "${my_vpc_arn}" }} 条目,但这引发了 PermissionDenied 错误。由于某种原因,这些键似乎没有在请求中设置。
    猜你喜欢
    • 2016-05-27
    • 2016-10-08
    • 2018-06-23
    • 2017-04-29
    • 1970-01-01
    • 2017-07-20
    • 2016-05-29
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多