将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:*
权限分离成它们自己的语句会对您有所帮助。