ElasticSearch通过searchguard实现安全传输

背景

一、相关下载地址:

Elastic Stack:
https://www.elastic.co/downloads

Search Guard:
https://github.com/floragunncom/search-guard/tree/es-5.0.1
https://floragunn.com/search-guard-5/

所有发布版本:
http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.floragunn%22%20AND%20a%3A%22search-guard-5%22

二、文档查阅

search-guard
   https://github.com/floragunncom/search-guard
   https://github.com/floragunncom/search-guard-docs
   https://github.com/floragunncom/search-guard-ssl
   https://github.com/floragunncom/search-guard-ssl-docs

三、参考

http://www.cnblogs.com/Orgliny/p/6168986.html
http://www.what21.com/sys/view/71\_sc\_1475297347975.html

操作步骤

一、查看已配置es的集群状况

1[root@soc ~]# curl -GET 'http://192.168.0.90:9200/_cat/nodes' 2192.168.0.90  11 91 10 0.21 0.19 0.13 mdi - node-90 3192.168.0.203 24 88  0 0.00 0.00 0.00 mdi * node-203

二、安装配置 elasticsearch plugin search-guard 

1、安装 search-guard 2个结点都需要执行

1[rsortec@soc elasticsearch-5.2.1]# pwd 2/home/sortec/elasticsearch-5.2.1 3[sortec@soc elasticsearch-5.2.1]#   bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.2.1-11 4-> Downloading com.floragunn:search-guard-5:5.2.1-11 from maven central 5[=================================================] 100%    6@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 7@     WARNING: plugin requires additional permissions     @ 8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9* java.lang.RuntimePermission accessClassInPackage.sun.misc 10* java.lang.RuntimePermission accessDeclaredMembers 11* java.lang.RuntimePermission getClassLoader 12* java.lang.RuntimePermission loadLibrary.* 13* java.lang.RuntimePermission setContextClassLoader 14* java.lang.RuntimePermission shutdownHooks 15* java.lang.reflect.ReflectPermission suppressAccessChecks 16* java.security.SecurityPermission getProperty.ssl.KeyManagerFactory.algorithm 17* java.util.PropertyPermission java.security.debug write 18* java.util.PropertyPermission java.security.krb5.conf write 19* java.util.PropertyPermission javax.security.auth.useSubjectCredsOnly write 20* java.util.PropertyPermission sun.security.krb5.debug write 21* java.util.PropertyPermission sun.security.spnego.debug write 22* javax.security.auth.AuthPermission doAs 23* javax.security.auth.AuthPermission modifyPrivateCredentials 24* javax.security.auth.kerberos.ServicePermission * accept 25See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html 26for descriptions of what these permissions allow and the associated risks. 27-> Installed search-guard-5

注:具体安装哪个版本的guard和es版本相互对应,可惜没有找到对应关系;但是如果你安装错误了版本,它会提示当前版本对应的es版本。

2、下载 search-guard-ssl 任意一台结点配置,本次以node-90结点

1[root@soc elasticsearch-5.2.1]#  git clone https://github.com/floragunncom/search-guard-ssl.git 2正克隆到 'search-guard-ssl'... 3remote: Counting objects: 5432, done. 4remote: Compressing objects: 100% (3/3), done. 5remote: Total 5432 (delta 0), reused 0 (delta 0), pack-reused 5429 6接收对象中: 100% (5432/5432), 1.15 MiB | 60.00 KiB/s, done. 7处理 delta 中: 100% (2561/2561), done. 8检查连接... 完成。 9[root@soc elasticsearch-5.2.1]# cd search-guard-ssl/ 10[root@soc search-guard-ssl]# cd .. 11[root@soc elasticsearch-5.2.1]# ls 12bin  config  lib  LICENSE.txt  logs  modules  NOTICE.txt  plugins  README.textile  search-guard-ssl 13[root@soc elasticsearch-5.2.1]# cd search-guard-ssl/example-pki-scripts/ 14[root@soc example-pki-scripts]# ls 15clean.sh  etc  example.sh  gen_client_node_cert.sh  gen_node_cert_openssl.sh  gen_node_cert.sh  gen_root_ca.sh

3、修改第三行的 0 为 2 生成 node-90 node-203 两张证书  任意一台结点配置,本次以node-90结点

