我正在为一个软件设计身份验证系统,并且需要一些有关SASL和Kerberos服务如何交互的指导。
这里是情况:
我有一个本身很标准的客户端/服务器应用程序:只有注册用户才能使用执行动作。作为一名MVP,我通常会实施一个非常标准的解决方案:
但是,在这种情况下,有一个复杂的因素。我们系统的某些用户在内部使用Kerberos对所有内部服务进行用户身份验证。作为一项功能,我们希望将我们的软件与Kerberos集成在一起,这样他们就不必管理其他用户。
另一位高级工程师建议我研究一下SASL,以便我们可以同时支持多种身份验证协议。例如,标准客户可以使用PLAIN方法(通过TLS)对用户进行身份验证,而其他客户可以将身份验证仅限于GSSAPI方法。
到目前为止,我对如何进行设置以实现期望的目标有一个清晰的认识。但是,还有一个另一个复杂因素。一些希望我们的系统的身份验证支持Kerberos的客户拥有我们系统将依赖的其他资源(例如HDFS),这些资源也需要使用Kerberos进行身份验证。
我对Kerberos的理解是:
现在要说的是:我如何使所有这些技术协调工作?我想要的是: -客户端登录到我的服务器 -我的服务器使用客户的Kerberos系统对客户端进行身份验证 -客户可以 -客户要求我的服务器提供服务 -我的服务器需要访问客户的HDFS,这需要Kerberos身份验证 -服务器进行身份验证而不要求客户端再次进行身份验证
我看到的一个可能的解决方案如下:
这有一个很大的缺点:假装客户的Kerberos系统有两个领域:一个可以访问HDFS,另一个可以不访问。如果两个领域的用户都被允许使用我的系统,但是只有一组可以使用HDFS,那么我将需要我自己的逻辑(以及数据库中潜在的对象)来确定谁可以执行需要访问HDFS的操作,而谁不能执行
任何指针都将非常有用;以防万一,我对这一切都是陌生的。
谢谢!
答案 0 :(得分:1)
不清楚您的问题是什么,但是我会尽力解决我认为您要问的所有问题。
首先,我只想清除一下:
身份验证成功后,将返回一个TGT,可用于 将来与系统中任何Kerberos服务的任何交互
那不是很正确。 TGT使用户可以请求服务 KDC提供的特定服务的票证。服务票是什么 授予用户访问特定服务的权限。 TGT用于证明 请求服务票证时用户对KDC的身份。
客户要求我的服务器提供某些东西-我的服务器需要访问 客户的HDFS,需要Kerberos身份验证-服务器进行身份验证 无需要求客户端再次进行身份验证
这是一个足够普遍的问题,Kerberos解决方案称为 delegation 。您应该优先使用Kerberos委派,而不要提出自己的解决方案。也就是说,其支持程度取决于您所使用的技术堆栈。
Kerberos支持两种授权。第一种称为“代理”,它通过将用户的TGT与服务票证一起发送到服务来工作。然后,服务可以使用TGT代表用户从KDC获取新的服务票证。这种方法的缺点是,一旦服务获得用户的TGT,它就可以有效地将该用户模拟为该用户可以访问的任何服务。您可能不希望服务具有那种自由度。
第二种委托称为约束委托(也称为services4user或S4U)。使用这种方法,客户端不会将它的TGT发送给服务,但是允许服务向KDC索取服务票证以模仿用户。可以执行此操作的服务必须在KDC上列入白名单,以及它们可以请求其票证的服务。最终,这将使方法更加安全,因为该服务无法模拟该用户使用任何服务。
另一位高级工程师建议我调查SASL,以便我们 同时支持多种身份验证协议;标准客户可以 使用PLAIN方法(通过TLS)对用户进行身份验证,以便 例如,其他客户可以将身份验证限制为仅 GSSAPI方法
是的,这是一个好主意。具体来说,我建议您对所有用户使用完全相同的会话身份验证机制。对于Kerberos用户,唯一的区别应该是他们获得会话的方式。您可以设置一个受Kerberos保护的登录URL,该URL使他们获得会话,而无需挑战其凭据。任何点击此URL且没有Kerberos凭据的用户都可以重定向到登录页面,登录页面最终将为他们提供相同的会话对象(一旦他们登录)。
在后端,凭据检查逻辑可以使用SASL将Kerberos用户传递到KDC,将其他用户传递到本地身份验证机制。这为您提供了一种无缝的回退机制,以应对Kerberos对Kerberos用户不起作用的情况(由于时钟偏斜等原因,这种情况很容易发生)
这有一个很大的缺点:假装客户的 Kerberos系统有两个领域:一个可以访问HDFS,另一个可以访问 没有。如果两个领域的用户都被允许使用我的系统,但仅限 一组可以使用HDFS,那么我将需要自己的逻辑(并且可能 数据库中的对象)来确定谁可以执行将要执行的操作 需要访问HDFS,谁不能访问。
这正是您应使用Kerberos委派而不是提出自己的自定义解决方案的原因。使用Kerberos委派,KDC管理员可以控制谁可以访问什么。如果您的服务试图向HDFS模仿用户,并且不允许他们访问HDFS,则该身份验证步骤将失败并且一切正常。
如果您尝试在自己的应用程序中隐藏KDC的授权规则,则它们迟早会失去同步,并会发生不良情况。