引言
在大规模的网络应用与服务中,用户认证可能会面临挑战。为每个应用拥有一套独立的凭证并不是一种高效的方法。这不仅给IT部门的管理带来困难,还会影响用户的体验。为了解决这一挑战,许多组织选择使用安全断言标记语言(SAML)2.0。SAML 2.0 是一种开放标准,允许组织集中管理其身份。通过 SAML,用户可以使用一组凭证连接到多个服务,从而显著改善他们的认证体验,并简化组织对多个应用的管理。
SAML 2.0 规范定义了每个组件的名称。集中身份存储被称为身份提供者(IdP),与之集成的应用程序称为服务提供者(SP)。
AWS Client VPN 使您的远程用户能够安全地连接到 AWS 及其他服务。通过 SAML 2.0 的联合认证,Client VPN 现在可以配置为您现有 IdP 的服务提供者。基于 SAML 的联合认证成为 Client VPN 的第三种认证选项,除了已经支持的 Active Directory 和基于证书的相互认证。
在本篇博客中,我将展示如何将 AWS Client VPN 与流行的身份提供者 Okta 集成。连接到 Client VPN 的远程用户可以使用与任何其他已与 Okta 集成的服务相同的凭证进行身份验证。
解决方案概述
我的架构包括一个托管单个 EC2 实例的目标 Amazon VPC。我创建了一个 Client VPN 端点并将其与我的 VPC 关联。连接到 Client VPN 的用户会通过我的 SAML IdP 进行身份验证。一旦成功认证,他们就可以连接到 EC2 实例。
下面的流程图展示了 Client VPN 的 SAML 身份验证过程。
如果您是第一次设置 SAML 集成,您必须在 IdP 和服务提供者(在本例中是 AWS Client VPN)之间建立信任。
- 用户尝试使用 AWS Client VPN 软件创建与 Client VPN 端点的 VPN 连接。如果该用户之前没有进行身份验证,他们会被重定向到默认浏览器中的 IdP。
- 用户在浏览器中通过提供凭证进行 IdP 身份验证,并在启用的情况下提供第二个身份验证因素。
- 身份验证成功后,IdP 会生成一个签名的 SAML 响应。这也称为 SAML 断言,并包含有关用户的详细信息,例如电子邮件和组成员资格。
- Client VPN 软件将 SAML 断言转发到 Client VPN 端点。由于 Client VPN 信任 IdP,因此这被接受为用户已通过身份验证的证明,连接会话得以建立。此时,组成员资格信息可用于授权访问特定资源。
我已将 Client VPN 设置为仅提供对目标 VPC 的网络访问,但您可以将其扩展到其他资源。您可以配置路由规则,以决定远程用户可以连接到哪些资源。您可以允许他们访问其他 AWS 服务、内部网络,甚至互联网。要了解更多有关如何架构 Client VPN 连接的信息,请参阅本博客文章。
在我的演示中,我设置了 Client VPN 的分流隧道,只将目标 VPC 的流量通过 VPN 转发。任何前往 VPC IP 范围以外的流量都会绕过 VPN。例如,大量的互联网视频流量将直接通过用户自己的网络访问互联网。
为了实现更细粒度的访问控制,我可以配置 SAML 组特定的授权规则。Client VPN 可以查看已认证用户的组成员资格。此信息可用于创建基于 IP 的访问权限。在此场景中,我仅允许属于“工程”组的用户连接到 EC2 实例。
如果您需要为远程用户启用多因素身份验证支持,可以在身份提供者层面进行启用。
先决条件
以下是进行设置所需的条件:
- AWS 账户
- 一个包含 EC2 实例的 Amazon VPC。
- 设置 VPC。
- 启动 EC2 实例。在实例的安全组中允许来自 VPC CIDR 范围的 ICMP 流量——这对于测试是必要的。
- 导入到 AWS 证书管理器(ACM)中的私有证书。
- 托管用户和组信息的 SAML IdP。
- AWS Client VPN 应用已通过 Okta 测试。未来将支持其他身份提供者。
- 运行最新 AWS Client VPN 软件的桌面(Windows 或 macOS)。您可以在此处下载软件。
步骤演示
与身份提供者建立信任
要将 Client VPN 与 SAML 集成,您必须在服务与 IdP 之间建立信任。这是通过从 IdP 导出特定于应用程序的元数据信息并将其上传到您的 AWS 账户来实现的。如前所述,我在此演示中使用 Okta 作为示例 IdP。
在 Okta 中创建 AWS Client VPN 应用
- 在 Okta 管理控制台的应用程序选项卡中选择“添加应用程序”。
- 提供应用程序标签,并通过点击“完成”结束该过程。
- 进入新创建的 AWS Client VPN 应用的“单点登录”选项卡,选择“编辑”。为了使 Okta 能够转发 SAML 组成员资格信息,您可以使用“memberOf”旁边的下拉菜单。为了转发所有组,我将其设置为“匹配正则表达式:.*”(注意前面的点)。
- 在“高级单点登录设置”下,指定默认端口 35001 并点击“保存”。这是 Client VPN 软件期望接收身份验证响应的端口。
- 要下载稍后所需的 Okta 元数据,可以选择“身份提供者元数据”。然后您可以右键单击并选择“另存链接为…”将其下载到本地计算机。
您可能已经在使用 Okta 或其他 SAML IdP 进行 AWS 管理控制台的访问认证。AWS Client VPN 是一个单独的应用程序,它需要 AWS 中唯一的身份提供者定义。即使是来自同一供应商的其他应用程序,您也不能重用已经定义的身份提供者。
- 打开 IAM 控制台,选择导航栏中的“身份提供者”。
- 点击“创建提供者”。
- 指定提供者类型为 SAML,为该提供者添加一个唯一名称,并上传元数据文档——即您从 Okta 下载的相同文件。
创建 AWS Client VPN 端点
以下步骤概述了创建将使用新添加的身份提供者的 Client VPN 所需的选项。有关使用其他身份验证选项设置 Client VPN 端点的详细步骤,您还可以参考之前的博客文章。
创建 Client VPN 端点
- 打开您选择的 AWS 区域中的 Amazon VPC 控制台。
- 在导航窗格中,选择“虚拟专用网络(VPN)”,然后选择“Client VPN 端点”。
- 点击“创建 Client VPN 端点”。
- 填写名称标签和描述,输入您想要的任何详细信息。
- 输入 10.200.0.0/22 作为 Client IPv4 CIDR。这是将分配给远程用户的 IP 范围。
- 对于服务器证书 ARN,选择您作为先决条件创建的证书。
- 在“身份验证选项”中,选择“使用基于用户的身份验证”,然后选择“联合身份验证”。
- 在 SAML 提供者 ARN 下拉菜单中,选择您之前配置的身份提供者。
- 在“连接日志”下,指定是否希望将连接记录在 Amazon CloudWatch 中。由于这是样本演示,您可以选择“否”。在生产环境中,您可以将所有连接记录到 Amazon CloudWatch。
- 在“其他可选参数”下,选择“启用分流隧道”,并保持其他设置不变。启用分流隧道选项确保只有目标 VPC IP 范围的流量通过 VPN 转发。
- 点击“创建 Client VPN 端点”。
通过以上步骤,您便成功设置了一个集成 SAML 的 AWS Client VPN,能够为您的远程用户提供便捷的安全连接。