1[root@localhost example-pki-scripts]# cat example.sh  2#!/bin/bash 3set -e 4./clean.sh 5./gen_root_ca.sh capass changeit 6./gen_node_cert.sh 90 changeit capass && ./gen_node_cert.sh 203 changeit capass &&  ./gen_node_cert.sh 2 changeit capass 7./gen_client_node_cert.sh spock changeit capass 8./gen_client_node_cert.sh kirk changeit capass 9 10[root@localhost example-pki-scripts]# ./example.sh 

4、复制 truststore.jks node-x-keystore.jks 证书到各结点,注意,node-x-keystore.jks x 表示对应主机的结点名

1[root@soc example-pki-scripts]# ls 2ca                        kirk.csr               node-2.key.pem        node-90-keystore.p12 3certs                     kirk.key.pem           node-2-keystore.jks   node-90-signed.pem 4clean.sh                  kirk-keystore.jks      node-2-keystore.p12   spock.all.pem 5crl                       kirk-keystore.p12      node-2-signed.pem     spock.crtfull.pem 6etc                       kirk-signed.pem        node-4.crt.pem        spock.crt.pem 7example.sh                node-203.crt.pem       node-4.csr            spock.csr 8gen_client_node_cert.sh   node-203.csr           node-4.key            spock.key.pem 9gen_node_cert_openssl.sh  node-203.key.pem       node-4.p12            spock-keystore.jks 10gen_node_cert.sh          node-203-keystore.jks  node-4-signed.pem     spock-keystore.p12 11gen_root_ca.sh            node-203-keystore.p12  node-90.crt.pem       spock-signed.pem 12kirk.all.pem              node-203-signed.pem    node-90.csr           truststore.jks 13kirk.crtfull.pem          node-2.crt.pem         node-90.key.pem 14kirk.crt.pem              node-2.csr             node-90-keystore.jks 15[root@soc example-pki-scripts]# su - sortec 16[sortec@soc example-pki-scripts]# cp node-90-keystore.jks truststore.jks /home/sortec/elasticsearch-5.2.1/config/ 17[root@soc example-pki-scripts]18[root@soc example-pki-scripts]# scp node-203-keystore.jks truststore.jks sortec@192.168.0.203:/home/sortec/elasticsearch-5.2.1/config/ 19root@192.168.0.203's password:  20node-203-keystore.jks                                             100% 4498     4.4KB/s   00:00     21truststore.jks                                                    100% 1096     1.1KB/s   00:00     22[root@soc example-pki-scripts]

注意:es启动是用的低权限用户启动的,所以这里的证书放进去的时候,要注意文件所有者,否则es启动会报错。

5、配置elasticsearch 各结点基于tls加密通讯,并重启 注意 node-x-keystore.jks x 表示对应主机的结点名 2台都需要配置
参考:https://github.com/floragunncom/search-guard-ssl-docs/blob/master/configuration.md

1[root@soc config]# cat elasticsearch.yml 2…… 3searchguard.ssl.transport.enabled:true 4searchguard.ssl.transport.keystore_filepath: node-90-keystore.jks 5searchguard.ssl.transport.keystore_password: changeit 6searchguard.ssl.transport.truststore_filepath: truststore.jks 7searchguard.ssl.transport.truststore_password: changeit 8searchguard.ssl.transport.enforce_hostname_verification: false

重启ES后,elasticsearch 之间的连接已经是加密的了,但是有如下报错,此问题是没有初始化 Search Guard 索引。

1[root@SShan logs]# tail -f /home/sortec/elasticsearch-5.2.1/logs/Test.log  2[2017-03-24T16:17:55,138][ERROR][c.f.s.a.BackendRegistry  ] Not yet initialized (you may need to run sgadmin) 3[2017-03-24T16:17:55,138][ERROR][c.f.s.a.BackendRegistry  ] Not yet initialized (you may need to run sgadmin)

6、初始化  Search Guard 索引,配置帐号。 任意结点,本次配置以node-90结点。
复制kirk-keystore.jks证书

1[sortec@soc example-pki-scripts]$ pwd 2/home/sortec/elasticsearch-5.2.1/search-guard-ssl/example-pki-scripts 3[sortec@soc example-pki-scripts]4[sortec@soc example-pki-scripts]5[sortec@soc example-pki-scripts]$ cp kirk-keystore.jks /home/sortec/elasticsearch-5.2.1/plugins/search-guard-5/sgconfig/

新增以下配置参数,每个节点均要添加!

