SPNEGO:成功的谈判和身份验证后的后续调用
在过去几天中,我已经使用GSS-API和SPNEGO构建了概念验证演示。其目的是让用户通过Http RESTful Web服务单点登录我们定制应用服务器提供的服务。SPNEGO:成功的谈判和身份验证后的后续调用
持有有效Kerberos票据授予票据(TGT)的用户可以调用启用SPNEGO的Web服务,客户端和服务器将协商, 用户将通过身份验证(由Kerberos和应用程序级别),并且将(在成功认证时)在他的票证缓存中为我的服务负责人提供服务票据。
这可以很好地使用CURL与--negotiate标志作为测试客户端。
第一次通过CURL发出一个正常的HTTP请求,没有特殊的标题。服务器拒绝此请求, 向响应头添加“WWW-Authenticate:Negotiate”,表示协商。 CURL然后从KDC获得一个服务票据,并发出第二个请求,这次是Negotiate +请求头中包装好的服务票据(NegTokenInit) 服务器然后解开票据,验证用户和(如果验证是成功)执行所请求的服务(例如登录)。
问题是,从客户端到服务器的后续服务调用会发生什么? 客户端现在拥有一个有效的Kerberos服务票据,但使用SPNEGO通过CURL进行的其他呼叫也会生成上述相同的两个通行证。
在我看来,我有很多的选择:
1)每一个服务调用重复整整2通SPNEGO谈判(如CURL一样)。 虽然这可能是最简单的选择,但理论上至少在理论上会有一些开销:客户端和服务器都在创建和拆除GSS上下文,并且该请求在网络上发送两次,对于GET可能不错,对于员额,讨论以下问题:
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和Single Sign On的世界,但这并不是一个硬性要求。
概念证明运行在带有FreeIPA的OEL Linux服务器上(因为这是我在地下城里的),但可能的应用程序将是Windows/Active Directory。
*或显著相比其他性能因素,如数据库,XML的使用VS JSON的消息体等
**如果在未来,我们希望允许基于浏览器的访问网络服务,那么SPNEGO将是最好的选择。
在重新阅读我的问题,我要问的问题是:
一)是SPNEGO足够显著,这是有道理的使用开销,如果一个仅授权,而且“别的东西“应该用于随后的服务呼叫?
或
B)是SPNEGO在事物的更大的计划不显著的开销,并且可以用于所有的服务电话?
答案是:这取决于案件;而找出问题的关键是衡量有无SPNEGO服务呼叫的性能。
今天我用跑了4个基本的测试案例:
- 一个简单的 “ping” 类型的Web服务,而无需SPNEGO
- 一个简单的 “平” 型网络服务队,利用SPNEGO
- 一调用应用程序的登录服务,而SPNEGO
- 到应用程序的登录服务的调用,使用SPNEGO
每个测试卡莱d从一个ksh脚本循环60秒,并在那段时间内尽可能多地通过CURL调用。
在第一测试运行余测量:
没有SPNEGO
- 15坪
- 11登录
随着SPENGO
- 8坪 个
- 8登录
这初步表明,使用SPNEGO我只能做一半的电话。但是,经过反思,即使考虑到使用的虚拟机规格不佳,测量的总体呼叫量也似乎很低。
经过一些Google搜索和调优后,我重新调用了所有使用IPV4的-4标志调用CURL的测试。这给了以下内容:
没有SPNEGO
- 300多坪
- 100+登录
随着SPNEGO
- 19坪
- 14登录
这表明有和没有SPNEGO有显着差异!
虽然我需要做一些后端处理的真实世界的服务做进一步的测试,但这表明在通过SPNEGO进行身份验证之后,“使用其他服务”用于后续服务调用存在强大的情况。
在他的评论参孙记录了Hadoop的世界的先河,并增加了高度分散/可用服务主体
附加考虑:您是否有专用的KDC *(例如Active Directory副本)*,还是必须与其他关键应用程序共享*(例如,Windows身份验证,网络驱动器身份验证,Exchange身份验证...) *这意味着您不得“意外”地将共享的KDC与DDoS类事件瘫痪(例如,在您自己的服务器中超时引发“重新连接雪崩”......这些事情发生) –
您可能“接受”您的答案自己的问题作为解决方案。请这样做。它将复选框从灰色变成绿色,当我没有足够的时间浏览本网站时,这些是我喜欢挖掘的问题类型。 –
@JohnRSmith,tx,我意识到这一点,并计划在接下来的几天内这样做,但首先我会根据最新的测试结果对我的答案进行编辑,以及对另一个SO间接影响很大的SO问题这个问题 – FlyingSheep
的额外的架构考虑要回答你的第一个问题,GSS-SPNEGO可以包括多次往返。它不仅限于两个。您应该实施会话处理,并在成功认证时发出客户端应该在每个请求上呈现的会话cookie。当此cookie无效时,服务器将强制您重新进行身份验证。这种方式只会在真正需要时引起谈判成本。
根据您的应用程序设计,您可以选择不同的身份验证方法。在FreeIPA中,我们一直建议进行前端身份验证,并允许应用程序重新使用前端对用户进行身份验证的事实。有关不同方法的详细说明,请参阅http://www.freeipa.org/page/Web_App_Authentication。
我建议你阅读上面提到的链接,并检查材料由我的同事做:https://www.adelton.com/他是一个数字Apache(以及Nginx的)模块,可以帮助解耦从实际的Web应用程序时的身份验证的作者与FreeIPA一起使用。
考虑到那里有大量的Kerberos知识,我几乎在FreeIPA用户邮件列表上发布了这个问题...... – FlyingSheep
是的,可以使用SPENGO进行多次往返旅行,因为这是一次单程旅行:客户可以预先获得服务票据,将其附加到Authenticate标头。我打算用不久的Python演示更新我的答案。 – FlyingSheep
对不起,我的意思是Authorization header,而不是Authenticate。 – FlyingSheep
FYI这是为Hadoop生态系统的一个现实的问题,因为Kerberos是为了再次验证服务1月1主机,在主机5800不是5个SVCS ......他们实现了什么(一)RPC调用,委托令牌_ (种MD5散列的同伴SVC主机之间共享)_和(b)为REST调用和用户界面,一个签名饼干_(除WebHDFS使用了STD令牌)_ –
这是所有开源的,所以你可以检查他们的代码 - 而JIRA则详细解释了“签名cookie”的基本原理,并提出异议/论证等。 (我认为这是有关保护与SPNEGO YARN UI ...) –
或者,你甚至可以安装霍顿或Cloudera的Hadoop的沙箱,启用Kerberos内部SVCS,也为用户界面,并看到卷曲和朋友发生了什么_(除了针对WebHDFS - 请参阅上文)_ –