KrbException:S4U2self需要一张FORWARDABLE票

时间:2019-07-16 10:15:59

标签: java kerberos kerberos-delegation keytab

我正在尝试通过我的Java代码执行kerberos约束的委派。 我有一个密钥表文件,已将SPN附加到用户,并已为该用户启用了SPN的委派。 当我尝试使用Keytab登录时,我得到了SPN的TGT。但是,此票证上的“ forwardable”标志设置为false。

为了模拟其他用户,我需要将此标志设置为true。

注意:在SPN用户上设置了ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION标志。

我们非常感谢您的帮助。

private void tryKrb5Module() throws LoginException {
        System.setProperty("sun.security.krb5.debug", "true");
        System.setProperty("javax.security.auth.useSubjectCredsOnly","true");//has no impact

        final Subject subject = new Subject();
        final Krb5LoginModule krb5LoginModule = new Krb5LoginModule();
        final Map<String,String> optionMap = new HashMap<String,String>();

        optionMap.put("keyTab", "c:\\ticket\\delegationUser.keytab");
        optionMap.put("principal", "TEST/TEST"); // default realm
        optionMap.put("doNotPrompt", "true");
        optionMap.put("refreshKrb5Config", "true");
        optionMap.put("useTicketCache", "true");
        optionMap.put("renewTGT", "true");
        optionMap.put("useKeyTab", "true");
        optionMap.put("storeKey", "true");
        optionMap.put("isInitiator", "true");


        krb5LoginModule.initialize(subject, null, new HashMap<String,String>(), optionMap);

        boolean loginOk = krb5LoginModule.login();
        System.out.println("======= login:  " + loginOk);

        boolean commitOk = krb5LoginModule.commit();
        System.out.println("======= commit: " + commitOk);

        System.out.println("======= Principal from subject: " + subject.getPrincipals());

    }

2 个答案:

答案 0 :(得分:0)

我想出了解决方案。您需要在系统路径中设置krb配置文件。这样,只有从密钥表获得的票证才是“可转发的”。 令人惊讶的是,这在任何地方都没有明确提及。

System.setProperty(“ java.security.krb5.conf”,“ path_to_krb_config”);

还要确保在krb配置文件中提到了“ forwardable = true”。 在下面粘贴示例krb配置文件:

[libdefaults]
default_realm = DOMAIN.COM
default_tkt_enctypes = aes128-cts aes128-cts-hmac-sha1-96 aes256-cts aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tgs_enctypes = aes128-cts aes128-cts-hmac-sha1-96 aes256-cts aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes128-cts aes128-cts-hmac-sha1-96 aes256-cts aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
dns_lookup_kdc = true
dns_lookup_realm = false
forwardable = true

[realms]
    DOMAIN.COM = {
        kdc = KDC_HOST.DOMAIN.COM
        admin_server = KDC_HOST.DOMAIN.COM
        default_domain = DOMAIN.COM
    }

[domain_realms]
    domain.com = DOMAIN.COM
    .domain.com = DOMAIN.COM

答案 1 :(得分:0)

服务帐户“ TEST”及其键表仅用于与KDC建立“信任”并授予服务代码以调用方法S4U2Self和S4U2Proxy。因此,预计服务帐户TGT不可转发。

除了您为krb5.conf创建为Map的JAAS登录配置之外,不需要Krb5LoginModule文件。另一种选择是只需添加optionMap.put("forwardable", "true");,您的服务帐户“ TEST” TGT将可以转发。

通过kerberos约束委派的方式,仅要求使用S4U2Self生成的模拟用户票证TGT是可转发的,它仅取决于“ TEST”服务帐户上的ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION标志。用于S4U2Self生成的代码是:https://github.com/ymartin59/java-kerberos-sfudemo/blob/master/src/main/java/sfudemo/KerberosDemo.java#L120

参考文献: