【问题标题】:Multiple realms多个领域
【发布时间】:2014-10-15 12:42:35
【问题描述】:

我正在设置一个客户端并使用 java 客户端连接到多个启用 Kerberos 的系统。

使用UserGroupInformation。 Java 客户端总是选择default_realm 并在使用其他领域时抛出错误。

是否可以使用不同的密钥表和不同的主体进行连接,但使用相同的krb5.conf

/etc/krb5.conf:

[libdefaults]
default_realm = NEW.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 1d
renew_lifetime = 7d
forwardable = true

[realms]
NEW.COM = {
  kdc = bharath.kdc
  admin_server = bharath.kdc
}

EXAMPLE.COM = {
  kdc = wckdserver.krbnet
  admin_server = wckdserver.krbnet
}

【问题讨论】:

    标签: java hadoop kerberos


    【解决方案1】:

    您可以通过以下形式的 jaas 配置文件控制使用哪个 keytab:

    client {
      com.sun.security.auth.module.Krb5LoginModule required
      refreshKrb5Config=true
      useKeyTab=true
      keyTab="<path to keytab>"
      principal="<user>@<realm>";
    };
    

    这个配置文件是用系统属性设置的:

    -Djava.security.auth.login.config=<path to jaas config>
    

    如果您想在 VM 的单次运行期间更改设置,您需要清除 VM 中缓存的用户配置:

    Configuration.setConfiguration(null);
    

    要使用不同的领域,您需要指定两个以下属性:

    -Djava.security.krb5.realm=<realm>
    -Djava.security.krb5.kdc=<kdc>
    

    【讨论】:

    • 我正在使用以下 API 登录。 UserGroupInformation.setConfiguration(配置); UserGroupInformation.loginUserFromKeytab("principal","/root/new.keytab");如果在 setProperty 之后设置,那么我不能使用同一个客户端来使用不同的领域。 -Djava.security.krb5.realm= -Djava.security.krb5.kdc=
    • 首先,这是与hadoop相关的,不在标签中。其次,你是在什么情况下这样做的?在和 MR 工作?您是否为 kerberos 配置了 hadoop?
    • 这个启用了 webhdfs 和 kerberos 的 hadoop。我可以使用不同的 keytabs 和不同的领域 Knint。但是上面提到的 java 代码不起作用。Java apis 总是将 krb5.conf 中提到的 default_realms 作为默认值,并且不识别其他领域....
    【解决方案2】:

    对于不同的 keytab 文件,您可以在 JAAS 配置文件中包含两个(或更多)部分,如下所示:

    com.sun.security.jgss.krb5.accept {
    
     com.sun.security.auth.module.Krb5LoginModule required
     principal="user1@DOMAIN1.COM" useKeyTab=true
     keyTab="C:\\Oracle\\Middleware12.1.1\\MyDomain\\domain1_keytab" storeKey=true;
    
     com.sun.security.auth.module.Krb5LoginModule required
     principal="user2@DOMAIN2.COM" useKeyTab=true
     keyTab="C:\\Oracle\\Middleware12.1.1\\MyDomain\\domain2_keytab" storeKey=true;
    
    };
    

    您可能需要从配置文件中删除所有领域信息。那么当你改变这个系统设置时:

    System.setProperty("sun.security.krb5.principal", "userX@DOMAINX.COM");
    

    其中“X”应替换为 1 或 2,您可以让 Kerberos 选择不同的密钥表文件。

    系统将根据“sun.security.krb5.principal”设置在 JAAS 配置中搜索相关部分,并将使用此主体及其对应的 keytab 进行 Kerberos 身份验证。

    【讨论】:

      【解决方案3】:

      要配置多个领域,请像这样设置您的krb5.conf

      [libdefaults]
      default_realm = XYZ.LOCAL
      
      [realms]
      XYZ.LOCAL = {
        kdc = abc.xyz.local
        default_domain = XYZ.LOCAL
      }
      
      SECOND.NET = {
        kdc = abc.second.net
      }
      
      [domain_realm]
      .xyz.local = .XYZ.LOCAL
      xyz.local = XYZ.LOCAL
      .second.net = .SECOND.NET
      second.net = SECOND.NET
      

      【讨论】:

        【解决方案4】:

        我的用例略有不同,但分享是因为听起来非常相似,所以这可能对你有用。

        添加到 krb5.conf:

        [domain_realm]
          .example.com = EXAMPLE.COM
        

        然后当您连接到 *.example.com 时,它将使用EXAMPLE.COM 域而不是默认域。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-21
          相关资源
          最近更新 更多