1[root@localhost example-pki-scripts]# vim /home/sortec/elasticsearch-5.2.1/config/elasticsearch.yml  2searchguard.authcz.admin_dn: 3  - "CN=kirk, OU=client, O=client, L=Test, C=DE"

重启ES集群

1[root@localhost example-pki-scripts]# cd vim /home/sortec/elasticsearch-5.2.1/bin 2[root@localhost example-pki-scripts]# ./elasticsearch

初始化  Search Guard 索引

1[root@soc search-guard-5]# pwd 2/home/sortec/elasticsearch-5.2.1/plugins/search-guard-5 3[root@soc search-guard-5]# ll 4总用量 5180 5-rw-r--r-- 1 sortec sortec   52988 3月  12 19:34 commons-cli-1.3.1.jar 6-rw-r--r-- 1 sortec sortec 2308517 3月  12 19:34 guava-19.0.jar 7-rw-r--r-- 1 sortec sortec  258913 3月  12 19:34 netty-buffer-4.1.7.Final.jar 8-rw-r--r-- 1 sortec sortec  307959 3月  12 19:34 netty-codec-4.1.7.Final.jar 9-rw-r--r-- 1 sortec sortec  544879 3月  12 19:34 netty-codec-http-4.1.7.Final.jar 10-rw-r--r-- 1 sortec sortec  685698 3月  12 19:34 netty-common-4.1.7.Final.jar 11-rw-r--r-- 1 sortec sortec  326931 3月  12 19:34 netty-handler-4.1.7.Final.jar 12-rw-r--r-- 1 sortec sortec   29214 3月  12 19:34 netty-resolver-4.1.7.Final.jar 13-rw-r--r-- 1 sortec sortec  426864 3月  12 19:34 netty-transport-4.1.7.Final.jar 14-rw-r--r-- 1 sortec sortec     935 3月  12 19:34 plugin-descriptor.properties 15-rw-r--r-- 1 sortec sortec    2111 3月  12 19:34 plugin-security.policy 16-rw-r--r-- 1 sortec sortec  184592 3月  12 19:34 search-guard-5-5.2.1-11.jar 17-rw-r--r-- 1 sortec sortec   55857 3月  12 19:34 search-guard-ssl-5.2.1-20.jar 18drwxrwxr-x 2 sortec sortec    4096 3月  12 19:35 sgconfig 19drwxrwxr-x 2 sortec sortec    4096 3月  12 19:34 tools 20-rw-r--r-- 1 sortec sortec   75372 3月  12 19:34 transport-netty4-client-5.2.1.jar 21[root@soc search-guard-5]# chmod +x /home/sortec/elasticsearch-5.2.1/plugins/search-guard-2/tools/sgadmin.sh 22[root@soc search-guard-5]# tools/sgadmin.sh  -ts /home/sortec/elasticsearch-5.2.1/config/truststore.jks -tspass changeit -ks sgconfig/kirk-keystore.jks -kspass changeit -cd sgconfig/ -icl -nhnv -h 192.168.0.90

其中IP地址就写当前节点的IP,官方解释为elasticsearch hostname,不知道这里为什么写另一个节点,就始终连不上去。包括解决防火墙等问题,均无法解决。

使用浏览器访问:http://192.168.0.203:9200/\_searchguard/sslinfo?pretty 提示输入密码,输入默认用户: admin admin ,可登陆表示正常。

三、配置kibana

1、修改 kibana.yml 参数

1[root@localhost kibana]# vim /etc/kibana/kibana.yml  2server.port: 5601 3server.host: "192.168.0.203" 4elasticsearch.url: "https://192.168.0.203:9200" 5elasticsearch.username: "kibanaserver"  6elasticsearch.password: "kibanaserver" 7elasticsearch.ssl.verify: false

2、修改kibana console插件参数,如果不修改,无法使用kibana console的功能。

1[root@SShan console]# pwd 2/home/sortec/kibana-5.2.1-linux-x86_64/src/core_plugins/console 3[root@SShan console]# vi index.js  4 5         ssl: { 6            verify: false 默认为:true 7          }

3、重启kibana,提示要求输入密码 admin admin

4、修改用户密码
   A、用户的密码保存在sg_internal_users.yml:
   B、用户的密码可用plugins/search-guard-2/tools/hash.sh生成。

   

   
四、完整配置KIBANA【官网要求】

参考:https://github.com/floragunncom/search-guard-docs/blob/master/kibana.md
1、下载searchguard-kibana-<version>-1.zip
墙内有阻挡,翻出去下载吧

