Citrix ADC

使用 Citrix ADC 设备进行 API 身份验证

现代应用程序与客户交互的方式发生了范式转变。传统上,浏览器客户端用于访问服务。应用程序通常会设置会话 cookie 来跟踪用户上下文。现代化的分布式应用程序使得跨微服务维护用户会话变得困难。因此,大多数应用程序访问都基于 API。 与这些分布式服务进行通信的客户端也不断发展。大多数客户端从称为授权服务器的受信任实体获取令牌,以证明用户身份和访问权限。然后,这些客户端将令牌与每个访问请求一起呈现给应用程序。因此,需要改进像 Citrix ADC 这样的传统代理设备以支持这些客户端。Citrix ADC 设备为管理员提供了一种处理此类流量的方法。Citrix ADC 可以部署为 API 网关,以便前端发送到已发布服务的所有流量。API 网关可以部署在传统(混合多云或 HMC)或云原生环境中。API Gateway 终止所有入站流量,以提供多种服务,如身份验证、授权、速率限制、路由、缓存、SSL 卸载、应用程序防火墙等。因此,它成为基础架构中的一个关键组成部分。

令牌类型

API 访问期间交换的令牌大多符合 OAuth/OpenID 连接 (OIDC) 协议。仅用于“委派访问”的访问令牌符合 OAuth 协议,而符合 OIDC 的 ID 令牌也包含用户信息。 访问令牌通常是不透明或随机的数据 Blob。但是,它们有时可能是符合 JWT(Json Web 令牌)标准的单独令牌。ID 令牌始终是签名的 JWT。

使用 OAuth 访问 API

Citrix ADC 设备上的 OAuth 身份验证类型可用于处理 OAuth 和 OIDC 协议。OIDC 是 OAuth 协议的扩展。

Citrix ADC 设备上的 OAuthAction 可用于处理交互式客户端,如浏览器和本机客户端(如客户端应用程序)。交互式客户端将重定向到身份提供程序使用 OIDC 协议登录。本机客户端可以获取带外令牌,并可以在 Citrix ADC 设备上显示这些令牌以供访问。

注意: 从终端获取的访问令牌可以缓存以供后续请求使用,从而提高 API 性能。

要使用命令行界面配置令牌缓存支持,请在命令提示符处键入以下命令:

set aaaparameter –apITokenCache <ENABLED>

以下各节介绍了本地客户端执行的 API 访问方法。

用于 API 访问的虚拟服务器

要部署 Citrix ADC 设备以进行 API 访问,通过 401 身份验证部署流量管理 (TM) 虚拟服务器。它与身份验证(身份验证、授权和审核)虚拟服务器相关联,以保存身份验证和会话策略。以下配置代码段创建一个此类虚拟服务器。

Add lb vserver lb-api-access SSL <IP> 443 -authn401 On -AuthnVsName auth-api-access

Bind ssl vserver lb-api-access -certkeyName <ssl-cert-entity>

Add authentication vserver auth-api-access SSL

注意: 您需要将服务绑定到 TM vserver,并将身份验证策略(如下所述的 OAuthAction)绑定到身份验证虚拟服务器以完成配置。

创建虚拟服务器后,需要添加 OAuthAction 以及相应的策略。OAuth 操作中还有其他几个选项,具体取决于令牌类型和其他安全机制。

ID 令牌的 OAuth 配置

ID 令牌始终是签名的 JWT。也就是说,它们携带标题、有效载荷和签名称。由于这些都是独立的令牌,Citrix ADC 设备可以在本地验证这些令牌。要验证这些令牌,设备需要知道用于对这些令牌进行签名的相应私钥的公钥。

以下是一个带有某些强制参数和“CertendPoint”的 OAuthAction 示例。

Add authentication OAuthAction oauth-api-access -clientid <your-client-id> -clientsecret <your-client-secret> -authorizationEndpoint <URL to which users would be redirected for login> -tokenEndpoint <endpoint at which tokens could be obtained> -certEndpoint <uri at which public keys of IdP are published>

其中,

  • 客户端 ID — 标识 SP 的唯一字符串。授权服务器使用此 ID 推断客户端配置。最大长度:127。

  • 客户端密码 — 由用户和授权服务器建立的密码字符串。最大长度:239。

  • authorizationEndpoint - 用户通常登录的 URL(使用交互式客户端时)。

  • tokenEndpoint -在授权服务器上提供/交换令牌/代码的 URL

  • certEndpoint -授权服务器发布用于签名令牌的公钥的 URL。授权服务器可以发布多个密钥,并选择其中一个签名令牌。

