在本文中,我将解释如何使用 AWS PrivateLink 来保护和更具成本效益的 AWS 服务间通信。 AWS PrivateLink 是 AWS 云中一个被广泛讨论的领域,但我决定写下我最近使用 AWS PrivateLink 的经验。

AWS PrivateLink

AWS PrivateLink 于 2019 年推出,允许用户安全地访问 AWS 服务,而无需将其流量暴露于公共互联网。

AWS PrivateLink 是一种高度可用、可扩展的技术,使您能够将您的 VPC 私下连接到受支持的 AWS 服务、由其他 AWS 账户托管的服务(VPC 终端节点服务)以及受支持的 AWS Marketplace 合作伙伴服务。

请在此处](https://d1.awsstatic.com/whitepapers/aws-privatelink.pdf)找到来自[的 AWS PrivateLink 白皮书。

下图描述了 PrivateLink 的使用。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s---DhNgqPl---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to -uploads.s3.amazonaws.com/uploads/articles/9h69n97vhd2pytmv1yfz.jpg)

根据上图,左图显示 ECS 正在使用公共互联网从 ECR 中提取图像,即使它们位于同一个 AWS 账户中。另一方面,AWS PrivateLink 与 AWS 网络内的 ECS 和 ECR 保持通信,使其更加安全和具有成本效益。

AWS PrivateLink 支持同区域和跨区域访问。但是,要使跨区域 PrivateLink 正常工作,您可能需要使用跨区域 VPC 对等互连。在本文中,我将仅讨论 PrivateLink 在同一地区的使用。有关跨区域 PrivateLink 支持的更多信息,请参见此处的。

VPC 终端节点

VPC 端点允许 AWS 用户以安全的方式连接到 AWS 服务和 VPC 端点服务(由 AWS 客户和合作伙伴托管的服务称为 VPC 端点服务)。 AWS PrivateLink 用于为 VPC 终端节点供电。 AWS PrivateLink 使用私有 IP 地址与内部 AWS 服务进行通信。 VPC Endpoints 分为三类:(1) Interface Endpoints、(2) Gateway Load Balancer Endpoints 和 (3) Gateway Endpoints

接口端点

AWS PrivateLink 使用接口终端节点(接口 VPC 终端节点)连接 AWS 提供的服务。 AWS 使用网络负载均衡器 (NLB) 将接口端点链接到后台的 AWS 服务,同时利用 AWS PrivateLink。

接口端点可用于连接 AWS 托管服务、客户托管的 AWS 服务和端点服务。

网关负载均衡器端点(GWLB 端点)

GWLB Endpoints 主要用于拦截网络流量以进行安全检查。 GWLB 终端节点仅支持配置为使用网关负载均衡器的服务。

网关端点

这些类型的终端节点用作生成到 AWS 支持的服务的流量的路由表目标。在撰写本文时,仅支持使用 Amazon S3 和 DynamoDB 使用网关终端节点。

GWLB 端点和网关端点之间的差异可以在此处找到。

请注意,并非所有 AWS 服务都受 PrivateLink 支持,我将仅介绍少数可以利用 PrivateLink 与其他服务进行安全且经济高效的通信的服务。请找到这个链接,这将有助于查找与 PrivateLink 兼容的服务。

ECR 端点

Amazon ECR 是一个完全托管的容器注册表,可与 EKS、ECS 和 Lambda 配合使用。请找到以下步骤来为 ECR 服务创建 PrivateLink。在没有为 ECR 配置 PrivateLink 的情况下,您通过离开 AWS 网络通过公共互联网将图像从 ECR 拉到 EKS/ECS 或 lambda。如果您使用 NAT 网关与公共互联网通信,这会产生额外的费用。

为了让上述服务私下拉取 ECR 中的图像,我们可能需要创建两个端点。

  1. ECR Docker 的接口端点

  2. Amazon S3 的网关终端节点

让我们开始!

导航到 AWS 控制台中的 VPC 服务并使用创建终端节点按钮创建终端节点。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--ZCxzXubn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res. cloudinary.com/practicaldev/image/fetch/s--ZCxzXubn--/com/dnqnztxfa/image/upload/v1630005082/11_khmu7e.jpg)

将服务类别保留为默认的“AWS 服务”并在服务名称下搜索“ecr”。选择Interfacecom.amazonaws.[region].ecr.dkr。(选择您当前工作的区域)

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--aFUTMO6V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/gbli46qjn46auz0a57j1.png)

选择您的实例所在的所需 VPC 和子网。将_启用 DNS 名称_ 保留为勾选状态。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--vIRxJ6Bm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/mspx8of8w2tkljiujvr1.png)

创建一个新的专用安全组并允许来自端口 443 的所有入站 HTTPS 流量。这将允许来自所选 VPC 子网的传入流量。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--613ypjAI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/rwqq5f32civ0zccqxnj2.png)

搜索并选择新创建的安全组,同时保持默认策略不变。创建一个新标签,其中 Key 为 Name,Value 为 ECR_endpoint 或您喜欢的东西,然后保存端点。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--iKeuIlV7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/ourl3h2oh4sv9bcet6h9.png)

