2012-12-10 34 views
6

Yazdığım basit bir Thrift tabanlı java uygulamasına sahibim. Bu gerçekten çok basit, java Thrift kullanarak bir "Merhaba Dünya" mesaj taşıma çok daha fazla değil. Mesajıma Kerberos desteğini eklemem gerektiği söylendi. Ben biraz googling yaptım ve Thrift zaten bazı formda Kerberos desteği yok (veya bunu, bunu bulamıyorum) şaşırıyorum. GSSAPI kullanarak kendi sargımı yazmayı düşündüm, ancak Thrift mesajımın Thrift mesaj formatını sıkıştırdığı için sarsıyorum/açamıyorum.Thrift için Kerberos?

Hiç kimseyi Kerberized Thrift? .. ya da nasıl yapılacağını biliyor mu?

Önceden teşekkürler.

+0

Hadoop'un bu konuda bir şeyler yapmış olabileceği sanılıyor ... – Wanderer

cevap

11

** Yani, sanırım SASL/GSS API'leri aracılığıyla bunu yapmanın bir yolu var. Bu, internette bunun neden herhangi bir yerini göremediğimle ilgili olarak beni şaşırtıyor. Ancak, başkalarına yardım edeceğini umduğum ya da birilerinin burada yararlı bir şeyler yapma hayalimi düzeltebileceği umuduyla yarattığım şeylerin bir örneğini yayınlıyorum.

örnek Sunucu kodu:

TServerSocket serverTransport = new TServerSocket(7911); // new server on port 7911 
HelloWorldService.Processor<Iface> processor = new HelloWorldService.Processer<Iface>(new ThriftServerImpl()); // This is my thrift implementation for my server 
Map<String, String> saslProperties = new HashMap<String, String>(); // need a map for properties 
saslProperties.put(Sasl.QOP, "true"); 
saslProperties.put(Sasl.QOP, "auth-conf"); // authorization and confidentiality 

TSaslServerTransport.Factory saslTransportFactory = new TSaslServerTransport.Factory();  // Creating the server definition 
saslTransportFactory.addServerDefinition(
      "GSSAPI",  // tell SASL to use GSSAPI, which supports Kerberos 
      "myserviceprincipal", // base kerberos principal name - myprincipal/[email protected] 
      "my.server.com", // kerberos principal server - myprincipal/[email protected] 
      saslProps,  // Properties set, above 
      new SaslRpcServer.SaslGssCallbackHandler())); // I don't know what this really does... but I stole it from Hadoop and it works.. so there. 

Tserver server = new TThreadPoolServer(newTThreadPoolSErver.Args(serverTransport).transportFactory(saslTrasnportFactory).processor(processor)); 

server.serve(); // Thrift server start 

örnek Müşteri Kodu

TTransport transport = new TSocket("my.server.com", 7911); // client to connect to server and port 
saslProperties.put(Sasl.QOP, "true"); 
saslProperties.put(Sasl.QOP, "auth-conf"); // authorization and confidentiality 

TTransport saslTransport = new TSaslTransport(
      "GSSAPI",  // tell SASL to use GSSAPI, which supports Kerberos 
      null,   // authorizationid - null 
      "myserviceprincipal", // base kerberos principal name - myprincipal/[email protected] 
      "my.server.com", // kerberos principal server - myprincipal/[email protected] 
      saslProps,  // Properties set, above 
      null,   // callback handler - null 
      transport);  // underlying transport 

TProtocol protocol = new TBinaryProtocol(saslTransport); // set up our new Thrift protocol 

HelloWorldService.Client client = new HelloWorldService.Client(protocol); // Setup our thrift client 
saslTransport.open(); 

String response = client.hello("Hi There"); // send message 

System.out.println("response = " + response); 

transport.close(); 

Diğer condsiderations: Ben istemci hem de sunucu üzerinde birkaç java özelliklerini ayarlayabilirsiniz *

.
- java.security.krb5.realm = MY.REALM // bölge adı
- java.security.krb5.kdc = my.kdc.com // kdc sunucusu
- javax.security.auth.useSubjectCredsOnly = false // JAAS'ın TGT'yi almasına izin ver.
- java.security.auth.login.config = /etc/myapp/conf/jaas.conf - gerekli jaas dosyası
- sun.security.krb5.debug = true // sorunların tanılanmasında yardımcı oldu.
* Yukarıda belirtilen jaas.conf dosyasının iki girişi olması gerekir (sunucu başına yalnızca bir tane ...). Burada ben bu bilgiyi panoda nerede hatırlamıyorum .. ama olamaz benim dosyasıdır:

com.sun.security.jgss.initiate { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useKeyTab=true 
    keyTab="/etc/myapp/conf/myapp.keytab" 
    useTicketCache=true 
    principal="myuserprincipal" 
    debug=true; 
}; 

com.sun.security.jgss.accept { 
    com.sun.security.auth.module.Krb5LoginModule required 
    useKeyTab=true 
    keyTab="/etc/myapp/conf/myapp.keytab" 
    useTicketCache=false 
    principal="myserviceprincipal/my.server.com" 
    debug=true; 
}; 

(değerlendirmelere geri ....)
* "Yetk conf" bir Sasl.QOP olmasına rağmen .. İletilen ilk (?) mesaj şifrelenmez. Belki bu sadece bir el sıkışma ya da bir şeydir. Kalan mesajlar şifrelenmiş gibi gözüküyor, ancak ilk önce "Şifreleme, eş tarafından gerçekleştirilmedi" konsoluna çirkin bir mesaj basıyor. Bu mesajı almamak güzel olurdu, çünkü yolda kedere yol açacak (garantili olsun ya da olmasın).

Her neyse, umarım bu birilerine yardımcı olur ... ya da alternatif olarak bana yardımcı olacak bazı geliştirmeleri teşvik edebilir. :) Bunu yapmak için 2-3 gün geçirdiğime inanmak zor ve sadece küçük bir miktar kod çıktı, ama başladığımda Kerberos veya Thrift'i çok iyi tanımadım.

Okumak için teşekkürler.