search-guard+elastic+kibana+filebeat
(search-guard还有一种用脚本生成的,install_demo_configuration.sh)
(证书生成方式:离线生成;证书有效期:默认10年)
可查看:https://www.jianshu.com/p/42e278c3b1bf
https://blog.csdn.net/weixin_44094720/article/details/110044964
https://www.cnblogs.com/minseo/p/10576126.html
本次是针对 elasticsearch的6.6.1版本做search-guard的https加固
es的6.8以后的版本才有免费的X-pack所有针对 es-6.6.1采取search-guard证书加固
准备:
下载与es相对的版本的search-guard的版本
search-guard-tlstools-1.6.tar.gz
search-guard-kibana-plugin-6-6.6.0-19.0.zip
search-guard-6-6.6.1-25.5.zip
https://repo1.maven.org/maven2/com/floragunn/search-guard-tlstool/1.6/search-guard-tlstool-1.6.tar.gz
https://maven.search-guard.com/search-guard-kibana-plugin-release/com/floragunn/search-guard-kibana-plugin-6/6.6.0-19.0/search-guard-kibana-plugin-6-6.6.0-19.0.zip
https://maven.search-guard.com/search-guard-release/com/floragunn/search-guard-6/6.6.1-25.5/search-guard-6-6.6.1-25.5.zip
[elkuser@node1 ~]$ ll /opt/
总用量 350296
-rw-r--r--. 1 root root 114126547 3月 3 23:36 elasticsearch-6.6.1.tar.gz
-rw-r--r--. 1 root root 10645858 3月 3 23:36 filebeat-6.4.3-linux-x86_64.tar.gz
-rw-r--r--. 1 root root 180675854 3月 3 23:36 kibana-6.6.1-linux-x86_64.tar.gz
-rw-r--r--. 1 root root 28209170 3月 3 23:36 search-guard-6-6.6.1-25.5.zip
-rw-r--r--. 1 root root 1060227 3月 3 23:36 search-guard-kibana-plugin-6-6.6.1-19.0.zip
-rw-r--r--. 1 root root 11786240 3月 3 23:36 search-guard-tlstool-1.6.tar.gz
查看当前的状态:
[elkuser@node1 elasticsearch-6.6.1]$ curl '192.168.40.195:9200/_cat/nodes?v'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.40.195 29 65 1 0.03 0.02 0.10 mdi - node1
192.168.40.196 58 63 1 0.00 0.01 0.05 mdi * node2
192.168.40.197 68 63 0 0.02 0.02 0.05 mdi - node3
1,关闭分片分配(可选)
每个节点执行如下命令:
此步骤是可选的,但建议特别适用于具有大量数据的大型集群。此步骤可确保在重新启动集群时分片不会移动,从而导致大量 I/O。参见 https://www.elastic.co/guide/en/elasticsearch/reference/current/shards-allocation.html,https://blog.51cto.com/u_12064820/3036442,https://www.jianshu.com/p/ade34a657b3b,https://blog.csdn.net/huanglu0314/article/details/126652915
curl -Ss -XPUT 'http://{192.168.40.195}:9200/_cluster/settings?pretty' -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.routing.allocation.enable": "none"
}
}
'
返回:
{ "acknowledged" : true, "persistent" : { "cluster" : { "routing" : { "allocation" : { "enable" : "none" } } } }, "transient" : { } }
2,离线安装search guard插件
2.1 copy安装包
[elkuser@node1 elasticsearch-6.6.1]$ cp /opt/search-guard-* .
[elkuser@node1 elasticsearch-6.6.1]$ ll search-guard-*
-rw-r--r--. 1 elkuser elkuser 28209170 3月 8 22:56 search-guard-6-6.6.1-25.5.zip -rw-r--r--. 1 elkuser elkuser 1060227 3月 8 22:56 search-guard-kibana-plugin-6-6.6.1-19.0.zip -rw-r--r--. 1 elkuser elkuser 11786240 3月 8 22:56 search-guard-tlstool-1.6.tar.gz
2.2安装search guard-es的插件
(./bin/elasticsearch-plugin install是安装, list是列出来,remove是卸载)
-
[elkuser@node1 elasticsearch-6.6.1]$ ./bin/elasticsearch-plugin install -b file:///elasticsearch/elasticsearch-6.6.1/search-guard-6-6.6.1-25.5.zip
-> Downloading file:///elasticsearch/elasticsearch-6.6.1/search-guard-6-6.6.1-25.5.zip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-
java.io.FilePermission /proc/sys/net/core/somaxconn read
-
… …
-
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-6
2.3 解压tlstool 工具
[elkuser@node1 elasticsearch-6.6.1]$ mkdir tlstool [elkuser@node1 elasticsearch-6.6.1]$ tar -xf search-guard-tlstool-1.6.tar.gz -C tlstool [elkuser@node1 elasticsearch-6.6.1]$ ls tlstool
config deps tools
2.4 生成 my.yml
https://blog.csdn.net/wangkai_123456/article/details/95938714/
https://www.cnblogs.com/bainianminguo/p/12584880.html
[elkuser@node1 elasticsearch-6.6.1]$ ls tlstool
config deps tools
[elkuser@node1 elasticsearch-6.6.1]$ cp tlstool/config/example.yml tlstool/config/my.yml
[elkuser@node1 elasticsearch-6.6.1]$ cat tlstool/config/my.yml | grep -vE "^$|#"
-
2.5 根据 my.yml 生成证书
[elkuser@node1 elasticsearch-6.6.1]$ ./tlstool/tools/sgtlstool.sh -c tlstool/config/my.yml -ca -crt
此时生成一个out目录里面有所有的证书:
2.6 cp生成的证书文件到es的config目录下:
[elkuser@node1 elasticsearch-6.6.1]$ cp -ar out/* config/
[elkuser@node1 elasticsearch-6.6.1]$ chmod +x plugins/search-guard-6/tools/*.sh
[elkuser@node1 elasticsearch-6.6.1]$ chmod +x tlstool/tools/*.sh
2.7 验证证书:
[elkuser@node1 ~]$ /elasticsearch/elasticsearch-6.6.1/tlstool/tools/sgtlsdiag.sh \
-ca /elasticsearch/elasticsearch-6.6.1/config/root-ca.pem \
-crt /elasticsearch/elasticsearch-6.6.1/config/node1.pem
2.8,Elasticsearch TLS配置
将 out下生成的 证书scp到其他节点。
[elkuser@node1 elasticsearch-6.6.1]$ scp -r ./out/* root@node2:/elasticsearch/elasticsearch-6.6.1/config/^C
[elkuser@node1 elasticsearch-6.6.1]$ scp -r ./out/* root@node3:/elasticsearch/elasticsearch-6.6.1/config/
将node1_elasticsearch_config_snippet.yml 文件中内容新增配置到node1节点
[elkuser@node1 elasticsearch-6.6.1]$ cat config/node1_elasticsearch_config_snippet.yml
将node2_elasticsearch_config_snippet.yml 文件中内容新增配置到node2节点,注意密码要一致
将node3_elasticsearch_config_snippet.yml 文件中内容新增配置到node3节点,注意密码要一致
除上面之外,再加上几条配置:
searchguard.restapi.roles_enabled: [“sg_all_access”] #要使用REST管理API,请配置应具有API访问权限的Search Guard角色。以下条目授予对该角色的API的完全访问权限SGS_ALL_ACCESS
searchguard.nodes_dn:
-
CN=node1.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
-
CN=node2.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
-
CN=node3.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
xpack.security.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: "Authorization,X-Requested-With,Content-Length,Content-Type"
copy 证书到plugin下的tools
cp config/root-ca.pem plugins/search-guard-6/tools/ cp config/kirk.* plugins/search-guard-6/tools/ chmod +x ./plugins/search-guard-6/tools/*.sh
2.9 检验配置文件:
[elkuser@node1 elasticsearch-6.6.1]$ ./tlstool/tools/sgtlsdiag.sh -es ./config/elasticsearch.yml
2.10 用hash.sh生成密码:
[elkuser@node1 elasticsearch-6.6.1]$ ./plugins/search-guard-6/tools/hash.sh -p 123qqqAAA...
WARNING: JAVA_HOME not set, will use /bin/java
$2y$12$jhgXzMJGbOKJUSxR3kaw6OXrq4Lu70.ovyQ5lWA/2os4mNGq6TR1a
将用tools/hash.sh生成的密码的hash值,$2y 12 12 12jhgXzMJGbOKJUSxR3kaw6OXrq4Lu70.ovyQ5lWA/2os4mNGq6TR1a替换到
plugins/search-guard-6/sgconfig/sg_internal_users.yml 的admin下的hash值里
如果想修改 admin 变成elastic 直接修改sg_internal_users.yml的admin==>改成elastic,并且要初始化。并且对应的filebeat的账号配置也要修改。
并且记录 vim config/client-certificates.readme里的 kirk的密码,一会启动时使用
修改sg_roles.yml配置:由于我们的索引名是自己定义过的,所以默认情况下logstash用户名对非logstash 或beat开头的索引只有只读权限,所以我们需要修改。
vim +159 plugins/search-guard-6/sgconfig/sg_roles.yml
重启 所有节点。
ps -ef | grep elastic; kill -9 pid; ./bin/elasticsearch -d
2.11 初始化:
(所有节点都需要输入命令)
cd ./plugins/search-guard-6/
./tools/sgadmin.sh -esa -icl -nhnv -cert ../../config/kirk.pem -key ../../config/kirk.key -cacert ../../config/root-ca.pem -h 192.168.40.195 -keypass 6Bw7XCrUOH2J
(不同的节点的 -h 后的ip是不一样 的)
只在一个节点输入即可:
cd /elasticsearch/elasticsearch-6.6.1
./plugins/search-guard-6/tools/sgadmin.sh -cd ./plugins/search-guard-6/sgconfig/ -icl -nhnv -cacert config/root-ca.pem -cert config/kirk.pem -key config/kirk.key -h 192.168.40.195 -keypass 6Bw7XCrUOH2J
在浏览器head插件验证:
http://192.168.40.195:9200查看集群状态
[elkuser@node1 elasticsearch-6.6.1]$ curl -u elastic:123qqqAAA… --insecure -XGET ‘https://es1:9200/_cluster/settings?pretty’
验证下是否开启分片分配:
curl -u elastic:123qqqAAA… --insecure -XGET 'https://es1:9200/_cluster/settings?pretty’验证看persistent和transient的cluster.routing.allocation.enable是不是 all 如果是就是开启了。
手动命令开启:
curl -Ss -XPUT ‘http://{192.168.40.195}:9200/_cluster/settings?pretty’ \
-H ‘Content-Type: application/json’ -d’
{
“persistent”: {
“cluster.routing.allocation.enable”: “true”
}
}
’
3 kibana配置:
3.1 运行kibana的search-guard插件
./bin/kibana-plugin install file:///root/kibana-6.6.1-linux-x86_64/search-guard-kibana-plugin-6-6.6.1-19.0.zip
Plugin installation complete 需要等一小段时间才会出现,耐心等待。。
3.2 copy证书改配置
将es集群config下的 root-ca.pem scp到kibana的 config下
再将下面的 配置改成这样
server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["https://192.168.40.195:9200","https://192.168.40.196:9200","https://192.168.40.197:9200"] elasticsearch.username: "kibanaserver" #配置用户名 elasticsearch.password: "kibanaserver" #配置密码 elasticsearch.ssl.certificateAuthorities: [ "/root/kibana-6.6.1-linux-x86_64/config/root-ca.pem" ] elasticsearch.ssl.verificationMode: certificate #关闭证书验证 xpack.security.enabled: false #关闭x-apck插件 xpack.reporting.enabled: false
重启 kibana。
[root@kibana kibana-6.6.1-linux-x86_64]# nohup ./bin/kibana >> nohup.out 2>&1 &
[1] 29330
如果配置都正确的话,起来也很快,如果有点小问题,遇到kibana not ready yet 稍微等长一点时间也可以出来。
3.3 从浏览器 https访问kibana
前面所描述的是Kibana从es读取数据的过程,从HTTP升级到了HTTPS。
但是从浏览器到Kibana的过程仍然是HTTP。下面介绍的是通过修改kibana.yml将浏览器访问Kibana从HTTP升级到HTTPS。
生成密钥对:(用来l浏览器访问https://kibana)
openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 3650 -out server.crt -subj “/C=CN/ST=beijing/L=beijing/O=chinamobile/OU=wlyx/”
其中:CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码
[root@kibana kibana-6.6.1-linux-x86_64]# openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 3650 -out server.crt -subj "/C=CN/ST=zhejiang/L=hangzhou/O=yuno/OU=rjyw/"
Generating a 2048 bit RSA private key ......................+++ ..............................................+++
writing new private key to 'server.key
[root@kibana kibana-6.6.1-linux-x86_64]# mv server.crt config/
[root@kibana kibana-6.6.1-linux-x86_64]# mv server.key config/
修改配置文件:加上一下三行:
server.ssl.enabled: true
server.ssl.certificate: config/server.crt
server.ssl.key: config/server.key
4 filebeat配置:
(关于filebeat的配置可参考 https://blog.csdn.net/hanjinjuan/article/details/122847743)
4.1修改配置
将 root-ca.pem scp到 filebeat配置下
重启filebeat 观察 传到es的日志:
[root@filebeat filebeat-6.4.3-linux-x86_64]# nohup ./filebeat -e -c filebeat.yml >> nohup.out 2>&1 &
以前错误的时候是:
现在是:
在filebeat上 cp一份 数据到 /home/data (input)下
再在 kibana上观察数据
5 小结:
elasticsearch的单机版的问题处理:
https://www.itym.cn/post/1012.html
curl的使用:
curl查询es集群状态
https://blog.csdn.net/icanlove/article/details/125636857
https://blog.csdn.net/weixin_45717886/article/details/124192358
curl http://192.168.40.195:9200/_cat/health?v
curl ‘192.168.40.195:9200/_cat/nodes?v’
curl 访问 https
curl + --insecure -u elastic:123qqqAAA… ‘https://{node1ip:9200}’
curl --insecure -X GET ‘https://192.168.40.195:9200’ --cacert ‘/root/search-guard-certificates/root-ca.pem’ --user elastic:123qqqAAA…
curl -u elastic:123qqqAAA… --insecure ‘https://192.168.40.195:9200/_cat/indices?v’
curl -u elastic:123qqqAAA… --insecure ‘https://192.168.40.195:9200/_cat/nodes?v’
6 多实例 elasticsearch
6.1 修改配置:
6.1.1,同一台机器上多实例 使用同一个证书
比如是 已经搭好的集群修改成多实例,同样的一台机子,第二个路径下的es节点命名 node1-1
如果是第二节点就是 node2-2,端口是9201和9301。
6.1.1.1 修改配置:
原来的配置:
现在的配置:
注意:需要一台一台的 改。
6.1.1.2 步骤:
cp -ar /elasticsearch/elasticsearch-6.6.1/ /elasticsearch/elasticsearch-6.6.1-1
vim /elasticsearch/elasticsearch-6.6.1/config/elasticsearch.yml
将node1 改成node1-1 如图:
6.1.1.3 然后重启:
[elkuser@node1 elasticsearch-6.6.1-1]$ ./bin/elasticsearch -d
6.1.1.4 初始化:
cd ./plugins/search-guard-6/
./tools/sgadmin.sh -esa -icl -nhnv -cert ../../config/kirk.pem -key ../../config/kirk.key -cacert ../../config/root-ca.pem -h 192.168.40.195 -keypass 6Bw7XCrUOH2J
6.1.1.5 curl查看集群状态
[elkuser@node1 elasticsearch-6.6.1-1]$ curl --insecure 'https://192.168.40.195:9200/_cat/nodes?v' -u elastic:123qqqAAA...
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.40.195 55 92 3 0.41 0.14 0.13 mdi * node1
192.168.40.195 78 92 3 0.41 0.14 0.13 di - node1-1
192.168.40.196 45 93 2 0.00 0.03 0.17 di - node2
`192.168.40.197 80 94 2 0.00 0.05 0.27 mdi - node3
如此一台一台的添加:
再在 一台机器上输入:
cd /elasticsearch/elasticsearch-6.6.1
./plugins/search-guard-6/tools/sgadmin.sh -cd ./plugins/search-guard-6/sgconfig/ -icl -nhnv -cacert config/root-ca.pem -cert config/kirk.pem -key config/kirk.key -h 192.168.40.195 -keypass 6Bw7XCrUOH2J
6.1.2,同一台机器上多实例分别使用不同的证书
这个应该是在 做my.yml的时候就把节点名字都写入my.yml然后在生成 out下的 证书,在根据证书来用search-guard加固,同上面的加证书一样,每一个节点都有不一样的证书和密码。