连接授权 - AWS Client VPN

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

连接授权

您可以为客户端 VPN 终端节点配置客户端连接处理程序。使用处理程序,您可以根据设备、用户和连接属性运行授权新连接的自定义逻辑。客户端连接处理程序在客户端 VPN 服务对设备和用户进行身份验证后运行。

要为客户端 VPN 终端节点配置客户端连接处理程序,请创建一个 AWS Lambda 函数,该函数获取设备、用户和连接属性作为输入,然后向客户端 VPN 服务返回允许或拒绝新连接的决定。您在客户端 VPN 终端节点中指定该 Lambda 函数。当设备连接到客户端 VPN 终端节点时,客户端 VPN 服务将代表您调用该 Lambda 函数。只允许该 Lambda 函数授权的连接来连接到客户端 VPN 终端节点。

注意

目前,唯一受支持的客户端连接处理程序类型是 Lambda 函数。

要求和注意事项

以下是客户端连接处理程序的要求和注意事项:

  • Lambda 函数的名称必须以 AWSClientVPN- 前缀开头。

  • 支持合格的 Lambda 函数。

  • Lambda 函数必须与 Client VPN 终端节点位于同一个 AWS 区域和同一个 AWS 账户。

  • Lambda 函数在 30 秒后超时。该值不能更改。

  • Lambda 函数是同步调用的。在设备和用户身份验证之后、评估授权规则之前调用它。

  • 如果为新连接调用了 Lambda 函数,但客户端 VPN 服务没有从该函数获得预期响应,则客户端 VPN 服务将拒绝连接请求。例如,如果 Lambda 函数受到限制、超时或遇到其他意外错误,或者函数的响应格式不是有效的,则可能会发生这种情况。

  • 我们建议您为 Lambda 函数配置预置并发,以使其能够在不影响延迟的情况下进行扩展。

  • 如果您更新 Lambda 函数,与客户端 VPN 终端节点的现有连接不受影响。您可以终止现有连接,然后指示客户端建立新连接。有关更多信息,请参阅 终止客户端连接

  • 如果客户端使用 AWS 提供的客户端连接到 Client VPN 端点,则必须在 Windows 上使用 1.2.6 或更高版本,对于 macOS 必须使用 1.2.4 或更高版本。有关更多信息,请参阅使用 AWS 提供的客户端进行连接

Lambda 接口

Lambda 函数从客户端 VPN 服务获取设备属性、用户属性和连接属性作为输入。然后,它必须将是允许还是拒绝连接的决定返回给客户端 VPN 服务。

请求 schema

Lambda 函数获取包含以下字段的 JSON blob 作为输入。

{ "connection-id": <connection ID>, "endpoint-id": <client VPN endpoint ID>, "common-name": <cert-common-name>, "username": <user identifier>, "platform": <OS platform>, "platform-version": <OS version>, "public-ip": <public IP address>, "client-openvpn-version": <client OpenVPN version>, "aws-client-version": <AWS client version>, "groups": <group identifier>, "schema-version": "v3" }
  • connection-id – 到客户端 VPN 终端节点的客户端连接的 ID。

  • endpoint-id – 客户端 VPN 终端节点的 ID。

  • common-name – 设备标识符。在为设备创建的客户端证书中,公用名唯一标识设备。

  • username – 用户标识符(如果适用)。对于 Active Directory 身份验证,这是用户名。对于基于 SAML 的联合身份验证,这是 NameID。对于双向身份验证,此字段为空。

  • platform – 客户端操作系统平台。

  • platform-version – 操作系统的版本。当 OpenVPN 客户端配置中存在 --push-peer-info 指令、客户端连接到客户端 VPN 终端节点且客户端运行 Windows 平台时,客户端 VPN 服务会提供值。

  • public-ip – 连接设备的公有 IP 地址。

  • client-openvpn-version – 客户端使用的 OpenVPN 版本。

  • aws-client-version— AWS 客户端版本。

  • groups – 组标识符(如果适用)。对于 Active Directory 身份验证,这将是 Active Directory 组列表。对于基于 SAML 的联合身份验证,这将是身份提供商 (IdP) 组列表。对于双向身份验证,此字段为空。

  • schema-version – schema 版本。默认为 v3

