引言 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’)