您的位置:首页 > 编程语言 > Java开发

ElasticSearch通过searchguard实现安全传输

2017-03-30 00:00 357 查看
摘要: 个人目前了解,要想实现ES的认证等方面的安全性功能,目前基本上可供考虑的有三个方面,X-PACK官方的插件,但是要收费; 然后就是利用nginx http basic authentication 和 nginx SSL或者 search-guard这几个小项目来实现。经过一些查阅和比较,最后还是决定用searchguard,这是github上面的一个小项目,并且得到了持续的更新,基本只比es的版本晚一个小版本,所以还是很不错的。


背景

一、相关下载地址:

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的集群状况

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


二、安装配置 elasticsearch plugin search-guard

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

[rsortec@soc elasticsearch-5.2.1]# pwd
/home/sortec/elasticsearch-5.2.1
[sortec@soc elasticsearch-5.2.1]#   bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.2.1-11
-> Downloading com.floragunn:search-guard-5:5.2.1-11 from maven central
[=================================================] 100%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessClassInPackage.sun.misc
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission loadLibrary.*
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission shutdownHooks
* java.lang.reflect.ReflectPermission suppressAccessChecks
* java.security.SecurityPermission getProperty.ssl.KeyManagerFactory.algorithm
* java.util.PropertyPermission java.security.debug write
* java.util.PropertyPermission java.security.krb5.conf write
* java.util.PropertyPermission javax.security.auth.useSubjectCredsOnly write
* java.util.PropertyPermission sun.security.krb5.debug write
* java.util.PropertyPermission sun.security.spnego.debug write
* javax.security.auth.AuthPermission doAs
* javax.security.auth.AuthPermission modifyPrivateCredentials
* javax.security.auth.kerberos.ServicePermission * accept
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html for descriptions of what these permissions allow and the associated risks.
-> Installed search-guard-5


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

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

[root@soc elasticsearch-5.2.1]#  git clone https://github.com/floragunncom/search-guard-ssl.git 正克隆到 'search-guard-ssl'...
remote: Counting objects: 5432, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 5432 (delta 0), reused 0 (delta 0), pack-reused 5429
接收对象中: 100% (5432/5432), 1.15 MiB | 60.00 KiB/s, done.
处理 delta 中: 100% (2561/2561), done.
检查连接... 完成。
[root@soc elasticsearch-5.2.1]# cd search-guard-ssl/
[root@soc search-guard-ssl]# cd ..
[root@soc elasticsearch-5.2.1]# ls
bin  config  lib  LICENSE.txt  logs  modules  NOTICE.txt  plugins  README.textile  search-guard-ssl
[root@soc elasticsearch-5.2.1]# cd search-guard-ssl/example-pki-scripts/
[root@soc example-pki-scripts]# ls
clean.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结点

[root@localhost example-pki-scripts]# cat example.sh
#!/bin/bash
set -e
./clean.sh
./gen_root_ca.sh capass changeit
./gen_node_cert.sh 90 changeit capass && ./gen_node_cert.sh 203 changeit capass &&  ./gen_node_cert.sh 2 changeit capass
./gen_client_node_cert.sh spock changeit capass
./gen_client_node_cert.sh kirk changeit capass

[root@localhost example-pki-scripts]# ./example.sh

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