最初,端点将处于挂起状态。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--1iZDX-ur--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// dev-to-uploads.s3.amazonaws.com/uploads/articles/1egd6y2fxyynciojknm4.png)

如果一切顺利,状态应该会在几分钟内更改为 accessible

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--nANHa_tB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/ivf8wwwpqsj1hanir1ld.png)

S3 端点

如前所述,为了让 ECR 私下工作,我们可能需要为 Amazon S3 创建一个网关端点,因为 ECR 使用 S3 将 docker 图像存储为底层的底层。

和之前一样。创建一个新端点并搜索com.amazonaws.[region].s3。(选择您当前正在处理的区域)。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--rg6sn39n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/dhr4ct0ns6o9nq1apa4r.png)

选择您的实例所在的 VPC,然后选择附加到 VPC 的适当路由表。将其余部分保留为默认值并保存端点。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--JZcHjUkP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/q8ep570p01ao2wcjcntj.png)

瞧!一段时间后,两个端点都应该处于 available 状态。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--5Zu59-33--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// dev-to-uploads.s3.amazonaws.com/uploads/articles/zsc3g0icbc16d74qjppq.png)

这应该为 ECR 做。如果一切顺利,您应该会体验到 NAT 网关指标(在 Cloudawatch 中)的突然变化。此外,在 AWS Cost Explorer 中,请注意 EC2-Other ($) 的成本变化(成本变化可能需要一些时间,因此请注意几天/几周后的成本变化)。

几乎没有其他服务可以帮助降低成本并增强 AWS 安全性。

Cloudwatch 日志的端点

通过 ECS/EKS 和 Lambda 等服务将日志添加到 Cloudwatch 时,通过公共 Internet 将日志发送到 Cloudwatch。这增加了敏感数据的安全风险和 NAT 网关成本。

为避免上述情况,让我们为 Cloudwatch Logs 创建一个接口网关。

前往 Endpoints 并使用com.amazonaws.[region].logs创建一个新的接口端点,选择您当前正在处理的区域。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--l-qsGINn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// dev-to-uploads.s3.amazonaws.com/uploads/articles/p84ww6uatza64zrhzn13.png)

选择您的实例所在的所需 VPC 和子网。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--Ddld5Hhs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/pyyv2t5mjwhwvhh5oyqp.png)

通过允许 HTTPS 流量通过端口 443 创建与以前相同的安全组并保存端点。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--92lq4raX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/0ecslfshbz84klg8xwzt.png)

现在应该使用内部 AWS 网络将您的日志添加到 Cloudwatch。

SSM 端点

我还想强调一项服务,那就是 AWS SSM。如果您的 EC2 实例无法访问公共互联网,这将非常有用。例如,通过为 SSM 创建 Interface Endpoint,您的实例可以安全地访问 Parameter Store 中的参数,而无需访问 Internet。

让我们使用com.amazonaws.[region].ssm服务创建一个新的 VPC 终端节点。区域应与您在 AWS 控制台中当前选择的区域相同。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--mVoirdzK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/vokuhb5pah6iuwzqb471.png)

和以前一样,为 SSM Privatelink 创建一个新的安全组,允许通过端口 443 进行 HTTPS 访问。其余部分与以前相同并保存端点。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--Mu4Oth7b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/lqv96vridorwy41ovkrz.png)

最后,您应该有四个处于 available 状态的 VPC 终端节点,为您的资源提供安全的服务间通信。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--QcqXDQO---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev -to -uploads.s3.amazonaws.com/uploads/articles/apxutknbz07yt7fo2x53.png)

AWS PrivateLink 与跨账户

当您有多个 AWS 账户用于不同的环境时,您可能想知道如何使用 AWS PrivateLink,并且可能存在其他账户常用的资源。例如,您所有的 ECR 图像可能都在一个帐户中(假设是主/根帐户),而其他帐户(例如 Staging/Production)正在使用主/帐户的 ECR 来存储和提取图像。

在这种情况下,创建 PrivateLink 类似于创建同一帐户 PrivateLink。需要在尝试从中提取图像的每个帐户中创建 PrivateLinks。

请找到我创建的图表,该图表说明了 PrivateLink 与多个帐户的使用情况。

[Alt](https://res.cloudinary.com/practicaldev/image/fetch/s--vceOMDgh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/mk6w0u20d7swi5815dnk.png)

根据上图,可以通过在您尝试访问资源的每个账户(同一区域)中创建 VPC 终端节点来实现使用 PrivateLink 的安全跨账户访问(确保避免在根/主账户中创建终端节点)。

参考文献

  1. AWS PrivateLink 白皮书(https://d1.awsstatic.com/whitepapers/aws-privatelink.pdf)

  2. AWS PrivateLink 和 VPC 端点(https://docs.aws.amazon.com/vpc/latest/privatelink/endpoint-services-overview.html)

3.封面照片由KAL VISUALSonUnsplash

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