限制访问 VPC 的 lambda 权限
Restrict lambda permissions to access VPCs
在将 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 仅修改特定的网络接口?
Lambda 服务需要能够在您的 VPC 中创建和删除网络接口。这是因为共享 ENI 将部署在 VPC 中。一旦所有执行上下文终止,此共享 ENI 将再次删除。这也解释了为什么需要描述权限,因为该服务可能需要确定是否已经为特定的 lambda 函数部署了共享 ENI。
不幸的是,这意味着您不能将 delete/modify 操作限制为任何特定的 ENI,因为它们是动态创建和删除的。
根据documentation角色需要的具体权限是:
- ec2:创建网络接口
- ec2:DescribeNetworkInterfaces
- ec2:删除网络接口
我检查了 documentation 并且创建 + 删除操作允许(除其他外)以下条件:
- ec2:子网
- ec2:Vpc
这意味着它应该是可能的。也许根据上述条件将 ec2:*
权限分离到它们自己的语句中可能会对您有所帮助。
您不能将策略限制到单个 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 函数部署到 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 仅修改特定的网络接口?
Lambda 服务需要能够在您的 VPC 中创建和删除网络接口。这是因为共享 ENI 将部署在 VPC 中。一旦所有执行上下文终止,此共享 ENI 将再次删除。这也解释了为什么需要描述权限,因为该服务可能需要确定是否已经为特定的 lambda 函数部署了共享 ENI。
不幸的是,这意味着您不能将 delete/modify 操作限制为任何特定的 ENI,因为它们是动态创建和删除的。
根据documentation角色需要的具体权限是:
- ec2:创建网络接口
- ec2:DescribeNetworkInterfaces
- ec2:删除网络接口
我检查了 documentation 并且创建 + 删除操作允许(除其他外)以下条件:
- ec2:子网
- ec2:Vpc
这意味着它应该是可能的。也许根据上述条件将 ec2:*
权限分离到它们自己的语句中可能会对您有所帮助。
您不能将策略限制到单个 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": "*"
}
]
}