2012-12-10 25 views
6

Tôi có một ứng dụng java dựa trên Tiết kiệm đơn giản mà tôi đã viết. Nó thực sự rất đơn giản, không nhiều hơn một thông điệp "Hello World" vận chuyển bằng cách sử dụng Thrift trong java. Tôi đã được thông báo rằng tôi cần thêm hỗ trợ Kerberos vào tin nhắn của mình. Tôi đã làm một số googling và ngạc nhiên rằng tiết kiệm không có hỗ trợ Kerberos trong một số hình thức (hoặc nếu có, tôi không thể tìm thấy nó). Tôi đã nghĩ đến việc viết trình bao bọc của riêng mình bằng cách sử dụng GSSAPI, nhưng tôi không thể bọc/mở thông điệp Tiết kiệm của mình vì các ốc vít đó có định dạng thông báo Tiết kiệm.Kerberos for Thrift?

Có ai từng Kerberized tiết kiệm không? .. hoặc biết làm thế nào nó sẽ được thực hiện?

Xin cảm ơn trước.

+0

Xuất hiện như thể Hadoop có thể đã làm điều gì đó về điều này ... – Wanderer

Trả lời

11

** Vì vậy, tôi đoán có cách để thực hiện điều này thông qua API SASL/GSS. Nó làm tôi bối rối vì sao tôi không thấy bất kỳ ví dụ tuyệt vời nào về điều này trên internet ở bất cứ đâu. Tuy nhiên, tôi đăng một ví dụ về những gì tôi đã tạo ra với hy vọng rằng nó sẽ là sự giúp đỡ cho người khác ... hoặc ai đó có thể sửa chữa ảo tưởng của tôi về việc làm một cái gì đó hữu ích ở đây.

mẫu mã Server:

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 

Mẫu Khách hàng Mã

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 khác:

* Tôi thiết lập một số thuộc tính java trên cả máy khách và máy chủ.
- java.security.krb5.realm = MY.REALM // tên vương quốc
- java.security.krb5.kdc = my.kdc.com // server kdc
- javax.security.auth.useSubjectCredsOnly = false // Cho phép JAAS lấy TGT.
- java.security.auth.login.config = /etc/myapp/conf/jaas.conf - tệp jaas bắt buộc
- sun.security.krb5.debug = true // đã giúp chẩn đoán sự cố.
* Tệp jaas.conf được chỉ định ở trên, cần phải có hai mục nhập (có thể chỉ có một mục nhập cho mỗi máy chủ ...). Tôi không thể nhớ nơi tôi lượm lặt thông tin này từ .. nhưng ở đây là tập tin của tôi:

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

(trở về xem xét ....)
* Mặc dù có một Sasl.QOP của "auth-conf" .. thông báo đầu tiên (?) được truyền đi không được mã hóa. Có lẽ đây chỉ là cái bắt tay, hay cái gì đó. Các tin nhắn còn lại xuất hiện để được mã hóa, nhưng điều này đầu tiên in một thông điệp xấu xí để bàn điều khiển của "Không mã hóa được thực hiện bởi peer". Sẽ thật tuyệt nếu không nhận được thông điệp đó, vì nó sẽ gây đau buồn trên đường (được bảo đảm hay không).

Dù sao, tôi hy vọng điều này sẽ giúp ai đó ... hoặc cách khác có thể kích động một số cải tiến sẽ giúp tôi. :) Khó tin rằng tôi dành 2-3 ngày làm việc này, và chỉ một lượng nhỏ mã xuất hiện, nhưng tôi không biết Kerberos hay Tiết kiệm rất tốt khi tôi bắt đầu.

Cảm ơn bạn đã đọc.