限制lambda访问VPCs的权限



将lambda函数部署到VPC时,需要向lambda的执行角色授予一组与网络接口相关的权限。AWS手册建议使用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只修改特定的网络接口?

您不能将策略限制为单个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": "*"
}
]
}

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

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

根据文件,角色需要的具体权限为:

  • ec2:CreateNetworkInterface
  • ec2:描述网络接口
  • ec2:DeleteNetworkInterface

我检查了文档,创建+删除操作允许(除其他外(以下条件:

  • ec2:子网
  • ec2:Vpc

这意味着这应该是可能的。也许用前面提到的条件将ec2:*权限分离成它们自己的语句会对您有所帮助。

最新更新