2012-12-10 14 views
6

Mam prostą aplikację java oparta na Thrift, którą napisałem. To naprawdę bardzo proste, niewiele więcej niż transport wiadomości "Hello World" za pomocą Thrift w Javie. Powiedziano mi, że muszę dodać obsługę protokołu Kerberos do mojego komunikatu. Zrobiłem trochę googlowania i jestem zaskoczony, że Thrift nie ma już wsparcia Kerberos w jakiejś formie (lub jeśli tak, nie mogę go znaleźć). Myślałem o napisaniu własnego opakowania za pomocą GSSAPI, ale nie mogę opakować/rozwinąć mojego komunikatu "Oszczędzanie", ponieważ wkręca to format komunikatu "Oszczędzanie".Kerberos for Thrift?

Czy ktoś kiedykolwiek Kerberized Thrift? .. lub wiedzieć, jak by to zrobić?

Dzięki, z góry.

+0

Pojawia się tak, jakby Hadoop mógł coś z tym zrobić ... – Wanderer

Odpowiedz

11

** Sądzę więc, że istnieje sposób, aby to zrobić poprzez interfejsy API SASL/GSS. To dezorientuje mnie, dlaczego nie widzę żadnych wspaniałych przykładów tego w Internecie w dowolnym miejscu. Zamieszczam jednak przykład tego, co stworzyłem w nadziei, że będzie to pomoc dla innych ... lub, że ktoś może poprawić moje złudzenie robienia czegoś pożytecznego tutaj.

Przykładowy kod serwera:

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 

kod klienta Próbka

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

Inne condsiderations:

* ustawić kilka właściwości Java na klienta i serwera.
- java.security.krb5.realm = MY.REALM // nazwa obszaru
- java.security.krb5.kdc = my.kdc.com // serwer KDC
- javax.security.auth.useSubjectCredsOnly = false // Pozwól JAAS uzyskać TGT.
- java.security.auth.login.config = /etc/myapp/conf/jaas.conf - wymagany plik jaas
- sun.security.krb5.debug = true // pomógł w diagnozowaniu problemów.
* Podany powyżej plik jaas.conf musi mieć dwa wpisy (może tylko jeden na serwer ...). Nie mogę sobie przypomnieć, gdzie zbierała te informacje od .. ale tutaj jest mój plik:

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

(powrót do rozważań ....)
* Pomimo posiadania Sasl.QOP z „auth-conf” .. pierwsza (?) wiadomość, która zostanie przesłana, nie jest szyfrowana. Może to tylko uścisk dłoni, czy coś takiego. Pozostałe komunikaty wydają się być zaszyfrowane, ale ten pierwszy wypisuje brzydką wiadomość do konsoli "Żadne szyfrowanie nie zostało wykonane przez peera". Byłoby miło nie dostać tej wiadomości, ponieważ spowoduje smutek w dół drogi (uzasadnione lub nie).

W każdym razie, mam nadzieję, że to pomoże komuś ... lub może sprowokować pewne ulepszenia, które mi pomogą. :) Trudno uwierzyć, że spędzam 2-3 dni na robieniu tego, i wyszło z tego tylko niewielka ilość kodu, ale nie znałem ani Kerberosa, ani Thrifta bardzo dobrze, gdy zaczynałem.

Dzięki za przeczytanie.