2011-12-14 30 views
8

Kerberos/AD kimlik doğrulamasının bir Spring webapp ile çalışması için sorun yaşıyoruz ve sorunun Kerberos biletleri ve Active Directory için şifreleme türleriyle ilgili olması gerektiğine inanıyorum etki alanı işlev düzeyi.sağlama toplamı başarısız oldu: Kerberos/Spring/Active Directory (2008)

basit bir kurumdur:

Benim var tr Active Directory etki alanı işlev düzeyinin Windows Server 2003 olduğu ve her şeyin iyi çalıştığı vironment, istemciler etki alanında oturum açtığında beklendiği gibi doğrulanır. Bu ortamdaki biletleri incelemek için kerbtray kullanarak, hepsinin hem bilet şifreleme türü hem de "RSADSI RC4-HMAC" anahtar şifreleme türü olduğunu görebiliyorum.

İşlev düzeyi Windows Server 2008 ile yeni bir etki alanım var ve kimlik doğrulamanın çalışmadığı yer burası.

Kerberos validation not successful... 

Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed) 
    at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Unknown Source) 
    at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) 
    at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) 
    at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(Unknown Source) 
    at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(Unknown Source) 
    at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) 
    at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) 
    at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:146) 
    at org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator$KerberosValidateAction.run(SunJaasKerberosTicketValidator.java:136) 
    ... 34 more 
Caused by: KrbException: Checksum failed 
    at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source) 
    at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(Unknown Source) 
    at sun.security.krb5.EncryptedData.decrypt(Unknown Source) 
    at sun.security.krb5.KrbApReq.authenticate(Unknown Source) 
    at sun.security.krb5.KrbApReq.<init>(Unknown Source) 
    at sun.security.jgss.krb5.InitSecContextToken.<init>(Unknown Source) 
    ... 43 more 
Caused by: java.security.GeneralSecurityException: Checksum failed 
    at sun.security.krb5.internal.crypto.dk.ArcFourCrypto.decrypt(Unknown Source) 
    at sun.security.krb5.internal.crypto.ArcFourHmac.decrypt(Unknown Source) 

yığın izleme "ArcfourCrypto.decrypt", yani muhtemelen RC4 HMAC olarak Kerberos tedavi eden gösterilmektedir: uygulama hata bilet doğrulamak için çalışırken döndürülen. Bu sefer biletleri incelemek için kerbtray'ı tekrar kullanmak, şu anda alan adına ilişkin 2 bilet var: krbtgt/.COM. Her iki bilet de RSADS1 RC4-HMAC anahtar şifreleme tipine sahiptir, bunlardan biri de bilet şifreleme tipine sahiptir, ancak diğerinde "Kerberos AES256-CTS-HMAC-SHA1-96" bulunmaktadır.

Sorunun nedeninin bu olduğundan emin değilim, ancak kimlik doğrulama kuralını açıklayabilen iki ortamda bulabildiğim tek fark bu. AD şifreleme politikasını değiştirmeyi denedim, IE ve Firefox'u denedim, ve aklıma gelebilecek başka her şey, ama hiçbir şey işe yaramadı.

Bu konuyla ilgili herhangi bir yardım çok takdir edilecektir. Üretimin AD kurulumu hakkında çok fazla dikte edemediğimden java ucunda düzeltmeyi tercih ederim.

+0

Wireshark'taki iletişimi kontrol ettiniz mi ve biletlerinizi incelediniz mi? –

+0

Teşekkürler Michael-O - Daha önce bunun üzerinde çalışırken Wireshark'ı kullandım, ancak çıktıyı daha fazla kullanamıyorum. Bunu hiç işe yaramadı - Test etki alanını Windows Server 2003 işlevsel seviyesine geri döndürdüm ve sonra normal çalıştı. Şimdi canlı bir çözüm bulmak için yeni bir 2008 test alanı kurmaya ihtiyacım var .... – slt

cevap

0

Sorun, jetonun nasıl oluşturulduğu ve sunucu tarafında nasıl doğrulanacağıyla ilgilidir. İstisnai izlemden, sorunun, istemci tarafının sağlama toplamı olmadığını ve sunucu tarafının sağlama toplamını doğrulamaya çalıştığını gösterir. Checksum, açık bir anlamı olan sembolde ayarlanmış olan paramik değerlerden biridir.

Bu özelliği, sağlama toplamı denetimini yok saymak için bu özelliği devre dışı bırakmak üzere bir yol olmalıdır. Ama başka bir kapı açar ve kalan riski değerlendirmek gerekebilir.

