2009-06-11 29 views
5

Chúng tôi có một miền kerberos tại công ty của tôi và tôi đang chạy một vài trong số các Java/Kerberos examples. Câu hỏi tôi có là xung quanh cơ chế đăng nhập từ quan điểm của máy chủ. Khi chạy ví dụ máy chủ GssServer.java, tôi cần có một số javax.security.auth.Subject; trong các mã được cung cấp này là thông qua một LoginContext như sau:kerberos từ Java - nhận Chủ đề cho người dùng hiện đã được xác thực

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

Subject subject = context.getSubject(); 

Đây là tất cả OK và khi tôi chạy ví dụ tôi thấy một dấu nhắc đăng nhập đáng yêu. Tuy nhiên vấn đề của tôi là đây là không phải thực sự máy chủ của tôi sẽ hoạt động như thế nào và cũng như cách tôi được dẫn dắt để hiểu cách tôi nên trình bày dịch vụ từ bên trong miền Kerberos. Trong ví dụ GssServer, vấn đề là máy chủ của tôi (đọc: dịch vụ) nên không cần phải xác thực chính nó đến KDC để trình bày dịch vụ của mình cho khách hàng. Truy cập vào tệp keytab phía máy chủ phải đủ để thực hiện việc này. Vì vậy, cho ví dụ cấu hình:

//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"; 
}; 

Và trong mã Java:

GSSManager manager = GSSManager.getInstance(); 
Oid krb5Mechanism = new Oid("1.2.840.113554.1.2.2"); 
GSSName gssName = manager.createName("myserv/[email protected]", 
            GSSName.NT_HOSTBASED_SERVICE); 
GSSCredential serverCreds = manager.createCredential(gssName, 
            GSSCredential.DEFAULT_LIFETIME, 
            krb5Mechanism, 
            GSSCredential.ACCEPT_ONLY); 

Vấn đề với điều này là những thông tin server trong file jaas-krb5.conf không có sẵn trừ tôi xác nhận bản thân mình thông qua line:

Jaas.loginAndAction("server", action);  

Tôi không cần phải đi qua xác thực này! Nhưng nếu tôi không xác thực bản thân mình, tôi kết thúc bằng:

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 

Không có gì đáng ngạc nhiên khi có sự cố. Sau khi tất cả, trừ khi tôi có một xử lý trên các chủ đề server, làm thế nào tôi có thể biết nơi của tôi keytab là, hoặc những gì dịch vụ tôi đang cung cấp?

Vì vậy, câu hỏi của tôi là: làm thế nào tôi có thể nói cho về keytab/dịch vụ mà không cần tự xác thực mã?

Trả lời

5

OK. Vì vậy, điều này hóa ra là cực kỳ dễ dàng giả sử bạn biết rằng tệp keytab có thể được sử dụng thay vì xác thực. Đây được phác thảo một chút trong JavaDoc for Krb5LoginModule

Về cơ bản, nếu tôi

loginAndAction("anything", action) 

Sau đó, cấu hình của tôi sẽ giống như thế:

//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"; 
}; 

Các bit quan trọng là sự bổ sung của doNotPrompt=true. Khi thuộc tính này được đặt, mã máy chủ sử dụng thông tin trong keytab

Các vấn đề liên quan