Kerberos за Thrift?

Имам просто Thrift базирано Java приложение, което съм написал. Наистина е много просто, не много повече от транспортиране на съобщения „Hello World“ с помощта на Thrift в java. Казаха ми, че трябва да добавя поддръжка на Kerberos към моето съобщение. Направих малко гугъл и съм изненадан, че Thrift все още няма поддръжка на Kerberos под някаква форма (или ако има, не мога да я намеря). Мислех да напиша моя собствена обвивка с помощта на GSSAPI, но не мога да обвия/разопаковам моето съобщение Thrift, тъй като това прецаква формата на съобщението Thrift.

Някой някога да е използвал Kerberized Thrift?.. или да знае как ще бъде направено?

Благодаря предварително.


person Wanderer    schedule 10.12.2012    source източник
comment
Изглежда, че Hadoop може да е направил нещо по този въпрос...   -  person Wanderer    schedule 10.12.2012


Отговори (1)


**И така, предполагам, че има начин да направите това чрез SASL/GSS API. Обърква ме защо не виждам никъде страхотни примери за това в интернет. Въпреки това, публикувам пример за това, което съм създал с надеждата, че ще бъде от помощ на другите... или че някой може да коригира заблудата ми, че правя нещо полезно тук.

Примерен код на сървъра:

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

Други съображения:

* Зададох няколко свойства на Java както на клиента, така и на сървъра.
- java.security.krb5.realm = MY.REALM // име на сфера
- java.security. krb5.kdc = my.kdc.com // kdc сървър
- javax.security.auth.useSubjectCredsOnly = false // Разрешаване на JAAS да получи TGT.
- java.security.auth.login.config = / etc/myapp/conf/jaas.conf - необходим jaas файл
- sun.security.krb5.debug = true // помогна при диагностицирането на проблеми.
* Посоченият по-горе файл jaas.conf трябва да има два записи (може би само по един на сървър...). Не мога да си спомня откъде почерпих тази информация, но ето моя файл:

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

(обратно към съображенията....)
* Въпреки наличието на Sasl.QOP на "auth-conf".... първото (?) съобщение, което се предава, не е криптирано. Може би това е просто ръкостискане или нещо подобно. Останалите съобщения изглеждат криптирани, но това първо отпечатва грозно съобщение на конзолата „Не е извършено криптиране от партньор“. Би било хубаво да не получавате това съобщение, тъй като ще причини скръб по пътя (оправдана или не).

Както и да е, надявам се това да помогне на някого... или като алтернатива може да провокира някои подобрения, които ще ми помогнат. :) Трудно е да повярвам, че прекарвам 2-3 дни в това и само малко количество код излезе от него, но не познавах нито Kerberos, нито Thrift много добре, когато започнах.

Благодаря за четенето.

person Wanderer    schedule 12.12.2012