基于公司需要搭建一套ELK日志管理系统,发现ELK安装后,ElasticSearch和kibana都是可以直接通过无密码访问的,这对于生产环境是及其不安全的,公司内部人员,没有权限划分,也是十分的不方便。而ELK的安全认证工具有很多,例如x-pack、shield等都是官方推荐的,但是要收钱,在免费的工具中,选择了Search Guard。本文主要讲ELK与Search Guard的集成,ELK的搭建不做说明。
版本说明:
ElasticSearch:6.7.2
kibana:6.7.2
logstash:6.7.2
Search Guard6-6.7.2 官网下载地址:https://docs.search-guard.com/6.x-25/search-guard-versions
ELK的三大组件以及Search Guard的版本最好是一样的,否则可能会出现兼容性等问题。
1、离线生成Search Guard证书
(1)下载离线TSL工具
官网下载地址:https://search.maven.org/search?q=g:com.floragunn%20AND%20a:search-guard-tlstool&core=gav
下载版本:search-guard-tlstool-1.6.tar.gz
(2)上传下载的压缩文件至服务器,我是放在/app目录下的
(3)修改配置文件
解压文件到指定目录 # tar -zxvf search-guard-tlstool-1.6.tar.gz -C /app/search-guard-tlstool
编辑example.yml文件 # vim /app/search-guard-tlstool/config/example.yml
要为所有证书配置根CA,请将以下行添加到配置文件中:
ca:
root:
dn: CN=root.ca.example.com,OU=CA,O=Example Com\, Inc.,DC=example,DC=com
keysize: 2048
pkPassword: root-ca-password
validityDays: 3650
file: root-ca.pem
除了根CA之外,您还可以选择指定中间CA. 如果配置了中间CA,则中间CA将对节点,管理员和客户端证书进行签名。如果您确实要使用中间CA,请从配置中删除以下部分。然后由根CA直接签署证书。
ca:
intermediate:
dn: CN=signing.ca.example.com,OU=CA,O=Example Com\, Inc.,DC=example,DC=com
keysize: 2048
validityDays: 3650
pkPassword: intermediate-ca-password
file: intermediate-ca.pem
默认设置适用于所有生成的证书和配置片段。此处的所有值都是可选的。
defaults:
validityDays: 3650
pkPassword: auto
generatedPasswordLength: 12
nodesDn:
- "CN=*.example.com,OU=Ops,O=Example Com\\, Inc.,DC=example,DC=com"
nodeOid: "1.2.3.4.5.5"
httpsEnabled: true
reuseTransportCertificatesForHttp: false
要生成节点证书,请在以下部分中添加节点名称,专有名称,主机名和/或IP地址nodes
:
nodes:
- name: es-cluster.node1.com
dn: CN=es-cluster.node1.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
dns: es-cluster.node1.com
ip: 192.168.2.100(对应的真实ip)
- name: es-cluster.node2.com
dn: CN=es-cluster.node2.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
dns: es-cluster.node2.com
ip: 192.168.2.101(对应的真实ip)
- name: es-cluster.node3.com
dn: CN=es-cluster.node3.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
dns: es-cluster.node3.com
ip: 192.168.2.102(对应的真实ip)
要生成管理员和客户端证书,请将以下行添加到配置文件中:
clients:
- name: spock
dn: CN=spock.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
- name: kirk
dn: CN=kirk.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
admin: true
(4)生成证书
[root@elk-es1 /]# cd /app/search-guard-tlstool/
[root@elk-es1 search-guard-tlstool]# tools/sgtlstool.sh -c config/example.yml -ca -crt
从中读取配置../config/tlsconfig.yml
并一次生成配置的根和中间CA以及配置的节点,管理员和客户端证书。生成的文件将被写入out
。
[root@elk-es1 search-guard-tlstool]# cd tools/
[root@elk-es1 tools]# ll
total 20
drwxr-xr-x. 2 root root 4096 Jul 4 10:39 out
-rwxr-xr-x. 1 501 games 153 Dec 30 2018 sgtlsdiag.bat
-rwxr-xr-x. 1 501 games 339 Dec 30 2018 sgtlsdiag.sh
-rwxr-xr-x. 1 501 games 148 Dec 30 2018 sgtlstool.bat
-rwxr-xr-x. 1 501 games 334 Dec 30 2018 sgtlstool.sh
2、安装Search Guard
安装search guard插件是在已安装elasticsearch的前提下。
在线安装search guard插件
bin/elasticsearch-plugin install -b com.floragunn:search-guard-6:
离线安装search guard插件
bin/elasticsearch-plugin install -b file:///path/to/search-guard-6-
(1)本文使用的是离线安装
[root@localhost /]# cd /app/elasticsearch-6.7.2
[root@localhost elasticsearch-6.7.2]# ./bin/elasticsearch-plugin install -b file:///app/search-guard-6-6.7.2-25.1.zip
安装Search Guard时,您将看到以下警告消息。
-> Downloading file:///app/search-guard-6-6.7.2-25.1.zip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.io.FilePermission /proc/sys/net/core/somaxconn read
* java.lang.RuntimePermission accessClassInPackage.com.sun.jndi.ldap
* java.lang.RuntimePermission accessClassInPackage.sun.misc
* java.lang.RuntimePermission accessClassInPackage.sun.nio.ch
* java.lang.RuntimePermission accessClassInPackage.sun.security.x509
* java.lang.RuntimePermission accessDeclaredMembers
* java.lang.RuntimePermission accessUserInformation
* java.lang.RuntimePermission createClassLoader
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission shutdownHooks
* java.lang.reflect.ReflectPermission suppressAccessChecks
* java.net.NetPermission getNetworkInformation
* java.net.NetPermission getProxySelector
* java.net.SocketPermission * connect,accept,resolve
* java.security.SecurityPermission getProperty.ssl.KeyManagerFactory.algorithm
* java.security.SecurityPermission insertProvider.BC
* java.security.SecurityPermission org.apache.xml.security.register
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setProperty.ocsp.enable
* java.util.PropertyPermission * read,write
* java.util.PropertyPermission org.apache.xml.security.ignoreLineBreaks 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-6
(2)将生成的证书复制到es的config中
[root@elk-es1 /]# cp -ar /app/search-guard-tlstool/tools/out/ /app/elasticsearch-6.7.2/config/out
(3)在elasticsearch.yml中添加TLS配置
[root@elk-es1 config]# cd out
[root@elk-es1 out]# ll
total 96
-rw-r--r--. 1 root root 473 Jul 4 10:39 client-certificates.readme
-rw-r--r--. 1 root root 1446 Jul 3 18:25 es-cluster.node1.com_elasticsearch_config_snippet.yml
-rw-r--r--. 1 root root 1801 Jul 3 18:25 es-cluster.node1.com_http.key
-rw-r--r--. 1 root root 3217 Jul 3 18:25 es-cluster.node1.com_http.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 es-cluster.node1.com.key
-rw-r--r--. 1 root root 3217 Jul 3 18:25 es-cluster.node1.com.pem
-rw-r--r--. 1 root root 1446 Jul 4 09:18 es-cluster.node2.com_elasticsearch_config_snippet.yml
-rw-r--r--. 1 root root 1801 Jul 3 18:25 es-cluster.node2.com_http.key
-rw-r--r--. 1 root root 3217 Jul 3 18:25 es-cluster.node2.com_http.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 es-cluster.node2.com.key
-rw-r--r--. 1 root root 3217 Jul 3 18:25 es-cluster.node2.com.pem
-rw-r--r--. 1 root root 1446 Jul 3 18:25 es-cluster.node3.com_elasticsearch_config_snippet.yml
-rw-r--r--. 1 root root 1801 Jul 3 18:25 es-cluster.node3.com_http.key
-rw-r--r--. 1 root root 3217 Jul 3 18:25 es-cluster.node3.com_http.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 es-cluster.node3.com.key
-rw-r--r--. 1 root root 3217 Jul 3 18:25 es-cluster.node3.com.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 intermediate-ca.key
-rw-r--r--. 1 root root 1558 Jul 3 18:25 intermediate-ca.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 kirk.key
-rw-r--r--. 1 root root 3144 Jul 3 18:25 kirk.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 root-ca.key
-rw-r--r--. 1 root root 1371 Jul 3 18:25 root-ca.pem
-rw-r--r--. 1 root root 1801 Jul 3 18:25 spock.key
-rw-r--r--. 1 root root 3144 Jul 3 18:25 spock.pem
将上面三个标红文件的信息,分别添加到对应的es节点的elasticsearch.yml文件中(以下是es-cluster.node1.com的配置)
searchguard.ssl.transport.pemcert_filepath: out/es-cluster.node1.com.pem
searchguard.ssl.transport.pemkey_filepath: out/es-cluster.node1.com.key
searchguard.ssl.transport.pemkey_password: xxxxxxxxxx(填入自己生成的密码)
searchguard.ssl.transport.pemtrustedcas_filepath: out/root-ca.pem
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
searchguard.ssl.http.enabled: true
searchguard.ssl.http.pemcert_filepath: out/es-cluster.node1.com_http.pem
searchguard.ssl.http.pemkey_filepath: out/es-cluster.node1.com_http.key
searchguard.ssl.http.pemkey_password: xxxxxxxxxx(填入自己生成的密码)
searchguard.ssl.http.pemtrustedcas_filepath: out/root-ca.pem
searchguard.nodes_dn:
- CN=es-cluster.node1.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
- CN=es-cluster.node2.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
- CN=es-cluster.node3.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
searchguard.authcz.admin_dn:
- CN=kirk.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
- CN=spock.example.com,OU=Ops,O=Example Com\, Inc.,DC=example,DC=com
xpack.security.enabled: false #禁用x-pack插件
searchguard.restapi.roles_enabled: ["sg_all_access"] #要使用REST管理API,请配置应具有API访问权限的Search Guard角色。以下条目授予对该角色的API的完全访问权限SGS_ALL_ACCESS
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: "Authorization,X-Requested-With,Content-Length,Content-Type"
#searchguard.disabled: true #禁用searchguard
3、启动elasticsearch
注意:es不能用root用户启动。
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
cd /app
chown -R elsearch:elsearch elasticsearch-6.7.2
su elsearch cd elasticsearch-6.7.2/bin
./elasticsearch -d
4、初始化Search Guard
[root@elk-es1 /]# cd /app/elasticsearch-6.7.2/plugins/search-guard-6/tools/
[root@elk-es1 tools]# chmod 744 sgadmin.sh
[root@elk-es1 tools]# ./sgadmin.sh -cd ../sgconfig/ -icl -nhnv -cacert ../../../config/out/root-ca.pem -cert ../../../config/out/kirk.pem -key ../../../config/out/kirk.key -keypass xxxxxxxxxxxkirk的密码在out目录的client-certificates.readme文件中
Search Guard Admin v6
Will connect to localhost:9300 ... done
Elasticsearch Version: 6.7.2
Search Guard Version: 6.7.2-25.1
Connected as CN=sgadmin
Contacting elasticsearch cluster 'elasticsearch' and wait for YELLOW clusterstate ...
Clustername: master-slave
Clusterstate: GREEN
Number of nodes: 3
Number of data nodes: 3
searchguard index already exists, so we do not need to create one.
Populate config from /usr/elasticsearch-6.7.2/plugins/search-guard-6/sgconfig
Will update 'sg/config' with ../sgconfig/sg_config.yml
SUCC: Configuration for 'config' created or updated
Will update 'sg/roles' with ../sgconfig/sg_roles.yml
SUCC: Configuration for 'roles' created or updated
Will update 'sg/rolesmapping' with ../sgconfig/sg_roles_mapping.yml
SUCC: Configuration for 'rolesmapping' created or updated
Will update 'sg/internalusers' with ../sgconfig/sg_internal_users.yml
SUCC: Configuration for 'internalusers' created or updated
Will update 'sg/actiongroups' with ../sgconfig/sg_action_groups.yml
SUCC: Configuration for 'actiongroups' created or updated
Done with success
打开浏览器验证是否生效https://admin:[email protected]:9200
5、Search Guard与kibana的集成
(1)安装search-guard-kibana-plugin插件
在线安装:bin/kibana-plugin install https://path/to/search-guard-kibana-plugin-
离线安装:bin/kibana-plugin install file:///path/to/search-guard-kibana-plugin-
本文采用离线安装
[root@localhost /]# cd /app/kibana-6.7.2-linux-x86_64/
[root@localhost kibana-6.7.2-linux-x86_64]# bin/kibana-plugin install file:///app/search-guard-kibana-plugin-6.7.2-18.4.zip
安装插件后,Kibana将运行优化过程。根据您的系统,这可能需要几分钟。这是每个已安装插件所需的Kibana内部进程,不能跳过。Kibana 优化过程不稳定,问题通常与Search Guard无关。
通过设置为进程提供更多内存,可以解决大多数问题NODE_OPTIONS="--max-old-space-size=8192"
。
(2)配置kibana.yml
elasticsearch.username: “admin” #配置用户名
elasticsearch.password: “admin” #配置密码
elasticsearch.url: “https://192.168.2.100:9200” #配置url
elasticsearch.ssl.verificationMode: none #关闭证书验证
xpack.security.enabled: false #关闭x-apck插件xpack.reporting.enabled: false
searchguard.basicauth.enabled: true
searchguard.cookie.secure: false
searchguard.cookie.name: "searchguard_authentication"
searchguard.cookie.password: "searchguard_cookie_default_password"
searchguard.session.keepalive: true
(3)启动kibana,访问http://192.168.2.100:5601,输入用户名admin,密码admin,即可进入。