wget https://github.com/floragunncom/search-guard-kibana-plugin/releases/download/v5.2.1-1/searchguard-kibana-5.2.1-1.zip

2、安装searchguard-kibana插件
安装过程与任何其他Kibana插件相同

1[root@SShan kibana-5.2.1-linux-x86_64]# bin/kibana-plugin install file:///home/sortec/package/searchguard-kibana-5.2.1-1.zip  2Attempting to transfer from file:///home/sortec/package/searchguard-kibana-5.2.1-1.zip 3Transferring 2068859 bytes.................... 4Transfer complete 5Retrieving metadata from plugin archive 6Extracting plugin archive 7Extraction complete 8Optimizing and caching browser bundles... 9Plugin installation complete 10[root@SShan kibana-5.2.1-linux-x86_64]# cd plugins/searchguard/ 11[root@SShan searchguard]# ls 12index.js  lib  node_modules  package.json  public

3、配置Search Guard Kibana插件
Search Guard Kibana插件为Kibana提供会话管理功能。如果尚未认证,则将用户重定向到登录页面。一旦验证,凭据将存储在用户浏览器的加密cookie中。
在kibana.yml中使用以下设置来配置插件:    
searchguard.basicauth.enabled: true
#布尔值,启用或禁用会话管理。
searchguard.cookie.secure:false
#布尔值,如果设置为true,Cookie仅在使用HTTPS时存储。默认值:false。
searchguard.cookie.name: 'searchguard_authentication'
#字符串,cookie的名称。默认值:'searchguard_authentication'
searchguard.cookie.password: 'searchguard_cookie_default_password'
#字符串,用于加密cookie的密钥。长度必须至少为32个字符。默认值:'searchguard_cookie_default_password'
searchguard.cookie.ttl: 1 hour
#整数,cookie的生命周期。可以为会话cookie设置为null。默认值:1小时
searchguard.session.ttl: 1 hour
#整数,会话的生命周期。如果设置,则在配置的时间后,系统将提示用户重新登录,而不管cookie是什么。默认值:1小时
searchguard.session.keepalive:true
#布尔值,如果设置为true,则searchguard.session.ttl每个请求会延长会话生命周期。默认值:true

注意:上面的这些配置,其实都有默认配置,实际是无需进行配置的,也就是即时不添加到kibana.yml中,kibana一样是按照上面配置工作的,可以在正常启动kibana后,通过查看浏览器获取的cookie名称获取到了searchguard_authentication,来验证。

4、配置Kibana server用户
Kibana在执行管理呼叫时内部使用特殊用户与Elasticsearch进行通话。
可以kibana.yml通过设置来配置Kibana服务器用户的用户名和密码:

1elasticsearch.username: "kibanaserver" 2elasticsearch.password: "jsdx_K****"

注意:当kibana链接ES时,首先需要取得ES状态,如果取得不了ES状态,或者取回状态为RED,这个时候kibana是不会正常工作的,即无法正常启动。yml文件中的这个密码,是首先向ES获取状态和基本信息的用户。

5、配置根CA

如果您在Elasticsearch上使用自己的根CA,则需要禁用证书的验证,或者将根CA和所有中间证书(如果有的话)提供给Kibana。
拷贝pem证书到kibana配置目录下:

1[root@soc ca]# pwd 2/home/sortec/elasticsearch-5.2.1/search-guard-ssl/test_ca/ca 3[root@soc ca]# scp root-ca.pem root@192.168.0.203:/home/sortec/kibana-5.2.1-linux-x86_64/config/

为了启用证书验证,请设置:

elasticsearch.ssl.verify: true

您还可以通过设置以PEM格式提供根CA:

elasticsearch.ssl.ca: "/path/to/your/root-ca.pem"

6、设置SSL / TLS(暂时不配)
如果您在Elasticsearch REST层使用TLS,则需要相应地配置Kibana。这在kibana.yml配置文件中完成。
只需将协议条目elasticsearch.url设置为https:

elasticsearch.url: "https://localhost:9200" 

Kibana对Elasticsearch的所有请求现在都使用HTTPS而不是HTTP。

