7. ELK安全配置(上)
最后更新于:2022-04-02 07:47:33
> ##### [感谢江榕分享](https://www.tuicool.com/articles/6fyU7bU)
> ##### [感谢chenzanlong123](http://blog.csdn.net/chenzanlong123/article/details/11784143 "关于truststore和kenstore的区别") 关于truststore和kenstore的区别
### Search Guard基础知识
SearchGuard®是Elasticsearch的开源安全套件,提供加密,身份验证,授权,审计日志记录和多租户的整个ELK堆栈。开源版本核心功能:
- 节点之间的RPC流量通过 SSL/TLS 传输(强制性);
- 索引级别访问控制(重点!);
- 权限配置基本与shield保持一致;
- 支持restful接口流量加密(可选);
#### 个人理解
- Search Guard会将ES包裹起来,其他程序连接ES时,实际是Search Guard在做验证和权限控制。
- ES的Master/Node节点间的SSL/TLS通讯加密必须配置,但客户端(Kibana、Logstash、ES-Head等)访问ES的HTTPS可不配置
- 证书的生成需要使用 Search Guard SSL程序包,需要单独下载,但该程序无需放在ES的服务器中执行,只使用生成后的证书
- keystore可以看成一个放key的库,key就是公钥,私钥,数字签名等组成的一个信息。truststore和keystore的性质是一样的,都是存放key的一个仓库,区别在于,truststore里存放的是只包含公钥的数字证书,代表了可以信任的证书,而keystore是包含私钥的
- Search Guard有Demo脚本,为了更好的理解原理,不要使用
##### Search Guard部署过程
- 第一阶段:实现访问ES需要用户名密码
- 第二节点:Kibana实现用户名密码登录
##### 涉及插件
>[GitHub链接](https://github.com/floragunncom "github链接")
- search-guard-ssl(生成证书程序)
- search-guard(ES插件)
- search-guard-kibana-plugin(Kibana插件)
### 部署Search Guard SSL(任意机器)
仅生成证书,无需部署在生产节点,生成后部署到对应节点即可,该文件需备份!
不推荐使用样例脚本
> [具体版本对照](https://github.com/floragunncom/search-guard-ssl/wiki "版本对照")
脚本依赖openssl 和 keytool
```shell
git clone https://github.com/floragunncom/search-guard-ssl.git
cd search-guard-ssl/example-pki-scripts
```
#### 证书生成重要概念
因为我们要使用到生产环境,所以我们需要自定义创建证书
- ##### gen_client_node_cert.sh(生成admin-keystore.jks)
生成客户端和管理员证书,包含客户端证书的密钥库。此证书被配置为管理员证书,名字可以使用sgadmin/admin/ding均可,但名称要与ES中配置的前缀保持一致(下文中会提到),否则ES启动时,会报Search Guard密码错误
- ##### gen_node_cert.sh(生成 node-0-keystore.jks)
生成ES节点间通讯的证书,密钥库包含节点证书和中间证书。这些密钥库可以在所有Elasticsearch节点上使用。
- ##### gen_root_ca.sh(生成truststore.jks)
包含用于签署所有其他证书的根CA的信任库
##### 修改配置
```shell
example-pki-scripts/etc/root-ca.conf
example-pki-scripts/etc/signing-ca.conf
```
脚本会根据这两个配置生成证书,需要修改如下内容,暂时还不太理解作用,我并没有修改
```shell
[ ca_dn ]
0.domainComponent = "com"
1.domainComponent = "example"
organizationName = "Example Com Inc."
organizationalUnitName = "Example Com Inc. Root CA"
commonName = "Example Com Inc. Root CA"
```
#### 生成证书
##### 生成强密码
```shell
根CA密码:NhRxQ3dC3rJZuQFa
truststore密码:siCPVLDYN2BwuYKo
keystore密码:CNByuENniEtkHRfs
```
##### 生成truststore证书
```shell
#./gen_root_ca.sh capassword_use_a_strong_one truststorepassword
./gen_root_ca.sh NhRxQ3dC3rJZuQFa siCPVLDYN2BwuYKo
```
##### 生成ES节点通讯证书
> ##### 留下问题?是所有ES用一个,每个ES都用不同的证书
```shell
./gen_node_cert.sh nodenum keystorepassword capassword_use_a_strong_one
./gen_node_cert.sh 0 CNByuENniEtkHRfs NhRxQ3dC3rJZuQFa
```
##### 生成客户端(管理员)证书
```shell
./gen_client_node_cert.sh clientname keystorepassword capassword_use_a_strong_one
./gen_client_node_cert.sh admin CNByuENniEtkHRfs NhRxQ3dC3rJZuQFa
```
##### 生成的文件
```shell
#ll /opt/search-guard-ssl/example-pki-scripts/*.jks
-rw-r--r-- 1 root root 4164 Nov 10 16:38 admin-keystore.jks
-rw-r--r-- 1 root root 4233 Nov 10 16:38 node-0-keystore.jks
-rw-r--r-- 1 root root 956 Nov 10 16:37 truststore.jks
```
#### 分发证书
node和truststore证书分发到所有ES的/etc/elasticsearch/目录下
admin证书,放到管理机上,Search Guard会在Elasticsearch中建立searchguard的索引分片,内部存储的就是用户和权限的信息,这些信息只能通过sgadmin.sh脚本进行更新,Search Guard中的逻辑用户,是不具备查看权限的。具体请看下文
##### 注意备份整个目录,后期可能还会生成证书
### 所有ES节点安装Search Guard
#### 在线安装
>##### [版本对应关系](https://github.com/floragunncom/search-guard/wiki "版本对应关系")
```shell
cd /usr/share/elasticsearch/bin
./elasticsearch-plugin install com.floragunn:search-guard-5:5.6.4-16
```
search-guard-5:search-guard的版本
5.6.4-16:当前Elasticsearch对应的search-guard版本
#### 离线安装(推荐)
> ##### [zip包下载地址](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.floragunn%22%20AND%20a%3A%22search-guard-5%22 "下载地址")
```shell
./elasticsearch-plugin install -b file:///tmp/search-guard-5-5.6.4-16.zip
```
#### 增加ES配置(所有ES)
配置结尾增加
```shell
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks
searchguard.ssl.transport.keystore_password: CNByuENniEtkHRfs
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: siCPVLDYN2BwuYKo
#enforce_hostname_verification为不强制验证主机名
searchguard.ssl.transport.enforce_hostname_verification: false
#注意CN=admin,必须和admin-keystore.jks中的admin相同
searchguard.authcz.admin_dn:
- CN=admin,OU=client,O=client,L=Test, C=DE
```
重启ES服务器,如未设置,将无法加入到集群,建议所有ES全部停止后统一配置,避免脑裂
### 生成searchguard索引分片
> ##### [sgadmin相关参数](http://floragunncom.github.io/search-guard-docs/sgadmin.html "1")
```shell
sh /usr/share/elasticsearch/plugins/search-guard-5/tools/sgadmin.sh -h 192.168.0.230 -p 9300 -tspass siCPVLDYN2BwuYKo -kspass CNByuENniEtkHRfs -cd /usr/share/elasticsearch/plugins/search-guard-5/sgconfig -ks /etc/elasticsearch/admin-keystore.jks -ts /etc/elasticsearch/truststore.jks -nhnv -cn es-cluster
```
- 默认要求ES集群状态至少要为YELLOW,可以使用-arc,–accept-red-cluster跳过
- 早期版本的Search guard是允许使用node证书的,但是新版本已经禁止了,这里的ks需要指定为管理用户的证书(admin-keystore.jks)
- es-cluster为集群名称
- -nhnv 禁用主机名称验证,不要验证主机名
```shell
###################################
Contacting elasticsearch cluster 'es-cluster' and wait for YELLOW clusterstate ...
Clustername: es-cluster
Clusterstate: YELLOW
Number of nodes: 1
Number of data nodes: 1
searchguard index already exists, so we do not need to create one.
Populate config from /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/
Will update 'config' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_config.yml
SUCC: Configuration for 'config' created or updated
Will update 'roles' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles.yml
SUCC: Configuration for 'roles' created or updated
Will update 'rolesmapping' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_roles_mapping.yml
SUCC: Configuration for 'rolesmapping' created or updated
Will update 'internalusers' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_internal_users.yml
SUCC: Configuration for 'internalusers' created or updated
Will update 'actiongroups' with /usr/share/elasticsearch/plugins/search-guard-5/sgconfig/sg_action_groups.yml
SUCC: Configuration for 'actiongroups' created or updated
Done with success
```
SUCC代表更新成功
#### 截至目前,ES各个节点间通讯已经加密;Search Guard已经开始守护ES集群了。但由于Search Guard默认设置了一些用户,都是弱口令用户,下一步,我们要进行权限设置以及客户端(Logstash、Kibana、Head)的访问设置
';