本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
中的连接授权 AWS Client VPN
您可以为客户端VPN终端节点配置客户端连接处理程序。使用处理程序,您可以根据设备、用户和连接属性运行授权新连接的自定义逻辑。客户端连接处理程序在客户端VPN服务对设备和用户进行身份验证后运行。
要为客户端VPN终端节点配置客户端连接处理程序,请创建一个 AWS Lambda 函数,该函数将设备、用户和连接属性作为输入,并将允许或拒绝新连接的决定返回给客户端VPN服务。您可以在客户端VPN终端节点中指定 Lambda 函数。当设备连接到您的客户端VPN终端节点时,客户端VPN服务会代表您调用 Lambda 函数。只有经 Lambda 函数授权的连接才允许连接到客户端VPN终端节点。
注意
目前,唯一受支持的客户端连接处理程序类型是 Lambda 函数。
要求和注意事项
以下是客户端连接处理程序的要求和注意事项:
-
Lambda 函数的名称必须以
AWSClientVPN-
前缀开头。 -
支持合格的 Lambda 函数。
-
Lambda 函数必须与客户端VPN终端节点位于同一 AWS 区域和同一 AWS 账户。
-
Lambda 函数在 30 秒后超时。该值不能更改。
-
Lambda 函数是同步调用的。在设备和用户身份验证之后、评估授权规则之前调用它。
-
如果为新连接调用 Lambda 函数,但客户端VPN服务未从该函数获得预期的响应,则客户端VPN服务会拒绝连接请求。例如,如果 Lambda 函数受到限制、超时或遇到其他意外错误,或者函数的响应格式不是有效的,则可能会发生这种情况。
-
建议您为 Lambda 函数配置预置并发,以使其能够在不影响延迟的情况下进行扩展。
-
如果您更新 Lambda 函数,则与客户端VPN终端节点的现有连接不会受到影响。您可以终止现有连接,然后指示客户端建立新连接。有关更多信息,请参阅 终止 AWS Client VPN 客户端连接。
-
如果客户端使用 AWS 提供的客户端连接到客户端VPN终端节点,则必须使用适用于 Windows 的 1.2.6 或更高版本,对于 macOS 必须使用 1.2.4 或更高版本。有关更多信息,请参阅使用 AWS 提供的客户端进行连接。
Lambda 接口
Lambda 函数将设备属性、用户属性和连接属性作为客户端VPN服务的输入。然后,它必须向客户端VPN服务返回允许还是拒绝连接的决定。
请求架构
Lambda 函数将包含以下字段的 b JSON lob 作为输入。
{ "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
– 操作系统的版本。当客户端连接到客户端VPN端点以及客户端运行 Windows 平台时,如果打开VPN客户端配置中存在该--push-peer-info
指令,则客户端VPN服务会提供一个值。 -
public-ip
– 连接设备的公有 IP 地址。 -
client-openvpn-version
— 客户端正在使用的开放VPN版本。 -
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 函数进行状况评估,则这是连接设备的状态列表。您可以根据设备的状况评估类别定义状态名称,例如compliant
、quarantined
、unknown
等。每个名称最长可达 255 个字符。您最多可以指定 10 个状态。 -
schema-version
– 必需。schema 版本。默认为v3
。
您可以对同一区域中的多个客户端VPN终端节点使用相同的 Lambda 函数。
有关创建 Lambda 函数的更多信息,请参阅 AWS Lambda 开发人员指南中的 AWS Lambda入门。
使用客户端连接处理程序进行状况评测
您可以使用客户端连接处理程序将您的客户端VPN终端节点与现有的设备管理解决方案集成,以评估连接设备的状态合规性。要让 Lambda 函数用作设备授权处理程序,请对您的客户端VPN终端节点使用相互身份验证。为将连接到客户端VPN端点的每个客户端(设备)创建唯一的客户端证书和密钥。Lambda 函数可以使用客户端证书(从客户端VPN服务传递的)的唯一公用名来识别设备并从您的设备管理解决方案中获取其状态合规性状态。您可以将双向身份验证与基于用户的身份验证结合使用。
或者,您可以在 Lambda 函数本身中进行基本状况评估。例如,您可以评估客户端服务VPN传递给 Lambda 函数的platform
和platform-version
字段。
注意
虽然连接处理程序可用于强制执行 AWS Client VPN 应用程序的最低版本,但连接处理程序aws-client-version
中的字段仅适用于 AWS Client VPN 应用程序,并且是通过用户设备上的环境变量填充的。
启用客户端连接处理程序
要启用客户端连接处理程序,请创建或修改客户端VPN终端节点,并指定 Lambda 函数的 Amazon 资源名称 (ARN)。有关更多信息,请参阅创建 AWS Client VPN 终端节点 和修改 AWS Client VPN 终端节点。
服务相关角色
AWS Client VPN 在您的账户中自动创建一个名AWSServiceRoleForClientVPNConnections为的服务相关角色。该角色有权在与客户端VPN终端节点建立连接时调用 Lambda 函数。有关更多信息,请参阅 将服务相关角色用于 AWS Client VPN。
监控连接授权失败
您可以查看客户端VPN终端节点连接的连接授权状态。有关更多信息,请参阅 查看 AWS Client VPN 客户端连接。
当使用客户端连接处理程序进行状态评估时,您还可以在连接日志中查看连接到您的客户端VPN终端节点的设备的状态合规性状态。有关更多信息,请参阅 AWS Client 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
– 尝试连接期间出现服务端错误。