7、配置kibana用户
配置kibana的登录用户,需要在ES的search guard里面,用sgadmin进行配置,这里基本需要关注三个文件:
sg_internal_users.yml:本地用户,定义用户密码;
sg_roles.yml:         角色权限,定义角色名称,及角色拥有的相关权限;
sg_roles_mapping.yml:  角色及用户映射关系,映射某个用户具备什么角色权限;
另外,还有sg_action_groups.yml: 权限名称及详细权限,无需修改;sg_config.yml:sgadmin主配置文件不需要做改动。
具体添加操作分为三步:
   7.1、添加本地用户
   调用plugins/search-guard-2/tools/hash.sh,生成密码对应的hash值。
   在sg_internal_users.yml中,添加用户及密码,密码用hash值,非明文信息。
   yangnz/Yangnz123  xiaos/ss123 weixy/wxy123
   7.2、添加用户-角色映射
   在sg_roles_mapping.yml中,在sg_kibana下面,将新增加用户添加到下面

1    sg_kibana: 2      users: 3        - weixy 4        - yangnz 5        - xiaos

   注:sg_kibana_server,是服务器用户角色;sg_kibana,是kibana的普通用户角色;
   7.3、执行sgadmin,更新操作
   tools/sgadmin.sh  -ts /home/sortec/elasticsearch-5.2.1/config/truststore.jks -tspass changeit -ks sgconfig/kirk-keystore.jks -kspass changeit -cd sgconfig/ -icl -nhnv -h 192.168.0.90
   7.4、kibana登录验证
   打开http://192.168.0.203:5601/,输入账号密码,登录成功,就OK了
 

五、配置logstash

参考:https://github.com/floragunncom/search-guard-docs/blob/master/logstash.md
1、配置logstash的用户信息
这个过程类似于上一张,为了kibana配置用户,基本一样的
    第一步:配置用户
 

1  [root@soc sgconfig]# pwd 2    /home/sortec/elasticsearch-5.2.1/plugins/search-guard-5/sgconfig 3    [root@soc sgconfig]# cat sg_internal_users.yml 4     logstash: 5      hash: $2a$12$geoZcZwk.3KSp9ObYnElwOQLT6bj57olH9pBGOOvt/H4BpsPTxfma 6      #password is: sortec_Ls123

    第二步:关联角色
 

1   [root@soc sgconfig]# cat sg_roles_mapping.yml  2    sg_logstash: 3      users: 4        - logstash

    第三步:设置角色权限
   

1 [root@soc sgconfig]# cat sg_roles.yml  2    sg_logstash: 3      cluster: 4        - indices:admin/template/get 5        - indices:admin/template/put 6        - CLUSTER_MONITOR 7        - CLUSTER_COMPOSITE_OPS 8      indices: 9        'logstash*': 10          '*': 11            - CRUD 12            - CREATE_INDEX 13        'ls-scurity-*': 14          '*': 15            - CRUD 16            - CREATE_INDEX 17        '*beat*': 18          '*': 19            - CRUD 20            - CREATE_INDEX

  
2、配置原则
从Elasticsearch / Search Guard的角度来看,logstash只是一个HTTP客户端,就像curl或浏览器:Logstash通过REST API连接到Elasticsearch,创建索引并从这些索引读取和写入文档。因此,为了将Search Guard与logstash结合使用,您只需执行以下步骤:
    将logstash配置为使用HTTPS而不是HTTP
    如果要验证服务器证书(可选,但建议),则需要提供包含根CA的密钥库的路径
    配置logstash用户名和密码
    当与Elasticsearch通话时,logstash使用此用户名和密码来识别自己
    在Search Guard配置中设置logstash用户及其权限
    您可以使用Search Guard附带的示例配置文件快速启动

3、配置证书
如果您希望logstash验证从Elasticsearch / Search Guard返回的证书(可选,但推荐),则需要在这里将sgadmin生成的CA根证书取过来。
通常情况下,只需要放置被用在生成信用库truststore.jks文件的ROOT CA证书。4、配置logstash

1output { 2    elasticsearch { 3    …… 4        user => logstash 5        password => sortec_Ls123 6        ssl => false 7        ssl_certificate_verification => true 8        truststore => "/home/sortec/logstash-5.2.1/config/truststore.jks" 9        truststore_password => changeit 10 11    } 12}

其中ssl => false  设置ssl为true可确保logstash使用HTTPS,但如果es尚未配置使用ssl,则不要设置为true。

四、遗留问题

javaclient,如何访问ES

这个问题试了一天,始终没有成功,由于时间紧张,只能暂时放弃了。如果有成功了,欢迎留下方法哦。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )