🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
> ##### [感谢江榕分享](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)的访问设置