** 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.
Hadoop'un bu konuda bir şeyler yapmış olabileceği sanılıyor ... – Wanderer