如何使用Java应用程序服务器中的Kerberos连接到mongodb

时间:2013-09-13 20:42:53

标签: mongodb kerberos mongodb-java

我的mongodb设置为使用Kerberos,当我从shell访问数据库时一切正常。

现在我需要我的Java应用程序也连接到数据库,使用Kerberos进行身份验证。除http://docs.mongodb.org/ecosystem/tutorial/authenticate-with-java-driver/中的几行外,我还没有找到如何使这项工作。

我的主要用例比该页面上描述的更难。我有一个为多个用户提供服务的tomcat服务器 - 所以我需要用户登录应用程序并提供他们的主体名称和密码,我希望Java服务器对KDC进行身份验证,然后使用提供的机票来mongodb - 我可以找不到办法做到这一点。

如果这是不可能的,我必须为每个用户使用一个单独的tomcat服务器,我假设我可以做一个kinit然后启动tomcat?这意味着每个用户都必须运行自己的服务器。不是很好 - 但即使在这里 - 我需要做什么才能使Java进程在会话中使用任何kinit放置。

关于如何做到这一点的任何其他建议也非常感激(例如,我在tomcat中运行的servlet可以从用户的浏览器获取Kerberos票证吗?没有火箭科学和昂贵的许可证......)。我想做的就是允许人们使用Kerberos凭证登录mongodb - 但是通过Java应用程序。

2 个答案:

答案 0 :(得分:0)

10gen / MongoDB提供的Java Driver仅支持通过kinit进行Kerberos身份验证。要让Tomcat实例使用不同的主体进行身份验证,您不仅需要运行不同的实例,而且这些实例必须在不同的系统帐户下运行。这是因为kinit savint系统临时目录中文件中的凭证/票证。这就是为什么你可以在一个终端中进行kinit然后从另一个终端登录到服务器的原因。凭证是帐户的全局凭证,实际上您一次只能为帐户使用1个本金。这是我们发现kinit对运行服务不满意的众多原因之一。

我在Asynchronous Java Driver上工作,它支持3种为Kerberos身份验证提供凭据的机制:

  1. 用户名和密码。
  2. 密钥标签文件。
  3. 的kinit。
  4. 用户名或密钥选项卡文件应该适用于您的用例。有关kerberos支持的详细信息,请here。从该页面开始,身份验证可以如下所示:

    MongoClientConfiguration config = new MongoClientConfiguration("mongodb://locahost:27017/");
    
    char[] password = new char[] { 's', 'u', 'p', 'e', 'r', 
                                   's', 'e', 'c', 'r', 'e', 't' };
    config.addCredential(Credential.builder()
                  .userName("<user>@<REALM>")
                  .password(password)
                  .kerberos());
    Arrays.fill( password, ' ' );
    

    一些注意事项:

    1. 让Java使用kerberos并不难,但它很挑剔。确保您已阅读Java Kerberos Configuration指南,并了解需要在系统和JVM上执行哪些操作才能使其正常工作。有几种方法可以获得有效的设置。您选择哪一个取决于您的需求和系统配置。
    2. 您需要使用驱动程序的扩展jar来使用kerberos身份验证。再次,通过kerberos help底部的链接与我联系,以获取副本。
    3. 我们实际上没有在单个JVM中使用多个凭据测试驱动程序。它应该工作,但没有测试它你永远不知道你可能会遇到什么。如果您遇到任何问题,我们将很乐意与您合作。
    4. HTH, 罗布。

答案 1 :(得分:0)

与MongoDB Java驱动程序一起使用的一个很好的技巧是使用系统的Kerberos票证。 所以,你可以使用类似的东西:

sudo -u tomcat kinit application/username@REALM

现在,根据KDC的配置,您可能需要不时续订凭据,以便进行此项使用:

sudo -u tomcat kinit -R

如上所述,Kerberos支持仅适用于MongoDB Enterprise,可以从MongoDB网站下载。