通过 Citrix ADC 设备进行 API 身份验证
现代应用程序与客户交互的方式发生了范式转变。传统上,浏览器客户端用于访问服务。应用程序设置会话 Cookie 以跟踪用户上下文。现代和分布式应用程序使维护微服务之间的用户会话变得困难。因此,大多数应用程序访问都基于API。 与这些分布式服务通信的客户端也得到了发展。大多数客户从名为授权服务器的可信实体获取令牌以证明用户身份和访问权限。然后,这些客户端在每次访问请求时向应用程序提供令牌。因此,像 Citrix ADC 这样的传统代理设备需要发展以支持这些客户端。Citrix ADC 设备为管理员提供了一种处理此类流量的方法。Citrix ADC 可以作为 API 网关部署到前端,将所有发往已发布服务的流量部署到前端。可以为传统(混合多云或 HMC)或云原生环境部署 API 网关。API 网关终止所有入站流量,以提供多种服务,例如身份验证、授权、速率限制、路由、缓存、SSL 卸载、应用程序防火墙等。因此,它成为基础架构中的关键组件。
令牌类型
在 API 访问期间交换的令牌主要符合 OAuth/OpenID Connect (OIDC) 协议。仅用于“委托访问”的访问令牌符合 OAuth 协议,而符合 OIDC 的 ID 令牌也包含用户信息。 访问令牌通常是不透明或随机的数据块。但是,它们有时可以是符合 JWT(JSON Web Token)标准的签名令牌。ID 令牌始终是签名的 JWT。
使用 OAuth 访问 API
Citrix ADC 设备上的 OAuth 身份验证类型可用于处理 OAuth 和 OIDC 协议。OIDC 是 OAuth 协议的扩展。
Citrix ADC 设备上的 OAuthAction 可用于处理浏览器等交互式客户端和本地客户端(例如客户端应用程序)。交互式客户端被重定向到身份提供商以使用 OIDC 协议进行登录。原生客户端可以带外获取令牌,并可以在 Citrix ADC 设备上出示这些令牌以供访问。
注意:
从端点获取的访问令牌可以缓存以供后续请求使用,从而增强 API 性能。
要使用命令行界面配置令牌缓存支持,请在命令提示符处键入以下命令:
set aaaparameter -APITokenCache <ENABLED>
<!--NeedCopy-->
以下部分描述了本机客户端执行的 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
<!--NeedCopy-->
注意:
必须将服务绑定到流量管理虚拟服务器,并将身份验证策略(使用 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>
<!--NeedCopy-->
其中,
-
Client ID(客户端 ID)- 标识 SP 的唯一字符串。授权服务器使用此 ID 推断客户端配置。最大长度:127。
-
客户端密钥 - 由用户和授权服务器建立的密钥字符串。最大长度:239。
-
authorizationEndpoint - 用户通常登录的 URL(使用交互式客户端时)。
-
tokenEndpoint - 授权服务器上获取/交换令牌/代码的 URL
-
certEndpoint - 授权服务器发布用于签名令牌的公钥的 URL。授权服务器可以发布多个密钥并选择其中一个来签署令牌。
注意: Client ID/Client Secret/authorizationEndpoint/TokenEndpoint 是 API 访问的可选参数。但是,最好为这些参数提供值,因为操作实体可以重复用于不同的目的。
在前面的配置中,“certEndpointpoint”对于 ID 令牌验证至关重要。此端点包含用于对令牌进行签名的证书的公钥。这些公钥必须符合 JWK(JSON 网络密钥)规范。
在 Citrix ADC 设备上配置 certEndpoint 后,它会定期轮询端点(默认间隔为 1 天,可在配置中自定义),以使公钥保持最新状态。公钥可用后,ADC 可以对传入的 ID 令牌进行本地验证。
不透明访问令牌的 OAuth 配置
无法在 Citrix ADC 设备上本地验证不透明令牌。这些需要在授权服务器上进行验证。Citrix ADC 设备使用 OAuth 规范中提到的 “内省协议” 来验证这些令牌。OAuth 配置中提供了一个名为 introspectURL 的新选项,用于验证不透明的令牌。
set oauthAction oauth-api-acccess -introspectURL <uri of the Authorization Server for introspection>
<!--NeedCopy-->
自检 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
<!--NeedCopy-->
将策略绑定到身份验证虚拟服务器
创建 OAuthAction 后,需要创建相应的策略来调用它。
add authentication policy oauth-api-access -rule <> -action <oauth-api-access>
bind authentication vserver auth-api-access -policy oauth-api-access -pri 100
<!--NeedCopy-->
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 oAuthAction oauth-api-access -audience oauth_audiences
<!--NeedCopy-->
在前面的示例中,在模式集中指定了多个受众。因此,只有当传入令牌包含模式集中的任何配置的 URL 时,才允许使用该令牌。
发行者:要接受其令牌的服务器的身份。 最大长度:127。最好在 OAuth 操作中配置令牌的发行者。这样可以确保不允许使用错误的授权服务器颁发的令牌。
SkewTime:指定 Citrix ADC 设备在传入令牌上允许的时钟偏差(以分钟为单位)。例如,如果 skewTime 为 10,那么令牌的有效期为(当前时间 - 10)分钟至(当前时间 + 10)分钟,也就是 20 分钟。默认值:5
AllowedAlgorithms:此选项允许管理员限制传入令牌中的某些算法。默认情况下,允许使用所有支持的方法。但是,可以使用此选项对其进行控制。
以下配置确保仅允许使用 RS256 和 RS512 的令牌:
set oAuthAction oauth-api-access -allowedAlgorithms RS256 RS512
<!--NeedCopy-->
完成上述配置后,仅允许使用 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
<!--NeedCopy-->
NO_AUTHN 是一种隐式操作,它会在规则匹配时完成身份验证。除了 API 访问的范围之外,NO_AUTHN 操作还有其他用途。