6

私の会社には kerberos ドメインがあり、Java/Kerberos のをいくつか実行しています。私が持っている質問は、サーバーの観点からのログインメカニズムに関するものです。サーバーの例を実行するときは、 ;GssServer.javaを取得する必要があります。javax.security.auth.Subject提供されたコードでは、これは次のようにLoginContextなります。

// Create a LoginContext with a callback handler and login
LoginContext context = new LoginContext(name, new TextCallbackHandler());
context.login();

Subject subject = context.getSubject();

これで問題ありません。サンプルを実行すると、素敵なログイン プロンプトが表示されます。ただし、私の問題は、これが実際にはサーバーの実行方法ではなく、kerberos ドメイン内からサービスを提供する方法を理解するように導かれた方法でもないことです。このGssServer例では、問題は、私のサーバー (読み取り: サービス) が、そのサービスをクライアントに提供するために自身を認証する必要がないことです。KDCこれを行うには、サーバー側keytabファイルへのアクセスで十分です。したがって、構成例の場合:

//jaas-krb5.conf
server {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="/home/myusr/my-server.keytab"
    principal="myserv/mymachine.some.domain";
};

Java コードでは次のようになります。

GSSManager manager = GSSManager.getInstance();
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2");
GSSName gssName = manager.createName("myserv/mymachine.some.domain@THE.REALM.COM", 
                                     GSSName.NT_HOSTBASED_SERVICE);
GSSCredential serverCreds = manager.createCredential(gssName,
                                     GSSCredential.DEFAULT_LIFETIME,
                                     krb5Mechanism,
                                     GSSCredential.ACCEPT_ONLY);

これに関する問題は、次の行で自分自身を認証しない限り、ファイルserver内の情報を利用できないことです。jaas-krb5.conf

Jaas.loginAndAction("server", action);     

この認証を通過する必要はありません。しかし、自分自身を認証しないと、次のようになります。

Exception in thread "main" GSSException: No valid credentials provided (Mechanism level: Attempt to obtain new ACCEPT credentials failed!)
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:188)
    at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:73)
    at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:77)
    at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:149)
    at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:389)
    at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:45)
    at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:102)
    at gsa.hk.GssServer$GssServerAction.run(GssServer.java:79)
    at gsa.hk.GssServer.main(GssServer.java:57)
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for com.sun.security.jgss.accept
    at javax.security.auth.login.LoginContext.init(LoginContext.java:256)
    at javax.security.auth.login.LoginContext.<init>(LoginContext.java:403)
    at sun.security.jgss.LoginUtility.login(LoginUtility.java:72)
    at sun.security.jgss.krb5.Krb5Util.getKeysFromSubject(Krb5Util.java:205)
    at sun.security.jgss.krb5.Krb5AcceptCredential$1.run(Krb5AcceptCredential.java:184)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.security.jgss.krb5.Krb5AcceptCredential.getKeysFromSubject(Krb5AcceptCredential.java:181)
    ... 8 more

問題があっても不思議ではありません。結局のところ、私がこの件について理解していない限り、自分がどこにいるのか、どのようなサービスを提供しているserverのかをどうやって知ることができるでしょうか?keytab

私の質問は、コードで自分自身を認証せずにキータブ/サービスについてどのように伝えることができますか?GSS API

4

1 に答える 1

7

わかった。したがって、認証の代わりにファイルを使用できることがわかっているとすれば、これは非常に簡単であることがわかります。keytabこれは、Krb5LoginModule の JavaDoc で少し概説されています。

基本的に、私なら

loginAndAction("anything", action)

次に、私の設定は次のようになります。

//jaas-krb5.conf
anything {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    doNotPrompt=true
    keyTab="/home/myusr/my-server.keytab"
    principal="myserv/mymachine.some.domain";
};

重要なビットは、の追加ですdoNotPrompt=true。このプロパティが設定されている場合、サーバー コードはキータブの情報を使用します。

于 2009-06-15T11:58:05.080 に答える