引言
search-guard是Elasticsearch的一个安全权限plugin,权限控制粒度可以到indices、types,甚至可以到过滤field层次。同时也可以限制用户行为CRUD, admin权限等。search-guard可以实现用户访问es中日志需要登陆授权,不同用户访问不同索引,不授权的索引无法查看,从而实现分组控制不同用户查看各自的业务。
1、search-guard插件安装
相关es对应版本https://docs.search-guard.com/latest/search-guard-versions
安装https://github.com/floragunncom/search-guard/releases
./bin/elasticsearch-plugin install -b file://xxx
2、 在./search-guard-ssl-6.3.x/example-pki-scripts脚本说明
#清除已生成证书的相关文件
clean.sh
#证书生成配置:root-ca.conf 根证书配置 signing-ca.conf 签名证书配置
#生成所有相关证书的脚本
example.sh
#生成客户端证书的脚本
gen_client_node_cert.sh
gen_node_cert_openssl.sh
#生成节点证书的脚本
gen_node_cert.sh
gen_revoked_cert_openssl.sh
#生成ca根的脚本
gen_root_ca.sh
节点证书与客户端证书中的简写含义:
CN=commonName #通用名称(如主机名), 如: es.node-1.test.cn
OU=organizationalUnitName #组织单位名称, 如:bigdata
O=organizationName #组织名称, 如:test
L=localityName #地区名称, 如:chengdu
C=countryName # 国家名称,如:CN
3、配置说明
a、配置生成证书脚本example.sh
b、每台机器配置elasticsearch.yml
配置完成后重启es集群
4、search-guard权限配置
在./plugins/search-guard-6下两个目录sgcofig和tools
sgconfig下用户、角色、权限配置分别对应sg_internal_users.yml 、sg_roles_mapping.yml、sg_roles.yml
分别配置这三个文件
sg_internal_users.yml
hash密码由tools/hash.sh -p xxx生成
sg_roles_mapping.yml配置
sg_roles.yml配置
配置完成后执行
./tools/sgadmin.sh -h xxx -cd …/sgconfig -ks /etc/elasticsearch/sgadmin-keystore.jks -kspass E#xsw2ZA -ts /etc/elasticsearch/truststore.jks -tspass E#xsw2ZA -nhnv -cn xxxxx 生效
3、searchguard开启java client的测试
public static void init(){
set =Settings.builder()
.put("path.home", ".")
.put("cluster.name",CLUSTER)
.put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中
.put("searchguard.ssl.transport.keystore_filepath","D:\\Users\\yuh004\\IdeaProjects\\testELK\\src\\main\\resources\\sgadmin-keystore.jks")
.put("searchguard.ssl.transport.keystore_password", "changeit")
.put("searchguard.ssl.transport.truststore_filepath","D:\\Users\\yuh004\\IdeaProjects\\testELK\\src\\main\\resources\\truststore.jks")
.put("searchguard.ssl.transport.truststore_password", "changeit")
.put("searchguard.ssl.transport.enforce_hostname_verification", false)
.put("searchguard.ssl.transport.resolve_hostname",false)
.build();
try {
client = new PreBuiltTransportClient(set,SearchGuardPlugin.class)
.addTransportAddress(new TransportAddress(InetAddress.getByName(HOST), PORT));
}catch (Exception e){
e.printStackTrace();
}
由于java访问es集群是走的tcp协议,故需要传签名证书的,这点比较坑,传证书是能访问全部索引数据。
4、searchguard开启hive client对es的测试
在hive客户端执行
set es.net.http.auth.user=admin;
set es.net.http.auth.pass=123456;
CREATE EXTERNAL TABLE test_es_hive (
id STRING,
name STRING ,
text STRING)
STORED BY ‘org.elasticsearch.hadoop.hive.EsStorageHandler’
TBLPROPERTIES(‘es.resource’ = test_es_hive/a’,
‘es.nodes’=‘xxx’);
insert into test_es_hive values(‘1’,‘aa’,‘hello world’);
5、searchguard开启python client对es的操作
from datetime import datetime
from elasticsearch import Elasticsearch
es_servers = [{
“host”: “xxxxx”,
“port”: “9200”,
}]
es = Elasticsearch([‘http://admin:123456@xxxx:9200’])
res = es.get(index=“aa_cmft”, doc_type=‘msg’, id=‘166’)