【发布时间】:2017-04-17 17:56:37
【问题描述】:
在过去的几天里,我使用 GSS-API 和 SPNEGO 构建了一个概念验证演示。目的是让用户通过 Http RESTful Web 服务单点登录访问我们的自定义应用服务器提供的服务。
持有有效 Kerberos Ticket Granting Ticket (TGT) 的用户可以调用启用了 SPNEGO 的 Web 服务,客户端和服务器将协商, 用户将被验证(通过 Kerberos 和应用程序级别),并且(在成功验证后)在他的票证缓存中拥有我的服务主体的服务票证。
使用带有 --negotiate 标志的 CURL 作为测试客户端时效果很好。
在第一次通过时,CURL 发出一个没有特殊标头的普通 HTTP 请求。该请求被服务器拒绝, 它将“WWW-Authenticate: Negotiate”添加到响应标头中,建议进行协商。 然后,CURL 从 KDC 获取服务票证,并发出第二个请求,这次使用 Negotiate + 请求标头中的包装服务票证 (NegTokenInit) 然后,服务器打开票证,对用户进行身份验证,并(如果身份验证成功)执行请求的服务(例如登录)。
问题是,从客户端到服务器的后续服务调用应该发生什么? 客户端现在有一个有效的 Kerberos 服务票证,但通过 CURL 的附加调用使用 SPNEGO 进行与上述相同的两次传递。
在我看来,我有很多选择:
1) 每个服务调用都重复完整的 2 遍 SPNEGO 协商(就像 CURL 一样)。 虽然这可能是最简单的选择,但至少在理论上会有一些开销:客户端和服务器都在创建和拆除 GSS 上下文,并且请求通过网络发送两次,对于 GET 来说可能没问题,对于 POST 来说则更少,如以下问题中所述:
Why does the Authorization line change for every firefox request?
Why Firefox keeps negotiating kerberos service tickets?
但开销* 在现实生活中是否明显?我想只有性能测试才能说明问题。
2) 第一次调用使用 SPNEGO 协商。一旦成功通过身份验证,后续调用将使用应用程序级别的身份验证。 这似乎是 Websphere Application Server 采用的方法,它使用轻量级第三方身份验证 (LTPA) 安全令牌进行后续调用。
最初这似乎有点奇怪。已经成功协商可以使用 Kerberos,为什么要退回到其他东西呢?另一方面,如果 GSS-API / SPNEGO 可以被证明会导致明显的开销/性能损失,那么这种方法可能是有效的。
3) 第一次调用使用 SPNEGO 协商。一旦成功通过身份验证和信任,后续调用将使用 GSS-API Kerberos。 在这种情况下,我不妨执行下面的选项 4)。
4) 转储 SPNEGO,使用“纯”GSS-API Kerberos。 我可以通过自定义 Http 标头或 cookie 交换 Kerberos 票证。
有最佳做法吗?
作为背景:客户端和服务器应用程序都在我的控制之下,两者都是用 java 实现的,而且我都知道“说”Kerberos。 我选择 SPNEGO 作为概念验证的“起点”,以及进入 Kerberos 和单点登录的世界,但这不是硬性要求。
概念验证在具有 FreeIPA 的 OEL Linux 服务器上运行(因为这是我在我们的地牢中拥有的),但可能的应用程序将是 Windows / Active Directory。
* 或与其他性能因素(如数据库、消息正文使用 XML 与 JSON 等)相比具有显着性。
** 如果将来我们希望允许基于浏览器访问 Web 服务,那么 SPNEGO 将是可行的方法。
【问题讨论】:
-
仅供参考,这对于 Hadoop 生态系统来说是一个真正的问题,因为 Kerberos 旨在再次验证 1 个主机上的 1 个服务,而不是 5800 个主机上的 5 个 svcs……他们实现的是 (a) 用于 RPC 调用, 委托令牌(在对等 svc 主机之间共享的一种 MD5 哈希) 和 (b) 用于 REST 调用和 UI,签名 cookie (使用 std 令牌的 WebHDFS 除外)我>
-
这都是开源的,所以你可以检查他们的代码——以及 JIRA 详细解释了“签名 cookie”的基本原理,并带有反对/争论/等。 (我认为这是关于使用 SPNego 保护 YARN UI...)
-
或者,您甚至可以从 Horton 或 Cloudera 安装 Hadoop 沙箱,为内部 svcs 和 UI 启用 Kerberos,并查看 cURL 和朋友会发生什么(WebHDFS 除外 - 见上文)
-
关于“基于浏览器的访问”和“Active Directory”的旁注——您知道 Microsoft 生态系统使用 SSPI 而不是 GSSAPI,对吧?所以你将不得不重新设计你的 PoC 的大部分......?
-
关于上面提到的JIRA > issues.apache.org/jira/browse/HADOOP-7119
标签: java web-services kerberos spnego gssapi