[root@soc example-pki-scripts]# ls
ca                        kirk.csr               node-2.key.pem        node-90-keystore.p12
certs                     kirk.key.pem           node-2-keystore.jks   node-90-signed.pem
clean.sh                  kirk-keystore.jks      node-2-keystore.p12   spock.all.pem
crl                       kirk-keystore.p12      node-2-signed.pem     spock.crtfull.pem
etc                       kirk-signed.pem        node-4.crt.pem        spock.crt.pem
example.sh                node-203.crt.pem       node-4.csr            spock.csr
gen_client_node_cert.sh   node-203.csr           node-4.key            spock.key.pem
gen_node_cert_openssl.sh  node-203.key.pem       node-4.p12            spock-keystore.jks
gen_node_cert.sh          node-203-keystore.jks  node-4-signed.pem     spock-keystore.p12
gen_root_ca.sh            node-203-keystore.p12  node-90.crt.pem       spock-signed.pem
kirk.all.pem              node-203-signed.pem    node-90.csr           truststore.jks
kirk.crtfull.pem          node-2.crt.pem         node-90.key.pem
kirk.crt.pem              node-2.csr             node-90-keystore.jks
[root@soc example-pki-scripts]# su - sortec
[sortec@soc example-pki-scripts]# cp node-90-keystore.jks truststore.jks /home/sortec/elasticsearch-5.2.1/config/
[root@soc example-pki-scripts]#
[root@soc example-pki-scripts]# scp node-203-keystore.jks truststore.jks sortec@192.168.0.203:/home/sortec/elasticsearch-5.2.1/config/
root@192.168.0.203's password:
node-203-keystore.jks                                             100% 4498     4.4KB/s   00:00
truststore.jks                                                    100% 1096     1.1KB/s   00:00
[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

[root@soc config]# cat elasticsearch.yml
……
searchguard.ssl.transport.enabled:true
searchguard.ssl.transport.keystore_filepath: node-90-keystore.jks
searchguard.ssl.transport.keystore_password: changeit
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: changeit
searchguard.ssl.transport.enforce_hostname_verification: false

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

[root@SShan logs]# tail -f /home/sortec/elasticsearch-5.2.1/logs/Test.log
[2017-03-24T16:17:55,138][ERROR][c.f.s.a.BackendRegistry  ] Not yet initialized (you may need to run sgadmin)
[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证书

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

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

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


重启ES集群

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

初始化 Search Guard 索引

[root@soc search-guard-5]# pwd
/home/sortec/elasticsearch-5.2.1/plugins/search-guard-5
[root@soc search-guard-5]# ll
总用量 5180
-rw-r--r-- 1 sortec sortec   52988 3月  12 19:34 commons-cli-1.3.1.jar
-rw-r--r-- 1 sortec sortec 2308517 3月  12 19:34 guava-19.0.jar
-rw-r--r-- 1 sortec sortec  258913 3月  12 19:34 netty-buffer-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec  307959 3月  12 19:34 netty-codec-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec  544879 3月  12 19:34 netty-codec-http-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec  685698 3月  12 19:34 netty-common-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec  326931 3月  12 19:34 netty-handler-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec   29214 3月  12 19:34 netty-resolver-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec  426864 3月  12 19:34 netty-transport-4.1.7.Final.jar
-rw-r--r-- 1 sortec sortec     935 3月  12 19:34 plugin-descriptor.properties
-rw-r--r-- 1 sortec sortec    2111 3月  12 19:34 plugin-security.policy
-rw-r--r-- 1 sortec sortec  184592 3月  12 19:34 search-guard-5-5.2.1-11.jar
-rw-r--r-- 1 sortec sortec   55857 3月  12 19:34 search-guard-ssl-5.2.1-20.jar
drwxrwxr-x 2 sortec sortec    4096 3月  12 19:35 sgconfig
drwxrwxr-x 2 sortec sortec    4096 3月  12 19:34 tools
-rw-r--r-- 1 sortec sortec   75372 3月  12 19:34 transport-netty4-client-5.2.1.jar
[root@soc search-guard-5]# chmod +x /home/sortec/elasticsearch-5.2.1/plugins/search-guard-2/tools/sgadmin.sh
[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 参数

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

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

[root@SShan console]# pwd
/home/sortec/kibana-5.2.1-linux-x86_64/src/core_plugins/console
[root@SShan console]# vi index.js

ssl: {
verify: false 默认为:true
}

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[/code] 2、安装searchguard-kibana插件
安装过程与任何其他Kibana插件相同

[root@SShan kibana-5.2.1-linux-x86_64]# bin/kibana-plugin install file:///home/sortec/package/searchguard-kibana-5.2.1-1.zip
Attempting to transfer from file:///home/sortec/package/searchguard-kibana-5.2.1-1.zip
Transferring 2068859 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete
[root@SShan kibana-5.2.1-linux-x86_64]# cd plugins/searchguard/
[root@SShan searchguard]# ls
index.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服务器用户的用户名和密码:

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


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

5、配置根CA

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

[root@soc ca]# pwd
/home/sortec/elasticsearch-5.2.1/search-guard-ssl/test_ca/ca
[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下面,将新增加用户添加到下面

sg_kibana:
users:
- weixy
- yangnz
- 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配置用户,基本一样的
第一步:配置用户

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


第二步:关联角色

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


第三步:设置角色权限

[root@soc sgconfig]# cat sg_roles.yml
sg_logstash:
cluster:
- indices:admin/template/get
- indices:admin/template/put
- CLUSTER_MONITOR
- CLUSTER_COMPOSITE_OPS
indices:
'logstash*':
'*':
- CRUD
- CREATE_INDEX
'ls-scurity-*':
'*':
- CRUD
- CREATE_INDEX
'*beat*':
'*':
- CRUD
- 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

output {
elasticsearch {
……
user => logstash
password => sortec_Ls123
ssl => false
ssl_certificate_verification => true
truststore => "/home/sortec/logstash-5.2.1/config/truststore.jks"
truststore_password => changeit

}
}


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

四、遗留问题

javaclient,如何访问ES

这个问题试了一天,始终没有成功,由于时间紧张,只能暂时放弃了。如果有成功了,欢迎留下方法哦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息