** 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.
Xuất hiện như thể Hadoop có thể đã làm điều gì đó về điều này ... – Wanderer