2

Kerberos 認証用のキータブがあるサービス間モデルがあります。

このモデルでは、ログイン構成を次のように定義しました:-

import java.util.HashMap;
import java.util.Map;

import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;

public class GSSIbmLoginConfiguration extends Configuration {

private AppConfigurationEntry configEntry;

public GSSIbmLoginConfiguration(String principal, 
                                String credentialCache, 
                                String keytab, 
                                KerberosCredentialUsage usage) {
    Map<String, String> params = new HashMap<String, String>();

    params.put("credsType", "both");
    params.put("renewable", Boolean.TRUE.toString());
    params.put("principal", principal);

    if (credentialCache != null) {
        params.put("useCcache", credentialCache);
    }

    if (keytab != null) {
        params.put("useKeytab", keytab);
    }

    configEntry = new AppConfigurationEntry(
            "com.ibm.security.auth.module.Krb5LoginModule",
            AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, params);
}

public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
    return new AppConfigurationEntry[] {
            configEntry
    };
}

このログイン構成は、jaas.conf の代わりとして機能します。

今、機能している LoginContext のログイン メソッドを試しています。それから私はそれから主題を取得しています。

この件名を使用して、私は特権的な行動をとります。

private static final class SubjectAction implements PrivilegedExceptionAction<GSSCredential> {

    private final int credentialType;

    private final int credentialLifetime;

    private SubjectAction(int credType, int lifetime) {
        credentialType = credType;
        credentialLifetime = lifetime;
    }

    public GSSCredential run() throws GSSException {
                    GSSManager gssManager = GSSManager.getInstance()
        return gssManager.createCredential(null, credentialLifetime, KRB5_MECH_ID, GSSCredential.INITIATE_AND_ACCEPT);      
    }
}

これは失敗します。関連するログ(ログシステムのプロパティを設定した後に掘り出しました):-

[JGSS_DBG_CRED]  localhost-startStop-1 Creating mech cred for null, mech 1.2.840.113554.1.2.2, usage initiate and accept
[JGSS_DBG_PROV]  localhost-startStop-1 Provider Entry: provider: IBMJGSSProvider, mechanism: 1.3.6.1.5.5.2 get Factory for mech: 1.2.840.113554.1.2.2 GSSCaller:
[JGSS_DBG_PROV]  localhost-startStop-1 Provider Entry: provider: IBMJGSSProvider, mechanism: 1.2.840.113554.1.2.2 get Factory for mech: 1.2.840.113554.1.2.2 GSSCaller:
[JGSS_DBG_PROV]  localhost-startStop-1 Created new (empty) factory list (size=1) for provider IBMJGSSProvider version 7.0
[JGSS_DBG_PROV]  localhost-startStop-1 Loading factory
[JGSS_DBG_PROV]  localhost-startStop-1 Factory class name for provider IBMJGSSProvider version 7.0 is com.ibm.security.jgss.mech.krb5.Krb5MechFactory
[JGSS_DBG_PROV]  localhost-startStop-1 Prior to load
[JGSS_DBG_PROV]  localhost-startStop-1 Done to load
[JGSS_DBG_PROV]  localhost-startStop-1 Loaded factory for provider IBMJGSSProvider version 7.0
[JGSS_DBG_PROV]  localhost-startStop-1 Loaded factory ok
[JGSS_DBG_PROV]  localhost-startStop-1 getFactory: index = 1 found factory caller = com.ibm.security.jgss.GSSCaller@e7d4b6d7
[JGSS_DBG_CRED]  localhost-startStop-1  usage: initiate and subject
[JGSS_DBG_CRED]  localhost-startStop-1 Obtaining creds from Krb5Util.ServiceCreds for default service
[JGSS_DBG_CRED]  localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(1)
[JGSS_DBG_CRED]  localhost-startStop-1 Found key for    isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(23)
[JGSS_DBG_CRED]  localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(3)
[JGSS_DBG_CRED]  localhost-startStop-1 Found key for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM(17)
[JGSS_DBG_CRED]  localhost-startStop-1 acquiring creds for isp/ISPNode1/ISPDomain@INFAKRB.INFADEV.COM

今、本当に困惑しているのはこれです:-

[JGSS_DBG_CRED]  localhost-startStop-1 Creating mech cred for null, mech 1.2.840.113554.1.2.2, usage initiate and accept
and then:
[JGSS_DBG_PROV]  localhost-startStop-1 getFactory: index = 1 found factory caller = com.ibm.security.jgss.GSSCaller@e7d4b6d7
[JGSS_DBG_CRED]  localhost-startStop-1  usage: initiate and subject

最初の部分は createCredential 自体のためのものです。ただし、2 つ目はメカニズム ファクトリ関連の呼び出し (この場合は kerberos) のようです。この後、ファイルベースの資格情報キャッシュ認証が開始されます。

[KRB_DBG_CCHE] FileCredentialsCache:localhost-startStop-1:   >>>KinitOptions cache name is /export/home/ispqa95/krb5cc_ispqa95
[KRB_DBG_CCHE] FileCredentialsCache:localhost-startStop-1:   >>> FileCredentialsCache default name is: /export/home/ispqa95/krb5cc_ispqa95
[KRB_DBG_CCHE] FileCredentialsCache:localhost-startStop-1:   >>>FileCredentialsCache: read ccache version 0x503
[KRB_DBG_KDC] KrbDataInputStream:localhost-startStop-1:   >>>KrbDataInputStream: Bytes read: 0000: 49 4e 46 41 4b 52 42 2e  49 4e 46 41 44 45 56 2e  INFAKRB.INFADEV.

0010: 43 4f 4d COM

[KRB_DBG_KDC] KrbDataInputStream:localhost-startStop-1:   >>> CCacheInputStream: equiv string: INFAKRB.INFADEV.COM
[KRB_DBG_CCHE] CCacheInputStream:localhost-startStop-1:   >>> readPrincipal: read realm INFAKRB.INFADEV.COM
[KRB_DBG_KDC] KrbDataInputStream:localhost-startStop-1:   >>>KrbDataInputStream: Bytes read: 0000: 6e 61 67 61 72 6c 61                               nagarla

これはどういうわけかメカニズム ファクトリが間違った値を取得していることを意味します。

IBM jar (ibmjgssprovider.jar) を逆コンパイルしてみましたが、内部のクラス名が文字化けしているようです (a、b、xy などに置き換えられています)。

これは最終的に次のようになります:- java.io.IOException: プライマリ プリンシパルが一致しません

私はプロプライエタリなので、IBM の振る舞いを理解するのに苦労しています。OpenJdk はあまり役に立ちません。

誰か助けてくれませんか。このような動作を引き起こす可能性があるのは、製品が設定しているシステム プロパティですか?

実行時に考えられるすべてのシステム プロパティを確認しようとしています。他に何か必要な場合はお知らせください。

また、誰かがIBM JDK Securityフォーラムも指摘できますか? この問題もそこに投稿したいと思います。

4

1 に答える 1

2

わかりました、この問題を解決する方法を見つけました:-

システム プロパティ:

-Djavax.security.auth.useSubjectCredsOnly=true 

起動時に設定する必要があります。それ以外の場合、IBM が使用する資格情報はデフォルトのものです (AIX の場合、ファイル ベースの資格情報キャッシュから取得しようとします)。

于 2013-11-07T12:43:26.563 に答える