一、介绍
Search Guard是一个开源的安全插件,用于Elasticsearch和整个搜索提供加密、认证、授权和审计日志的ELK堆栈多租户和遵从性特性。官网地址为:https://search-guard.com/
二、所需安装包下载
search-guard-2-2.4.0.12.zip 下载地址:https://search.maven.org/remotecontent?filepath=com/floragunn/search-guard-2/2.4.0.12/search-guard-2-2.4.0.12.zip
search-guard-ssl-2.4.0.21.zip下载地址:https://search.maven.org/remotecontent?filepath=com/floragunn/search-guard-ssl/2.4.0.21/search-guard-ssl-2.4.0.21.zip
search-guard-ssl-2.4.x.zip 下载地址:https://github.com/floragunncom/search-guard-ssl/tree/2.4.x
三、开始安装
1、前提你得有一个ES单节点或者集群
2、上传所需要的包到ES所在的服务器,插件安装:进入elasticsearch目录执行以下命令,所有节点都执行
bin/plugin install -b file:home/elasticsearch/search-guard-2-2.4.0.12.zip
bin/plugin install -b file:home/elasticsearch/search-guard-ssl-2.4.0.21.zip
注:当ES版本大于2.2时,安装过程中可能会有WARNING提示,这个不影响使用
进入到ES的plugins目录下查看安装完成
3、生成证书文件
选择任意节点解压:unzip search-guard-ssl-2.4.x.zip
3-1、切换到search guard ssl 源码目录,进入example-pki-scripts文件夹,里面有3个脚本
cd search-guard-ssl-2.4.x/example-pki-scripts
gen_client_node_cert.sh 创建客户端证
gen_node_cert.sh 创建节点证书
gen_root_ca.sh 创建根证书
3-2、进入example-pki-scripts/etc目录,里面是证书生成时的一些配置文件,可根据需要修改相应的信息
root-ca.conf 根证书配置
signing-ca.conf 签名证书配置
其中自定义的信息如下:
0.domainComponent = "www.test.com” 域名
1.domainComponent = "www.test.com" 域名
organizationName = "Test" 组织名称
organizationalUnitName = "Test Root CA" 组织单位名称
commonName = "Test Root CA" 通用名称
以上信息随便填写,只要保证生成证书时跟证书、签名证书中的信息一致即可
3-3、生成证书
返回到example-pki-scripts目录下,修改example.sh文件:
修改其中所有的密码“changeit”,可通过如下命令批量替换
:%s/changeit/123456/g
然后再修改为:
参数说明:
./gen_root_ca.sh capass 123456
第一个参数为CA_PASS,即CA密码(根证书密码)
第二个参数为TS_PASS,即TS密码(truststore,信任证书密码)
./gen_node_cert.sh 0 123456 capass
第一个参数为node编号,生成证书后的文件名为node-0*
第二个参数为KS_PASS(keystore文件密码)
第三个参数为CA_PASS
./gen_client_node_cert.sh test123456 capass
第一个参数为客户端节点名称,生成证书后的文件名为test*
第二个参数为KS_PASS
第三个参数为CA_PASS
3-4、运行example.sh文件,会在当前目录下生成各种证书文件
sh example.sh
生成之前:
生成成功后:
4、将相关证书文件拷贝到es的config目录
cp node-0-keystore.jks truststore.jks /es目录/config/
复制这三个节点到其他ES节点的config目录下,用scp或者其他方式你随意。
scp node-0-keystore.jks truststore.jks remote_username@remote_ip:/es目录/config
5、修改elasticsearch配置
# 配置ssl
searchguard.ssl.transport.enabled: true
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks
searchguard.ssl.transport.keystore_password: 123456
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: 123456
# 设置不校验hostname
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
#配置restful为https访问,此处为了方便测试,暂时不配置
searchguard.ssl.http.enabled: false
searchguard.ssl.http.keystore_filepath: node-0-keystore.jks
searchguard.ssl.http.keystore_password: 123456
searchguard.ssl.http.truststore_filepath: truststore.jks
searchguard.ssl.http.truststore_password: 123456
searchguard.allow_all_from_loopback: true
# 配置节点识别证书DN
searchguard.nodes_dn:
- CN=node-0.example.com,OU=SSL,O=Test,L=Test, C=DE
- CN=node-*.example.com,OU=SSL,O=Test,L=Test, C=DE
# 配置管理员证书DN
# 这里注意,下面的配置一定要和签的客户端证书一致,否则不能插入配置
searchguard.authcz.admin_dn:
- CN=test,OU=client,O=client,L=Test, C=DE
重启所有ES节点
6、将配置写入运行中的ES,在任意一个节点中执行就行了
cd /es目录/plugins/search-guard-2/tools
sh sgadmin.sh -icl -cn 集群名称 -cd ../sgconfig -ks ../../../config/test-keystore.jks -kspass 123456 -ts ../../../config/truststore.jks -tspass 123456 -nhnv -h 节点ip -p 节点tcp端口号
-h:指的是elasticsearch的elasticsearch.yml配置文件中 network.host 设置的值
如上图显示成功写入配置
通过浏览器访问任意节点如图:默认账号密码为admin,admin
四、search guard 配置文件介绍
search-guard中的用户权限管理
相关配置文件的介绍
searchguard 主要有5个配置文件在plugins/search-guard-2/sgconfig 下:
1、sg_config.yml:主配置文件不需要做改动。
2、sg_internal_users.yml:本地用户文件,定义用户密码以及对应的权限。
3、sg_roles.yml:权限配置文件
4、sg_roles_mapping.yml:定义用户的映射关系
5、sg_action_groups.yml:定义权限
修改内置用户密码,然后再运行一次search guard 配置写入命令
1.则先用plugins/search-guard-2/tools/hash.sh生成hash字符串,生成密码:
cd /usr/share/elasticsearch/plugins/search-guard-2/tools/hash.sh -p 123456
如果提示没有操作权限,则必须先把hash.sh文件的权限开放
chmod -R 777 plugins/search-guard-2/tools/hash.sh
获得哈希生成后的密码
2.将字符串复制到sg_internal_users.yml文件的对应用户密码位置,在密码下面记得写入原密码的提示,难保你那天忘记了。
vim plugins/search-guard-2/sgconfig/sg_internal_users.yml
3.添加用户权限
vim elasticsearch/plugins/search-guard-2/sgconfig/sg_roles_mapping.yml
在39行处的sg_all_access添加你新增的用户名,就获得所有权限了
4.重新写入配置
cd elasticsearch/plugins/search-guard-2/tools/
执行:
sh sgadmin.sh -icl -cn 集群名称 -cd ../sgconfig -ks ../../../config/kirk-keystore.jks -kspass changeit -ts ../../../config/truststore.jks -tspass changeit -nhnv -h节点ip -p节点tcp端口号
再次访问就可以使用ceshi用户了,只要修改search guard就需要重新加载配置。
五、Java API中使用search-guard
加入依赖:
<dependency>
<groupId>com.floragunn</groupId>
<artifactId>search-guard-ssl</artifactId>
<version>2.4.0.21</version>
</dependency>
代码:
@Bean
public TransportClient initClient() throws UnknownHostException {
Settings settings = Settings.builder()
.put("path.home", ".")
.put("cluster.name", "elasticsea")
.put(SSLConfigConstants.SEARCHGUARD_SSL_HTTP_ENABLED, true)
.put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_KEYSTORE_FILEPATH, "kirk-keystore.jks文件路径")
.put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_TRUSTSTORE_FILEPATH, "truststore.jks文件路径")
.put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_KEYSTORE_PASSWORD, "123456")
.put(SSLConfigConstants.SEARCHGUARD_SSL_TRANSPORT_TRUSTSTORE_PASSWORD, "123456")
.put("searchguard.ssl.transport.enforce_hostname_verification", false)
.build();
TransportClient client = TransportClient
.builder()
.settings(settings)
.addPlugin(SearchGuardSSLPlugin.class)
.build();
String[] addresses = new String[]{"ip:port"};
for (String add : addresses) {
TransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(add.split(":")[0]), Integer.parseInt(add.split(":")[1]));
client.addTransportAddress(address);
}
return client;
}
@Bean
public ElasticsearchTemplate elasticsearchTemplate() throws Exception {
return new ElasticsearchTemplate(initClient());
}
参考:
elasticsearch安装与使用(5)-- search guard安装与配置
ElasticSearch2.3.4的search-guard的安装及配置讲解说明