1、概述
search-guard是Elasticsearch的一个安全权限plugin,特性包括:
权限控制粒度可以到indices,types,甚至可以到过滤field层次。同时也可以限制用户行为CRUD, admin权限等。
search-guard可以实现用户访问es中日志需要登陆授权,不同用户访问不同索引,不授权的索引无法查看,分组控制不同user查看各自的业务。
search-guard插件包含两部分,search-guard-ssl和search-guard-2两个插件。
2、安装
2.1 先安装search-guard-ssl插件。按照以下步骤安装。
2.1.1 切换到elasticsearch/plugins/的目录,命令安装插件:
sudo bin/plugin install com.floragunn/search-guard-ssl/2.3.4.16
注意版本,这里elasticsearch的版本就是2.3.4,它是要跟search-guard的版本进行对应的。克隆search-guard-ssl项目,生成相关证书。克隆项目命令:
sudo git clone https://github.com/floragunncom/search-guard-ssl.git
2.1.2 创建数字证书
一般来说创建数字证书流程如下:
(1)创建ROOT CA(根证书/CA认证机构)
(2)应用服务器创建CSR(证书签名请求文件),同时会创建好自己的密钥对(公钥和私钥)
(3)将CSR发送到CA认证机构
(4)CA机构将返回一个数字签名证书
切换到刚刚克隆的search-guard-ssl的项目目录下,修改etc目录下的配置文件:
example-pki-scripts/etc/root-ca.conf
example-pki-scripts/etc/signing-ca.conf
根据自己情况修改相关信息等 ,利用脚本,写入密码,生成根证书。
sudo ./gen_root_ca.sh paswd paswd
search-guard-ssl还提供了以下脚本:
gen_node_cert.sh :可以修改成自己的信息,生成相应服务器证书,里面包含了上述生成数字证书的过程。
gen_client_node_cert.sh :同理生成客户端数字证书。这里记住-dname参数后面的信息,后面认证客户端,就靠这个。
修改完脚本,就可以执行脚本,生成相关证书。 配置ssl。将生成的证书,keystore.jks 和 truststore.jks复制到/etc/elasticsearch/conf目录下,然后增加如下配置到elasticsearch.yml中:
searchguard.ssl.transport.enabled: true
searchguard.ssl.transport.keystore_filepath: example-keystore.jks
searchguard.ssl.transport.keystore_password: paswd
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: paswd
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
//http配置,这里我只是为了测试方便,配置完,应该设置为true
searchguard.ssl.http.enabled: false
searchguard.ssl.http.keystore_filepath: example-keystore.jks
searchguard.ssl.http.keystore_password: paswd
searchguard.ssl.http.truststore_filepath: truststore.jks
searchguard.ssl.http.truststore_password: paswd
searchguard.allow_all_from_loopback: true
//这里注意,下面的配置一定要和签的客户端证书一致,否则不能插入配置
searchguard.authcz.admin_dn:
- CN=example, OU=client, O=client, L=Test, C=DE
2.2 安装search-guard-2插件
2.2.1 安装插件
sudo bin/plugin install -b com.floragunn/search-guard-2/2.3.4.4
这里同样注意与elasticsearch版本对应。修改配置并插入。切换目录到../elasticsearch/plugins/search-guard-2/ 修改该目录下的sgconfig目下的配置文件。修改用户,角色,角色映射几个配置文件即可。
2.2.2 配置文件介绍
search-guard-2主要有5个配置文件,在 plugins/search-guard-2/sgconfig 下:
(1)sg_config.yml
Configure authenticators and authorization backends。主配置文件不需要做改动。
(2)sg_internal_users.yml
本地用户文件,定义用户密码以及对应的权限。例如:对于 ELK 我们需要一个 kibana 登录用户和一个 logstash 用户:
kibana4:
hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
#password is: kirk
roles:
- kibana4
logstash:
hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
#password is: kirk
roles:
- logstash
密码可用plugins/search-guard-2/tools/hash.sh生成。
(3)sg_roles.yml
权限配置文件,这里提供 kibana4 和 logstash 的权限样例。
#:
# cluster:
# - ''
# indices:
# '':
# '':
# - ''
# _dls_: ''
# _fls_:
# - ''
# - ''
sg_kibana4:
cluster:
- cluster:monitor/nodes/info
- cluster:monitor/health
indices:
'*':
'*':
- indices:admin/mappings/fields/get
- indices:admin/validate/query
- indices:data/read/search
- indices:data/read/msearch
- indices:admin/get
- indices:data/read/field_stats
'?kibana':
'*':
- indices:admin/exists
- indices:admin/mapping/put
- indices:admin/mappings/fields/get
- indices:admin/refresh
- indices:admin/validate/query
- indices:data/read/get
sg_logstash:
cluster:
- indices:admin/template/get
- indices:admin/template/put
indices:
'logstash-*':
'*':
- WRITE
- indices:data/write/bulk
- indices:data/write/delete
- indices:data/write/update
- indices:data/read/search
- indices:data/read/scroll
- CREATE_INDEX
(4)sg_roles_mapping.yml
定义用户的映射关系,添加 kibana 及 logstash 用户对应的映射:
sg_logstash:
users:
- logstash
sg_kibana4:
backendroles:
- kibana
users:
- kibana4
(5)sg_action_groups.yml
定义权限
3、启动
(1)到Elasticsearch的bin目录下,重启Elasticsearch。
(2)通过下面命令启动search-guard。
sudo tools/sgadmin.sh -cd sgconfig/ -ks sgconfig/example-keystore.jks -kspass paswd -ts sgconfig/truststore.jks -tspass paswd -nhnv
(3)访问Elasticsearch的页面,用不同的用户登录。
4、Java 客户端访问
//Java客户端访问配置
Settings tsettings = ImmutableSettings
.settingsBuilder()
.put("searchguard.key_path", "/home/es2/bin")
.put("client.transport.sniff", true)
.put("searchguard.ssl.transport.node.enabled", true)
.put("searchguard.ssl.transport.node.keystore_type", "JKS")
.put("searchguard.ssl.transport.node.keystore_password", "kspass")
.put("searchguard.ssl.transport.node.keystore_filepath", kf)
.put("searchguard.ssl.transport.node.truststore_type", "JKS")
.put("searchguard.ssl.transport.node.truststore_password", "tspass")
.put("searchguard.ssl.transport.node.truststore_filepath", tf)
.build();