** 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.
Pojawia się tak, jakby Hadoop mógł coś z tym zrobić ... – Wanderer