6

出于某种原因,我的客户需要登录到两个 kerberos 领域……比如说 REALM1 和 REALM2。我的委托人已在两个领域中签名,并创建了两个不同的密钥表(principal/host@REALM1 和 keytab1 和 principal/host@REALM2 和 keytab2)。换句话说,我可以针对两个不同的领域 kinit 和 klist 我的委托人。

现在我需要运行一个应用程序,其中首先需要在领域1中完成一些任务,然后需要在领域2中完成其他任务,所以我必须先登录领域1,完成一些工作然后再登录领域2。我试图通过在我的程序中间重置系统属性“java.security.krb5.conf”来做到这一点,但未能从领域1切换到领域2(登录失败,似乎默认领域保持不变。)

我搜索并看到了相关帖子的答案(Kerberos Auth with JAAS and multiple realms),我知道一个 keytab 绑定到一个领域——我不明白的是——我已经为两个领域生成了两个 keytab——为什么可以因此不登录两个领域?是通过跨领域身份验证的唯一方法..?

4

5 回答 5

3

不要那样做。建立跨域信任,您可以使用客户端的原始密钥表来执行外部域中的所有任务。我们这里至少有 30 个领域,我的 Unix 机器当然也加入了一个领域。这很整洁。

于 2013-02-28T11:56:34.920 回答
2

在您的情况下,您可以在每次使用之前使用 JAAS login.conf 中的 KRB5LoginModule 中的 refreshKrb5Config=true 选项简单地强制重新加载配置(请参阅Reload Kerberos config in JAVA without restarting JVM)。

这在多线程应用程序中效果不佳,因为您必须序列化对此共享资源的访问。Java Kerberos 实现使用系统属性(和单个配置文件)这一事实是不必要的限制,甚至可能是一个错误。

使用跨域信任的公认答案有时可能很好,但并非总是如此。例如,如果您的网络管理员不希望所有服务都信任另一个域,而只是这个特定的服务,那么您就不走运了。假设您有一个用 Java 编写的多线程应用程序,并提供了一项服务,该服务希望接受来自多个领域的票证,您必须在每个领域运行该应用程序的一个实例(krb5.conf 主机名是静态的,只是 keytab 和 kdc 更改)。如果这个特定的应用程序是使用 SPNEGO 在端口 443 上运行的 Web 服务,这将成为一个大难题。现在您需要不同端口上的两个应用程序服务器实例吗?哎哟。

于 2015-06-17T18:25:07.673 回答
0

I would recommend you look at the oVirt open source project.

Look at the java code of oVirt engine, and look at the bll module (ovirt-engine/backend/modules/bll) for the authentication code (look at DirectorySearcher.java) - we do support login in to several kerberos realms.

We have a tool called engine-manage-domains that let you add a "domain user" (which we use mainly for searching users and groups in the added realm) for a domain - for example:

You can add user "aaa" from domain "example.com" which is ActiveDirectory. This modifies the krb5.conf defined which is held at /etc/ovirt-engine/krb5.conf, and which the ovirt-engine uses.

Look at the place in the code where we create a JAAS login object and perform login (we perform explicit login if we don't a valid ticket to the realm).

I think too that cross realm authentication is better solution, but you might face scenarios in which you will not be able to create such trust. For example, at the case of oVirt - it's an open source virtualization management system, and it should not "interfere" or force changing of setups of other systems installed at user's organization.

于 2013-05-15T17:52:26.887 回答
0

如果它帮助别人:

您可以在 krb5.conf 中指定哪些域应该用于哪些域。例子:

[libdefaults]
  default_realm = A.COM

[realms]
  A.COM = {
    kdc = ...
  }
  B.COM = {
    kdc = ...
  }

[domain_realm]
  .b.com = B.COM

然后当您连接到 *.b.com 时,它将使用 B.COM 领域而不是 A.COM,否则默认为 A.COM。

更多信息:https ://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html#domain-realm

于 2021-04-22T18:24:41.797 回答
0

我迟到了,但这可能会帮助其他在搜索中找到这个问题的人。

使用跨领域身份验证是最好的,但并不总是可行的。例如,您可能作为受信任的第三方将数据从一个组织复制到另一个组织,而这两个组织都可能不会对其开放。

javax.security.auth.login.LoginContext 类通常使用能够支持多个条目的外部配置文件。如果您的 devops 支持它,这是一个很好的方法,但是在许多环境中这是不可能的,例如,如果您在应用服务器上部署为 .war 文件。(经典示例:您的应用程序在 AWS 弹性 beantalk 上自动缩放。)

在我们的例子中,我们使用了带有 Configuration 对象的 LoginContext 构造函数。我们必须自己维护必要的信息,但我们可以自己处理几乎所有事情。(我们可以下载我们的 keytab 文件并将其写入一个临时目录,并在配置对象中指向它。记住在应用程序退出时对该文件进行核对!)

在这种情况下,有助于记住配置对象是一个包,而 AppConfigurationEntry 是单个服务的信息。

编辑添加:您可能希望在选项中指定不同的凭据缓存文件 (ccache) 位置。我不记得 ccache 文件是否支持多个条目,但指定不同的文件不会有什么坏处。

于 2017-03-13T20:55:55.010 回答