0

我的 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 应用程序。

4

3 回答 3

0

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

我使用异步 Java 驱动程序,它支持 3 种机制来为 Kerberos 身份验证提供凭据:

  1. 用户名和密码。
  2. 键选项卡文件。
  3. 基尼特。

用户名或密钥选项卡文件应该适用于您的用例。此处提供了 kerberos 支持的详细信息。在该页面上,身份验证可以很简单:

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 配置指南并了解需要在系统和 JVM 上执行哪些操作才能使其正常工作。有几种方法可以获得工作设置。您选择哪一种取决于您的需求和系统配置。
  2. 您将需要驱动程序的扩展 jar 才能使用 kerberos 身份验证。再次,通过kerberos 帮助底部的链接与我联系以获取副本。
  3. 我们还没有在单个 JVM 中使用多个凭据实际测试过驱动程序。它应该可以工作,但如果不对其进行测试,您永远不知道您可能会遇到什么。如果您遇到任何问题,我们将很乐意与您合作以使其正常工作。

HTH,罗布。

于 2013-09-14T00:12:20.977 回答
0

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

sudo -u tomcat kinit application/username@REALM

现在,根据 KDC 的配置,您可能需要不时更新凭据以用于该用途:

sudo -u tomcat kinit -R

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

于 2014-08-06T06:22:37.140 回答
0

如果要使用 GSSAPI auth 配置具有不同 kt 文件的多个 kerberos。

我们可以做以下,

com.sun.security.jgss.initiate {
  // first connection details
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy.keytab"
  principal="dummy@SOME.REALM"
  debug=false;

  // second connection details
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy2.keytab"
  principal="dummy2@SOME.REALM"
  debug=false;
};

如果您想混合多种不同的服务,

// First component details HBASE / IMPALA / MongoDb with two diff kerberos connection details
com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy.keytab"
  principal="dummy@SOME.REALM"
  debug=false;

  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy2.keytab"
  principal="dummy2@SOME.REALM"
  debug=false;
};

// Kafka with two diff kerberos connection details
SimpleClient {
  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy.keytab"
  principal="dummy@SOME.REALM"
  debug=false;

  com.sun.security.auth.module.Krb5LoginModule required
  useTicketCache=false
  doNotPrompt=true
  useKeyTab=true
  keyTab="file:C:/blah/blah/dummy2.keytab"
  principal="dummy2@SOME.REALM"
  debug=false;
};
于 2021-09-07T16:31:30.290 回答