通过SASL进行的Kerberos:我需要获取票证吗?

时间:2019-03-25 18:39:01

标签: kerberos sasl

我正在为一个软件设计身份验证系统,并且需要一些有关SASL和Kerberos服务如何交互的指导。

这里是情况:

我有一个本身很标准的客户端/服务器应用程序:只有注册用户才能使用执行动作。作为一名MVP,我通常会实施一个非常标准的解决方案:

  • 数据库存储用户名+密码的咸哈希值
  • 客户端通过HTTP进行的身份验证尝试包括通过TLS的用户名/密码
  • 后端检查用户名/密码是否有效,并返回可在会话期间使用的承载令牌

但是,在这种情况下,有一个复杂的因素。我们系统的某些用户在内部使用Kerberos对所有内部服务进行用户身份验证。作为一项功能,我们希望将我们的软件与Kerberos集成在一起,这样他们就不必管理其他用户。

另一位高级工程师建议我研究一下SASL,以便我们可以同时支持多种身份验证协议。例如,标准客户可以使用PLAIN方法(通过TLS)对用户进行身份验证,而其他客户可以将身份验证仅限于GSSAPI方法。

到目前为止,我对如何进行设置以实现期望的目标有一个清晰的认识。但是,还有一个另一个复杂因素。一些希望我们的系统的身份验证支持Kerberos的客户拥有我们系统将依赖的其他资源(例如HDFS),这些资源也需要使用Kerberos进行身份验证。

我对Kerberos的理解是:

  • 客户端通过Kerberos的票证授予服务器进行身份验证
  • 成功通过身份验证后,将返回一个TGT,该TGT可用于将来与系统中的任何Kerberos服务进行任何交互

现在要说的是:我如何使所有这些技术协调工作?我想要的是:  -客户端登录到我的服务器  -我的服务器使用客户的Kerberos系统对客户端进行身份验证  -客户可以  -客户要求我的服务器提供服务  -我的服务器需要访问客户的HDFS,这需要Kerberos身份验证  -服务器进行身份验证而不要求客户端再次进行身份验证

我看到的一个可能的解决方案如下:

  • 让我的服务器本身成为Kerberos用户
  • 当服务器需要对HDFS执行操作时,请使用其自己的凭据进行身份验证

这有一个很大的缺点:假装客户的Kerberos系统有两个领域:一个可以访问HDFS,另一个可以不访问。如果两个领域的用户都被允许使用我的系统,但是只有一组可以使用HDFS,那么我将需要我自己的逻辑(以及数据库中潜在的对象)来确定谁可以执行需要访问HDFS的操作,而谁不能执行

任何指针都将非常有用;以防万一,我对这一切都是陌生的。

谢谢!

1 个答案:

答案 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的授权规则,则它们迟早会失去同步,并会发生不良情况。