响应 schema

Lambda 函数必须返回以下字段。

{ "allow": boolean, "error-msg-on-denied-connection": "", "posture-compliance-statuses": [], "schema-version": "v3" }
  • allow – 必需。一个布尔值 (true | false),指示是允许还是拒绝新连接。

  • error-msg-on-denied-connection – 必需。最多包含 255 个字符的字符串,可用于在 Lambda 函数拒绝连接时向客户端提供步骤和指导。如果在 Lambda 函数运行期间出现故障(例如,由于限制),将向客户端返回以下默认消息。

    Error establishing connection. Please contact your administrator.
  • posture-compliance-statuses – 必需。如果您使用 Lambda 函数进行状况评估,则这是连接设备的状态列表。您可以根据设备的状况评估类别定义状态名称,例如 compliantquarantinedunknown 等。每个名称最长可达 255 个字符。您最多可以指定 10 个状态。

  • schema-version – 必需。schema 版本。默认为 v3

您可以将同一个 Lambda 函数用于同一区域中的多个客户端 VPN 终端节点。

有关创建 Lambda 函数的更多信息,请参阅 AWS Lambda 开发人员指南中的 AWS Lambda入门

使用客户端连接处理程序进行状况评估

您可以使用客户端连接处理程序将客户端 VPN 终端节点与现有设备管理解决方案集成,以评估连接设备的状况合规性。要使 Lambda 函数用作设备授权处理程序,请对客户端 VPN 终端节点使用双向身份验证。为将连接到客户端 VPN 终端节点的每个客户端(设备)创建唯一的客户端证书和密钥。Lambda 函数可以使用客户端证书的唯一公用名(从客户端 VPN 服务传递)来识别设备并从设备管理解决方案中获取其状况合规性状态。您可以将双向身份验证与基于用户的身份验证结合使用。

或者,您可以在 Lambda 函数本身中进行基本状况评估。例如,您可以评估客户端 VPN 服务传递给 Lambda 函数的 platformplatform-version 字段。

注意

虽然连接处理程序可用于强制执行 AWS Client VPN 应用程序的最低版本,但连接处理程序aws-client-version中的字段仅适用于 AWS Client VPN 应用程序,并且是通过用户设备上的环境变量填充的。

启用客户端连接处理程序

要启用客户端连接处理程序,请创建或修改客户端 VPN 终端节点,然后指定 Lambda 函数的 Amazon 资源名称 (ARN)。有关更多信息,请参阅 创建 Client VPN 终端节点修改 Client VPN 终端节点

服务相关角色

AWS Client VPN 在您的账户中自动创建一个名AWSServiceRoleForClientVPNConnections为的服务相关角色。当与客户端 VPN 终端节点建立连接时,该角色有权调用 Lambda 函数。有关更多信息,请参阅对客户端 VPN 使用服务相关角色

监控连接授权失败

您可以查看到客户端 VPN 终端节点的连接的连接授权状态。有关更多信息,请参阅查看客户端连接

当客户端连接处理程序用于状况评估时,您还可以在连接日志中查看连接到客户端 VPN 终端节点的设备的状况合规性状态。有关更多信息,请参阅连接日志记录

如果设备未通过连接授权,则连接日志中的 connection-attempt-failure-reason 字段将返回以下失败原因之一:

  • client-connect-failed – Lambda 函数阻止建立连接。

  • client-connect-handler-timed-out – Lambda 函数超时。

  • client-connect-handler-other-execution-error – Lambda 函数遇到意外错误。

  • client-connect-handler-throttled – Lambda 函数受到限制。

  • client-connect-handler-invalid-response – Lambda 函数返回的响应无效。

  • client-connect-handler-service-error – 尝试连接期间出现服务端错误。