16

Sorun, keytab'da görünüyor. Bazı özel keytab dosya durumlarına yol açan bazı eylem dizileri vardır: (A) keytab Java ile çalışır ancak k5start/kinit ile çalışmaz; (B) keytab Java ile çalışmaz, ancak k5start/kinit ile çalışır; (C) keytab, her ikisi ile çalışır.

Java keytab dosyası kullanarak kimlik doğrulaması eğer kontrol etmenizi sağlar kısa bir Java kodu:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Properties; 

import javax.security.auth.Subject; 

import com.sun.security.auth.module.Krb5LoginModule; 

/** 
* This is simple Java program that tests ability to authenticate 
* with Kerberos using the JDK implementation. 
* 
* The program uses no libraries but JDK itself. 
*/ 
public class Krb { 

    private void loginImpl(final String propertiesFileName) throws Exception { 
    System.out.println("NB: system property to specify the krb5 config: [java.security.krb5.conf]"); 
    //System.setProperty("java.security.krb5.conf", "/etc/krb5.conf"); 

    System.out.println(System.getProperty("java.version")); 

    System.setProperty("sun.security.krb5.debug", "true"); 

    final Subject subject = new Subject(); 

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

    if (propertiesFileName == null) { 
     //optionMap.put("ticketCache", "/tmp/krb5cc_1000"); 
     optionMap.put("keyTab", "/etc/krb5.keytab"); 
     optionMap.put("principal", "foo"); // 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"); 
    } else { 
     File f = new File(propertiesFileName); 
     System.out.println("======= loading property file ["+f.getAbsolutePath()+"]"); 
     Properties p = new Properties(); 
     InputStream is = new FileInputStream(f); 
     try { 
     p.load(is); 
     } finally { 
     is.close(); 
     } 
     optionMap.putAll((Map)p); 
    } 
    optionMap.put("debug", "true"); // switch on debug of the Java implementation 

    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("======= Subject: " + subject); 
    } 

    public static void main(String[] args) throws Exception { 
    System.out.println("A property file with the login context can be specified as the 1st and the only paramater."); 
    final Krb krb = new Krb(); 
    krb.loginImpl(args.length == 0 ? null : args[0]); 
    } 
} 

ve mülkiyet dosyası kullanımı:

#ticketCache=/tmp/krb5cc_1000 
keyTab=/etc/krb5.keytab 
principal=foo 

doNotPrompt=true 
refreshKrb5Config=true 
useTicketCache=true 
renewTGT=true 
useKeyTab=true 
storeKey=true 
isInitiator=true 

(biz bu Krb varsayalım Aşağıda/kdc doğru şekilde kuruldu ve yapılandırıldı, veritabanı kdb5_util ile oluşturuldu.Her komut dizisinin başlangıç ​​durumu: keytab dosyasının silinmesi, simge önbelleği silinir, kullanıcı "foo" veritabanından silinir.)


aşağıdaki eylem dizisi Keytab duruma yol açar: (A)

$ echo -e "foo\nfoo" | kadmin.local -q "addprinc foo" 
$ echo -e "foo\nfoo" | kadmin.local -q "ktadd foo" 
$ java -cp . Krb ./krb5.properties 
# Now java auth okay, but the following command fails: 
$ k5start foo 
Kerberos initialization for [email protected] 
Password for [email protected]: 
k5start: error getting credentials: Decrypt integrity check failed 
$ 

aşağıdaki eylem dizisi Keytab halde (B) yol açar:

$ echo -e "foo\nfoo" | kadmin.local -q "addprinc foo" 
$ echo -e "foo\nfoo" | kadmin.local -q "ktadd foo" 
$ echo -e "foo\nfoo" | kadmin.local -q "cpw foo" 
$ java -cp . Krb ./krb5.properties 
A property file with the login context can be specified as the 1st and the only paramater. 
NB: system property to specify the krb5 config: [java.security.krb5.conf] 
1.6.0_33 
======= loading property file [/tmp/krb-test/yhadoop-common/./krb5.properties] 
Debug is true storeKey true useTicketCache true useKeyTab true doNotPrompt true ticketCache is null isInitiator true KeyTab is /etc/krb5.keytab refreshKrb5Config is true principal is foo tryFirstPass is false useFirstPass is false storePass is false clearPass is false 
Refreshing Kerberos configuration 
Config name: /etc/krb5.conf 
>>> KdcAccessibility: reset 
>>> KdcAccessibility: reset 
Acquire TGT from Cache 
>>>KinitOptions cache name is /tmp/krb5cc_0 
Principal is [email protected] 
null credentials from Ticket Cache 
>>> KeyTabInputStream, readName(): EXAMPLE.COM 
>>> KeyTabInputStream, readName(): foo 
>>> KeyTab: load() entry length: 49; type: 23 
Added key: 23version: 3 
Ordering keys wrt default_tkt_enctypes list 
default etypes for default_tkt_enctypes: 23. 
0: EncryptionKey: keyType=23 kvno=3 keyValue (hex dump)= 
0000: 5F 7F 9B 42 BB 02 51 81 32 05 1D 7B C0 9F 19 C0 _..B..Q.2....... 


