在这篇博客文章中,Glovo分享了他们如何将约4000个TLS虚拟专用网络(VPN)用户从自管理的OpenVPN Amazon Elastic Compute Cloud (Amazon EC2)解决方案迁移到AWS Client VPN,并通过与OneLogin集成来实现身份验证和授权。
什么是AWS Client VPN?
Amazon Web Services (AWS) Client VPN是一种托管的基于客户端的VPN服务,使您能够安全地访问AWS资源及本地网络资源。它是一项弹性服务,可以根据需求自动扩展或收缩。它还允许组织利用现有的身份存储,例如Glovo使用的OneLogin,通过SAML 2.0集成进行身份验证。
Glovo简介
Glovo是一家全球领先的配送公司。该公司于2015年在巴塞罗那成立,主要从事在线食品订单的家庭配送。如今,该应用程序在25个国家和1300多个城市拥有超过150,000家合作餐厅和商户,除了最佳餐厅外,还为用户提供超市、电器、健康美容和礼品商店等各种其他商户。
Glovo的初始自管理VPN解决方案
在此之前,Glovo使用的是在Amazon EC2实例上自管理的OpenVPN,前面有一个公共的网络负载均衡器(NLB),将服务暴露给终端用户。一个Amazon EC2自动扩展组(ASG)处理扩展和缩减活动,跟踪相关的系统指标,例如内存、磁盘、CPU或检查在Amazon EC2实例上运行的VPN过程的健康状态。
当前自管理解决方案的挑战
尽管该架构通过利用至少两个可用区(AZ)具备可扩展性和弹性,但Glovo仍需自行管理基础设施,增加了运营开销和成本。Glovo负责维护VPN Amazon机器映像(AMI),包括相关的软件补丁和/或操作系统升级,以及管理任何新的AMI版本部署。
另外一个重大挑战是管理VPN用户的身份验证和授权:
身份验证
由于当前的VPN软件缺乏与外部身份存储的集成,Glovo利用内部构建的令牌服务为每次登录授予临时用户密码。VPN用户需要在每次登录尝试时手动生成一个新密码。VPN软件还需要与令牌服务内部连接,这通过使用AWS Transit Gateway实现。
授权
为了授予用户访问特定内部网络的权限,Glovo开发了一种自定义脚本,有效地将VPN用户映射到特定网络,利用Linux iptables。此脚本作为Amazon EC2 VPN安装的一部分执行,并且在创建/修改新的VPN用户配置文件时需要进行后续更新。
下图(图1)描绘了Glovo的初始VPN架构,并强调了前面提到的所有要点,同时表示身份验证和授权流程:
设计AWS Client VPN以支持增长
新的VPN架构设计原则是基于之前列出的需求和挑战定义的:
基础设施管理和可扩展性
Client VPN是区域性服务,Glovo在至少两个AWS可用区中部署了Client VPN端点。作为AWS托管服务,无需配置、维护或扩展基础设施。该服务还能扩展到超过4000个VPN用户。
身份验证
Glovo构建的令牌服务最初并未设计用于VPN,Glovo更希望通过OneLogin使用单点登录(SSO)来管理VPN身份,就像他们对待其他应用程序一样。这也消除了VPN用户的任何手动登录任务,因为他们现在使用自己的唯一OneLogin凭证。
授权
Glovo现在使用OneLogin用户角色(在SAML 2.0断言中称为“memberOf”属性)来定义用户与网络的访问权限。该属性随后通过“访问组ID”映射到Client VPN授权规则。
下图(图2)描绘了Glovo提议的VPN架构:
除了涵盖设计原则外,Glovo团队还注意到Client VPN提供的其他增强功能:
- 分离隧道:现在,只有目标VPC流量通过VPN路由,而不是将所有VPN用户流量(甚至互联网流量)都通过VPN。
- 敏捷性和自动化:Glovo利用Terraform管理Client VPN组件(客户端端点、授权规则)。Glovo团队现在能够提交额外端点/规则配置的请求。这些请求由Glovo相关安全团队审核,并在批准后部署。
Glovo还决定为不同的VPN用户组使用不同的Client VPN端点。这种配置提供了一些好处:
- VPN用户组分段,为每个VPN端点创建单独的授权规则
- 在部署不希望的授权规则或VPC端点配置时减少影响范围
- 促进VPN用户组的可追溯性。每个Client VPN端点会将VPN流量源NAT到其在子网中的弹性网络接口(ENI)。来自每个端点的流量在VPC之外是可追溯的,而之前所有VPN用户组都源NAT到同一个Amazon EC2实例ENI。为了进一步了解组内的单个VPN用户,Glovo利用每个端点的连接日志。
配置步骤
现在,我们已经描述了Glovo的挑战和需求,以下部分将更详细地涵盖配置步骤。
AWS Client VPN和OneLogin通过SAML 2.0集成
在Glovo的实施中,您必须在AWS服务(Client VPN)和身份提供者(IdP)OneLogin之间建立信任。这是通过从IdP导出特定应用程序的元数据信息并将其上传到您的AWS账户来完成的。有关更多细节,请参考“使用SAML身份验证AWS Client VPN用户”和“如何将AWS Client VPN与Azure Active Directory集成”。
对于OneLogin,Glovo遵循以下步骤:
- 在OneLogin管理员控制台中,在“应用程序”选项卡中选择“添加应用”。
- 在“查找应用程序”窗口中,找到AWS Client VPN。
- 提供应用程序的名称和描述,然后点击。
- 返回“应用程序”选项卡,选择新创建的应用程序。在左侧菜单中选择“SSO”选项卡,确保登录方法为SAML 2.0。通过选择“更多操作”和“SAML元数据”下载元数据文件。
请注意,Issuer URL、SAML 2.0 Endpoint和SLO Endpoint应由OneLogin填充——它们是OneLogin和AWS之间用于交换信息的配置端点。(这些字段在本博客中已被隐藏。)
AWS Client VPN自助服务门户和OneLogin通过SAML 2.0集成
如果您为Client VPN端点启用了自助服务门户,则可以向客户端提供自助服务门户URL。客户端可以在Web浏览器中访问该门户,并使用其用户凭证登录。在门户中,客户端可以下载Client VPN端点配置文件,并且他们还可以下载AWS提供的最新版本的客户端文件(1个Client VPN端点=1个配置文件)。请注意,对于SAML/SSO,您必须使用AWS提供的客户端版本1.2.0或更高版本。
为了配置此门户,您需要定义一个新的IAM身份提供者。
通过以上内容,您可以更好地理解Glovo如何成功迁移到AWS Client VPN,以及这一过程中的重要步骤和注意事项。