繁体   English   中英

AWS 安全组入站规则。 允许 lambda 函数

[英]AWS security group inbound rule. allow lambda function

我在我的 EC2 实例上运行一个服务,我想设置一个只允许我的 lambda 函数访问它的入站规则。 安全组允许我限制特定 IP 的访问,但我认为 lambda 函数没有分配特定的 IP。 有没有办法做我想做的事?

如果您按照这篇博文为您的 Lambda 函数启用 VPC 访问,那么您将为 Lambda 函数创建一个安全组以在您的 VPC 中使用。 此时您需要做的就是进入您的 EC2 实例正在使用的安全组,并授予对 Lambda 函数正在使用的安全组的访问权限。 这是我推荐的方法。

如果您不使用 VPC 访问,那么您的 EC2 实例将需要可公开访问,并且您基本上将通过互联网从 Lambda 函数访问 EC2 实例。 如果是这种情况,则没有好的方法可以在安全组中对其进行限制。 您可以(有困难地)仅对源自 AWS 的请求开放它,但这仍然对 AWS 的所有其他用户开放。 如果您必须通过互联网从 Lambda 访问您的 EC2 实例,那么最好在 Lambda 发送的每个请求中发送某种安全令牌,并忽略 EC2 服务器上不包含该安全令牌的任何请求。

没有 VPC 关联的 Lambda 将在 Internet 上并分配有任意公共 IP(显然来自 Amazon 注册的 IP),该 IP 不是固定地址。 因此,几乎不可能在 EC2 的 SG 中将该 IP 列入白名单,因为下次 Lambda 启动 IP 时,该 IP 可能会发生变化并且无法预测。

但是,有一种方法可以将网络访问部分限制到位于 VPC 中的资源,包括 Lambda(因为组件将分配有内部 IP)。 假设您希望 EC2 服务器只能从内部 vpc 网络访问,因此您将其放置在您的内部子网中,而没有为其分配公共 IP。 现在,您可以将 EC2 上的 SG 设置为仅接受来自 VPC 的内部子网 CIDR 范围的 IP。 通过将 Lambda 关联到该 VPC 并将其放置在私有子网中,Lambda 将从您的 VPC 的内部 CIDR 范围中获取任意 IP,该 IP 显然属于已为您的 EC2 配置的 SG 范围(如果您要并行使用大量 Lambda只需确保您在定义的 CIDR 范围内拥有足够数量的 IP)。

如果您希望您的组件在内部通信的同时也能够访问 Internet,您可以向 IGW 添加一个 NAT 网关可路由,然后您将向内部子网添加路由规则以指向您的 NAT 网关。 因此,您在内部子网中的所有组件都将分配有指向 NAT 以及随后指向 Internet 的路由表。

如果我们希望 Lambda 函数访问 VPC 中的资源,会发生什么? 这有点令人困惑,因为 Lambda 函数没有稳定的 IP 地址,我们可以将其用作 VPC 安全组或子网 ACL 中的源。

AWS 通过允许您指定要与 Lambda 函数关联的子网和安全组来克服这些限制。 您会认为这个安全组和子网 ACL 会控制进出 Lambda 函数的流量,但这是错误的。 首先,Lambda 函数不侦听任何端口上的流量,因此 Lambda 函数的入站流量概念不适用。 其次,从 Lambda 函数到 VPC 资源的出站连接不受 Lambda 函数的安全组以任何方式限制。 那么,这个神秘的 Lambda 函数安全组有什么用,它是如何工作的?

结果证明,Lambda 函数的安全组只是一个命名占位符,我们可以在其他 EC2 安全组中使用它。 例如,Lambda 函数可以向您的 VPC 中私有子网上的 EC2 实例发出 GET 请求。 我们从两个安全组开始。 第一个是一个普通的安全组,它控制进出我们的 EC2 实例的流量,这些流量将在端口 8080 上提供文件。它有一个单独的入站规则,允许端口 8080 流量的来源是 Lambda 函数的安全组。 回想一下,安全组规则可以将源或目标指定为另一个安全组,它是作为该源或目标安全组成员的所有主机的占位符。

Lambda 函数的安全组没有任何规则 不需要。 它只是 Lambda 函数的占位符,允许我们将 Lambda 函数指定为其他 EC2 安全组中的源。 请记住,Lambda 函数有一个随机 IP 地址,每天和每小时都在变化,因此无法将其指定为 EC2 实例的入站流量的来源。 安全组通常控制进出网络接口的流量,但在 AWS Lambda 函数安全组的情况下,没有接口也没有规则——它只是一个占位符。

您的 Lambda 将在运行时为其分配一个临时 IP。 如果您配置附加到它的 IAM 角色以便它可以允许/撤销安全组入口,您可以让它“让自己进入”您的安全组。 看看这个文章在添加IP或CIDR块入站列表的例子。 功能完成后,我会立即清理它。

你可以参考下面的文章来做同样的事情,
1. https://medium.com/@justanotherspyy/how-to-connect-your-lambda-function-securely-to-your-private-rds-instances-in-your-vpc-29789220a33
2. https://medium.com/orchestrated/steps-to-secure-aws-serverless-lambda-part-1-a6e5d1b05f45

总结是,
1. 使用以下两个策略为 Lambda 创建一个角色,
AWSLambdaBasicExecutionRole — 提供 CloudWatch 日志记录。
AWSLambdaENIManagementAccess — 提供 ENI 描述、创建和删除。
2. 将lambda放在EC2的同一个VPC中,并为lambda函数创建一个安全组。
3. 将此安全组放入 EC2 的安全组的入站规则中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM