Elastic Search + Search Guard做es安全认证(RestHighLevelClient)。

痛定思痛。 2024-02-19 21:56 164阅读 0赞

首先:es集群安装Search Guard,运维完成,或者参考Search Guard官网进行安装。(我也不会)

需要4个东西:truststore.jks文件,truststore.jks的秘钥,es的登录用户、密码

在没有search guard的时候,实例化es的就不多说了。(网上自己搜)

建议使用es的java高级客户端:RestHighLevelClient,在es7之后已经不支持使用transportclient。

下面是源码:

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.apache.http.HttpHost;
  3. import org.apache.http.auth.AuthScope;
  4. import org.apache.http.auth.UsernamePasswordCredentials;
  5. import org.apache.http.client.CredentialsProvider;
  6. import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
  7. import org.apache.http.impl.client.BasicCredentialsProvider;
  8. import org.apache.http.ssl.SSLContexts;
  9. import org.elasticsearch.client.RestClient;
  10. import org.elasticsearch.client.RestClientBuilder;
  11. import org.elasticsearch.client.RestHighLevelClient;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.beans.factory.config.AbstractFactoryBean;
  14. import org.springframework.context.annotation.Configuration;
  15. import javax.net.ssl.SSLContext;
  16. import java.io.File;
  17. @Configuration
  18. @Slf4j
  19. public class ElasticSearchConfiguration extends AbstractFactoryBean<RestHighLevelClient> {
  20. @Value("${elasticsearch.host}")
  21. private String host;//es-node1.com,es-node2.com
  22. @Value("${elasticsearch.port}")
  23. private String port;//9200,9200
  24. @Value("${elasticsearch.cluster-name}")
  25. private String clusterName;
  26. @Value("${elasticsearch.truststore.password}")
  27. private String truststorePasswordStr;//truststore.jks的生成秘钥
  28. @Value("${elasticsearch.truststore.path}")
  29. private String truststorePath;//truststore.jks的路径
  30. @Value("${elasticsearch.username}")
  31. private String username;
  32. @Value("${elasticsearch.password}")
  33. private String password;
  34. @Value("${elasticsearch.scheme}")
  35. private String scheme;//加上searchguard之后是https
  36. private static int connectTimeOut = 1000; // 连接超时时间
  37. private static int socketTimeOut = 30000; // 连接超时时间
  38. private static int connectionRequestTimeOut = 500; // 获取连接的超时时间
  39. private RestHighLevelClient restHighLevelClient;
  40. @Override
  41. public void destroy() throws Exception {
  42. // 关闭Client
  43. if (restHighLevelClient != null) {
  44. restHighLevelClient.close();
  45. }
  46. }
  47. @Override
  48. public Class<RestHighLevelClient> getObjectType() {
  49. return RestHighLevelClient.class;
  50. }
  51. @Override
  52. public boolean isSingleton() {
  53. return false;
  54. }
  55. @Override
  56. protected RestHighLevelClient createInstance() throws Exception {
  57. final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  58. //用户名密码
  59. credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
  60. //(searchguard需要加上,构建sslcontext)
  61. //truststore的密码
  62. boolean trustSelfSigned = true;
  63. char[] truststorePassword = truststorePasswordStr.toCharArray();
  64. SSLContext sslContextFromJks = SSLContexts
  65. .custom()
  66. .loadTrustMaterial(new File(truststorePath), truststorePassword, trustSelfSigned ? new TrustSelfSignedStrategy() : null)
  67. .build();
  68. //多个节点
  69. String[] hostArray = host.split(",");
  70. String[] portArray = port.split(",");
  71. if (hostArray.length != portArray.length) {
  72. log.error("Elastic Search 初始化失败:Host和Port不对应,host:{} ,port:{}", hostArray, portArray);
  73. return null;
  74. }
  75. HttpHost[] httpHosts = new HttpHost[hostArray.length];
  76. for (int i = 0; i < hostArray.length; i++) {
  77. httpHosts[i] = new HttpHost(hostArray[i], Integer.parseInt(portArray[i]), scheme);
  78. }
  79. try {
  80. RestClientBuilder builder = RestClient.builder(httpHosts);
  81. // 异步httpclient连接延时配置
  82. builder.setRequestConfigCallback(requestConfigBuilder -> {
  83. requestConfigBuilder.setConnectTimeout(connectTimeOut);
  84. requestConfigBuilder.setSocketTimeout(socketTimeOut);
  85. requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
  86. return requestConfigBuilder;
  87. });
  88. //设置安全(searchguard)
  89. builder.setHttpClientConfigCallback(httpClientBuilder ->
  90. httpClientBuilder
  91. .setDefaultCredentialsProvider(credentialsProvider)
  92. .setSSLContext(sslContextFromJks)
  93. );
  94. restHighLevelClient = new RestHighLevelClient(builder);
  95. } catch (Exception e) {
  96. log.error("Elastic Search 初始化失败:" + e.getMessage());
  97. }
  98. return restHighLevelClient;
  99. }
  100. }

发表评论

表情:
评论列表 (有 0 条评论,164人围观)

还没有评论,来说两句吧...

相关阅读