注意: 客户端 ID/客户端秘密/授权端点/令牌端点是 API 访问的可选参数。但是,为这些参数提供值是一种很好的做法,因为操作实体可以用于不同的目的。

在前面的配置中,“CertendPoint”对于 ID 令牌验证至关重要。此端点包含用于对令牌进行签名的证书的公钥。这些公钥必须符合 JWK(Json Web 密钥)规范。

在 Citrix ADC 设备上配置 CertendPoint 后,它将定期轮询端点(默认间隔为 1 天,可在配置中自定义),以使公钥保持最新状态。公钥可用后,ADC 可以对传入的 ID 令牌执行本地验证。

图 1. ID 令牌的 OAuth 流程

ID 令牌的 OAuth 流程

不透明访问令牌的 OAuth 配置

不透明令牌无法在 Citrix ADC 设备上进行本地验证。这些需要在授权服务器上进行验证。Citrix ADC 设备使用 OAuth 规范中提到的“内省协议”来验证这些令牌。OAuth 配置中提供了一个新选项,即 Introspecturl,用于验证不透明令牌。

Set oauthAction oauth-api-acccess -introspectURL <uri of the Authorization Server for introspection>

图 2. 访问令牌的 OAuth 流程

访问令牌的 OAuth 流程

内省 API 的格式符合https://tools.ietf.org/html/rfc7662#section-2.1 以下规范:

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
token=mF_9.B5f-4.1JqM&token_type_hint=access_token

将策略绑定到身份验证 vserver

创建 OAuthAction 后,需要创建相应的策略来调用它。

add authentication policy oauth-api-access -rule <> -action <oauth-api-access>```

bind authentication vserver auth-api-access -policy oauth-api-access -pri 100

Citrix ADC 设备上的其他安全设置

令牌验证包括令牌生命周期检查。超出可接受时间的令牌将被拒绝。以下是额外安全性的附加设置。其中一些建议始终进行配置。

:可以使用令牌的预期收件人配置 OAuth 操作。所有令牌都与此配置的 URL 匹配。Citrix ADC 设备具有一个附加功能,其中受众字段实际上指向设备上的模式集。使用此模式集,管理员可以为受众配置多个 URL。

Add policy patset oauth_audiences

Bind patset oauth_audiences https://app1.company.com

Bind patset oauth_audiences https://app2.company.com

Bind patset oauth_audiences httpsL//app1.company.com/path1

Set oAuthAccess oauth-api-access -audience oauth_audiences

在上面的示例中,在模式集中指定了多个受众。因此,只有当传入令牌包含模式集中的任何已配置 URL 时,才允许传入令牌。

发行者:要接受其令牌的服务器的标识。最大长度:127。在 OAuth 操作中配置令牌的发行者是一种很好的做法。这可确保不允许由错误的授权服务器颁发的令牌。

SkewTime:指定 Citrix ADC 设备在传入令牌上允许的时钟偏斜(以分钟为单位)。例如,如果 SkewTime 为 10,则令牌的有效期为(当前时间-10)分钟到(当前时间 + 10)分钟,即总共 20 分钟。默认值:5

AllowedAlgorithms:此选项允许管理员限制传入令牌中的某些算法。默认情况下,允许使用所有支持的方法。但是,这些可以使用此选项控制。

以下配置确保仅允许使用 RS256 和 RS512 的令牌:

Set oAuthAction oauth-api-access -allowedAlgorithms RS256 RS512

在上述配置之后,只允许使用 RS256 和 RS512 的令牌。

绕过身份验证中的某些流量

在许多情况下,有一些发现 API 可供客户端公开访问。这些 API 通常会显示服务本身的配置和功能。管理员可以使用“无身份验证”策略将 Citrix ADC 设备配置为绕过这些元数据 URL 的身份验证,如下所述:

Add authentication policy auth-bypass-policy -rule <> -action NO_AUTHN
Bind authentication vserver auth-api-access -policy auth-bypass-policy -pri 110

NO_AUTHN 是一种隐式操作,可在规则匹配时完成身份验证。除了 API 访问的范围之外,NO_UTHN 操作还有其他用途。