principal's key obtained from the keytab 
Acquire TGT using AS Exchange 
default etypes for default_tkt_enctypes: 23. 
>>> KrbAsReq calling createMessage 
>>> KrbAsReq in createMessage 
>>> KrbKdcReq send: kdc=localhost UDP:88, timeout=30000, number of retries =3, #bytes=128 
>>> KDCCommunication: kdc=localhost UDP:88, timeout=30000,Attempt =1, #bytes=128 
>>> KrbKdcReq send: #bytes read=611 
>>> KrbKdcReq send: #bytes read=611 
>>> KdcAccessibility: remove localhost:88 
>>> EType: sun.security.krb5.internal.crypto.ArcFourHmacEType 
Checksum failed ! 
       [Krb5LoginModule] authentication failed 
Checksum failed 
Exception in thread "main" javax.security.auth.login.LoginException: Checksum failed 
     at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:696) 
     at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:542) 
     at Krb.loginImpl(Krb.java:65) 
     at Krb.main(Krb.java:77) 
Caused by: KrbException: Checksum failed 
     at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:85) 
     at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:77) 
     at sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:168) 
     at sun.security.krb5.KrbAsRep.<init>(KrbAsRep.java:87) 
     at sun.security.krb5.KrbAsReq.getReply(KrbAsReq.java:446) 
     at sun.security.krb5.Credentials.sendASRequest(Credentials.java:401) 
     at sun.security.krb5.Credentials.acquireTGT(Credentials.java:350) 
     at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:672) 
     ... 3 more 
Caused by: java.security.GeneralSecurityException: Checksum failed 
     at sun.security.krb5.internal.crypto.dk.ArcFourCrypto.decrypt(ArcFourCrypto.java:388) 
     at sun.security.krb5.internal.crypto.ArcFourHmac.decrypt(ArcFourHmac.java:74) 
     at sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:83) 
     ... 10 more 
$ 

Ancak Bu durumda "k5start foo" nun yanı sıra "kinit foo" da iyidir.


ve aşağıdaki eylem dizisi durumu (C) yol açar:

$ echo -e "foo\nfoo" | kadmin.local -q "addprinc foo" 
$ ktutil 
ktutil: addent -password -p foo -k 1 -e rc4-hmac 
Password for [email protected]: 
ktutil: wkt /etc/krb5.keytab 
ktutil: q 

sonra her iki k5start/kinit ve Java doğrulama olumlu bir sonuç verir.


Çevre: Ayrıca

yum list krb5-appl-servers krb5-libs krb5-server krb5-workstation kstart pam_krb5 
... 
Installed Packages 
krb5-libs.x86_64                   1.9-33.el6_3.3                  @updates 
krb5-server.x86_64                   1.9-33.el6_3.3                  @updates 
krb5-workstation.x86_64                  1.9-33.el6_3.3                  @updates 
kstart.x86_64                    4.1-2.el6                   @epel 
... 
$ cat /etc/redhat-release 
CentOS release 6.3 (Final) 
$ java -version 
java version "1.6.0_33" 
Java(TM) SE Runtime Environment (build 1.6.0_33-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03, mixed mode) 

Ayrıca aynı davranış MIT'nin kerberos 5-1.10.3 ile kesin Ubuntu (12.04.1 LTS) üzerinde gözlemlendi derlenmiş 7. Java ile gözlenen aynı davranış kaynak dağıtımından.

+4

Güzel kapsamlı cevap! – Hbcdev

+0

@Ivan - Biletimi keytab'dan alabiliyorum. Ancak, Java 7 koduyla, bu Checksum başarısız hatasıyla aniden başarısız oldu. Keytab tek seçenek yeniden mı? –

İlgili konular