2012-12-10 36 views
6

मेरे पास लिखा गया एक सरल थ्रिफ्ट आधारित जावा एप्लिकेशन है। यह वास्तव में बहुत आसान है, जावा में थ्रिफ्ट का उपयोग करके "हैलो वर्ल्ड" संदेश परिवहन से कहीं ज्यादा नहीं। मुझे बताया गया है कि मुझे अपने संदेश में केर्बेरोज समर्थन जोड़ने की जरूरत है। मैंने कुछ googling किया है और हैरान है कि थ्रिफ्ट पहले से ही किसी रूप में Kerberos समर्थन नहीं है (या अगर यह करता है, मैं इसे नहीं मिल सकता)। मैंने जीएसएसएपीआई का उपयोग करके अपना खुद का रैपर लिखने के बारे में सोचा, लेकिन मैं अपने थ्रिफ्ट संदेश को लपेट नहीं/लपेट सकता हूं क्योंकि यह थ्रिफ्ट संदेश प्रारूप को खराब करता है।थ्रिफ्ट के लिए केर्बेरोज?

क्या किसी ने कभी भी केर्बेराइज्ड थ्रिफ्ट किया है? या पता है कि यह कैसे किया जाएगा?

धन्यवाद, अग्रिम में।

+0

ऐसा लगता है कि हैडोप ने इस पर कुछ किया होगा ... – Wanderer

उत्तर

11

** तो, मुझे लगता है कि एसएएसएल/जीएसएस एपीआई के माध्यम से ऐसा करने का एक तरीका है। यह मुझे भ्रमित करता है कि मुझे इंटरनेट पर कहीं भी इस बारे में कोई महान उदाहरण क्यों नहीं दिख रहा है। हालांकि, मैंने उम्मीदों में जो कुछ बनाया है, उसका एक उदाहरण पोस्ट करता हूं कि यह दूसरों के लिए मददगार होगा ... या कोई यहां कुछ उपयोगी करने के मेरे भ्रम को सही कर सकता है।

नमूना सर्वर कोड:

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 

नमूना क्लाइंट कोड

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(); 

अन्य condsiderations:

* मैं दोनों क्लाइंट और सर्वर पर कई जावा गुण सेट करें।
- java.security.krb5.realm = MY.REALM // दायरे नाम
- java.security.krb5.kdc = my.kdc.com // KDC सर्वर
- javax.security.auth.useSubjectCredsOnly = false // जेएएएस को टीजीटी प्राप्त करने दें।
- java.security.auth.login.config = /etc/myapp/conf/jaas.conf - आवश्यक jaas फ़ाइल
- sun.security.krb5.debug = true // समस्याओं का निदान करने में सहायता मिली।
* ऊपर निर्दिष्ट jaas.conf फ़ाइल, दो प्रविष्टियों की आवश्यकता है (शायद केवल एक सर्वर ...)। मुझे याद नहीं है, जहां मैं इस जानकारी gleaned .. लेकिन यहाँ मेरी फाइल है:

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

(वापस विचार करने के लिए ....)
* "Auth-conf" का एक Sasl.QOP होने के बावजूद .. संक्रमित होने वाला पहला (?) संदेश एन्क्रिप्टेड नहीं है। शायद यह सिर्फ एक हैंडशेक है, या कुछ। शेष संदेश एन्क्रिप्ट किए गए प्रतीत होते हैं, लेकिन यह पहला "कंसोल द्वारा कोई एन्क्रिप्शन नहीं किया गया" कंसोल पर एक बदसूरत संदेश प्रिंट करता है। यह संदेश अच्छा नहीं होगा, क्योंकि इससे सड़क पर दुःख होगा (वारंट या नहीं)।

वैसे भी, मुझे उम्मीद है कि यह किसी की मदद करेगा ... या वैकल्पिक रूप से कुछ सुधारों को उकसा सकता है जो मेरी मदद करेंगे। :) विश्वास करना मुश्किल है कि मैं इसे करने में 2-3 दिन बिताता हूं, और केवल थोड़ी सी मात्रा में कोड आया, लेकिन जब मैंने शुरू किया तो मुझे न तो केर्बेरोज या बहाव बहुत अच्छी तरह से पता था।

पढ़ने के लिए धन्यवाद।