elasticsearch的使用问题

通过TransportClient这个接口,我们可以不启动节点就可以和es集群进行通信,它需要指定es集群中其中一台或多台机的ip地址和端口,例子如下:

 

[java] view plain copy
 
print ?
  1. Client client = new TransportClient()    
  2.             .addTransportAddress(newInetSocketTransportAddress("host1"9300))    
  3.             .addTransportAddress(newInetSocketTransportAddress("host2"9300));    
  4. client.close();   
Client client = new TransportClient()  
            .addTransportAddress(newInetSocketTransportAddress("host1", 9300))  
            .addTransportAddress(newInetSocketTransportAddress("host2", 9300));  
client.close(); 

 

 如果你需要更改集群名(默认是elasticsearch),需要如下设置:

[java] view plain copy
 
print ?
  1. Settings settings =ImmutableSettings.settingsBuilder()    
  2.                     .put("cluster.name","myClusterName").build();    
  3. Client client = newTransportClient(settings);   
Settings settings =ImmutableSettings.settingsBuilder()  
                    .put("cluster.name","myClusterName").build();  
Client client = newTransportClient(settings); 

 

你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。代码实例如下:

[java] view plain copy
 
print ?
  1. Settings settings = ImmutableSettings.settingsBuilder()    
  2.                    .put("client.transport.sniff"true).build();    
  3. TransportClientclient = new TransportClient(settings);  
Settings settings = ImmutableSettings.settingsBuilder()  
                   .put("client.transport.sniff", true).build();  
TransportClientclient = new TransportClient(settings);

 

 

注意:当ES服务器监听使用内网服务器IP而访问使用外网IP时,不要使用client.transport.sniff为true,在自动发现时会使用内网IP进行通信,导致无法连接到ES服务器,而直接使用addTransportAddress方法进行指定ES服务器。

 

Elasticsearch 免费认证插件Search-guard的部署安装及策略配置

当前es正在被各大互联网公司大量的使用,但目前安全方面还没有一个很成熟的方案,大部门都没有做安全认证或基于自身场景自己开发,没有一个好的开源方案
es官方推出了shield认证,试用了一番,很是方便,功能强大,文档也较全面,但最大的问题是收费的,我相信中国很多公司都不愿去花钱使用,所以随后在github
中找到了search-guard项目,接下来我们一起来了解并部署此项目到我们的ES环境

 

ElasticSearch2.3.4的search-guard的安装及配置讲解说明

一、Search-guard的安装

安装search-guard-ssl和search-guard

1、进入到Elasticsearch的安装路径下,本文中以该路径为例子:/ultra/ES/elasticsearch-2.3.4。先安装search-guard-ssl,执行以下命令:

./bin/plugin install -b com.floragunn/search-guard-ssl/2.3.4.14

2、再安装search-guard,执行以下命令:

./bin/plugin install -b com.floragunn/search-guard-2/2.3.4.4

 

下载search-guard-ssl源码并生成证书

需要生成证书的话,需要保证服务器上的openssl的版本在1.0.1以上。如果版本未达到,请先升级。

1、先将search-gurad-ssl的最新源码下载下来。找一个存放search-gurad-ssl的目录,本文中以该路径为例子:/ultra/ES。

执行以下命令:

git clone https://github.com/floragunncom/search-guard-ssl.git

cd search-guard-ssl/example-pki-scripts

2、进到example-pki-scripts目录下,需要根据自己服务器的情况修改脚本中的配置。找到gen_node_cert.sh文件,将其中的CN、dns修改为服务器的hostname,ip修改为服务器的IP。

3、生成证书:

#生成文件

./example.sh

#管理员的证书

./gen_client_node_cert.sh admin changeit capass

4、证书上传到Elasticsearch中。

a)将example-pki-scripts下生成的truststore.jks、admin-keystore.jks拷贝到${ES_HOME}/plugins/search-guard-2/sgconfig目录下。

b)并且给/ultra/ES/elasticsearch-2.3.4/plugins/search-guard-2/tools/sgadmin.sh执行权限:

chmod +x plugins/search-guard-2/tools/sgadmin.sh

c)将example-pki-scripts下生成的truststore.jks文件复制到ES集群中各个节点的config目录下,且把生成的node-*-keystore.jks文件复制到各个节点的config目录下。

 

在Elasticsearch中添加search-guard和search-guard-ssl的配置项

找到/ultra/ES/elasticsearch-2.3.4/config/elasticsearch.yml文件,添加以下配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
searchguard.authentication.authentication_backend.impl: com.floragunn.searchguard.authentication.backend.simple.SettingsBasedAuthenticationBackend
searchguard.authentication.authorizer.impl: com.floragunn.searchguard.authorization.simple.SettingsBasedAuthorizator
searchguard.authentication.http_authenticator.impl: com.floragunn.searchguard.authentication.http.basic.HTTPBasicAuthenticator
 
searchguard.actionrequestfilter.names: ["none"]
searchguard.actionrequestfilter.none.allowed_actions: []
 
searchguard.transport_auth.enabled: true
marvel.agent.exporter.es.hosts: [ "http://admin:secret@localhost:9200"]
 
searchguard.authentication.authorization.settingsdb.roles.admin: ["root"]
searchguard.authentication.settingsdb.user.admin: secret
security.manager.enabled: false
 
searchguard.audit.type: internal_elasticsearch
##### 管理员账号配置
searchguard.authcz.admin_dn:
- "CN=admin, OU=client, O=client, L=Test, C=DE"
# Enable or disable node-to-node ssl encryption (default: true)
searchguard.ssl.transport.enabled: true
searchguard.ssl.transport.keystore_type: JKS
###节点下放的是node-*,这里就写哪个
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks
searchguard.ssl.transport.keystore_password: changeit
searchguard.ssl.transport.truststore_type: JKS
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: changeit
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
searchguard.ssl.transport.enable_openssl_if_available: false
searchguard.ssl.transport.enabled_protocols:
- "TLSv1"
- "TLSv1.1"
- "TLSv1.2"

 

重启Elasticsearch然后初始化search-guard的配置项

1、启动Elasticsearch,进到/ultra/ES/elasticsearch-2.3.4/bin下:

sh elasticsearch –d

2、初始化search-guard,进到/ultra/ES/elasticsearch-2.3.4下(我的集群名字是pasm,节点ip是192.168.182.74,相关pass我都是默认的changeit,有更改的需要你们自行去修改命令):

plugins/search-guard-2/tools/sgadmin.sh -cn pasm -h 192.168.182.74 -cd plugins/search-guard-2/sgconfig -ts plugins/search-guard-2/sgconfig/truststore.jks -ks plugins/search-guard-2/sgconfig/admin-keystore.jks -kspass changeit -tspass changeit -nhnv 

注意:如果修改了searchguard,则需要重新加载配置执行。

注意:search-guard配置的相关改动不需要重启elasticsearch,相关的配置实际上存储在searchguard 的indice下了。

 

二、HTTP和Java Api方式访问ElasticSearch

HTTP方式访问Elasticsearch

1、在浏览器上访问Elasticsearch,会直接出弹窗,输入用户名密码即可。

2、在服务器上使用curl的话需要加上参数–u adminName,如下图所示:

curl -u adminName:adminname-XGET "http://192.168.0.224:9200/blog/article/1?pretty"

 

Java API中使用search-guard

1、加入jar包

进到/ultra/ES/elasticsearch-2.3.4/plugins/search-guard-ssl目录下拷贝以下jar包加到CLASSPATH中。

search-guard-ssl-2.3.4.14.jar

netty-buffer-4.0.37.Final.jar

netty-codec-4.0.37.Final.jar

netty-common-4.0.37.Final.jar

netty-handler-4.0.37.Final.jar

netty-transport-4.0.37.Final.jar

2、修改setting

以下部分需要从ES节点的这个目录下复制出来放到工程中,并且修改为你实际的路径。

目录:/ultra/ES/elasticsearch-2.3.4/plugins/search-guard-2/sgconfig中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  java.net.InetAddress;
import  java.net.InetSocketAddress;
import  org.elasticsearch.action.admin.cluster.node.info.NodesInfoRequest;
import  org.elasticsearch.common.transport.InetSocketTransportAddress;
import  com.floragunn.searchguard.ssl.SearchGuardSSLPlugin;
 
Settings settings = Settings.settingsBuilder()
         .put( "path.home" "." )
         .put( "cluster.name" "PASM" )
         .put( "searchguard.ssl.transport.enabled" true )
         .put( "searchguard.ssl.transport.keystore_filepath" "I:/Work/WorkSpace/ultrasearch/plugins/search-guard-2/sgconfig/admin-keystore.jks" )
         .put( "searchguard.ssl.transport.truststore_filepath" "I:/Work/WorkSpace/ultrasearch/plugins/search-guard-2/sgconfig/truststore.jks" )
         .put( "searchguard.ssl.transport.enforce_hostname_verification" false )              
         .build();

3、修改client

以下为你想要连接的ES节点的ip和port,请修改为你实际的。

1
2
3
4
5
6
7
TransportClient client = TransportClient.builder().settings(settings).addPlugin(SearchGuardSSLPlugin. class ).build();
TransportClient addTransportAddress = client.addTransportAddress( new  InetSocketTransportAddress( new  InetSocketAddress( "192.168.120.42" 9300 )));
//do something with tc
NodesInfoRequest nodesInfoRequest=  new  NodesInfoRequest();
nodesInfoRequest.putHeader( "sg.impersonate.as" "worf" );
client.admin().cluster().nodesInfo( new  NodesInfoRequest()).actionGet();                               
client.admin().cluster().nodesInfo(nodesInfoRequest).actionGet();

 

search-guard中的用户权限管理

相关配置文件的介绍

searchguard 主要有5个配置文件在/ultra/ES/elasticsearch-2.3.4/plugins/search-guard-2/sgconfig 下:

1、sg_config.yml:主配置文件不需要做改动。

2、sg_internal_users.yml:本地用户文件,定义用户密码以及对应的权限。例如:对于 ELK 我们需要一个 kibana 登录用户和一个 logstash 用户,如下所示:

1
2
3
4
5
6
7
8
9
kibana4:
   hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
   #password is: kirk
   roles:
     - kibana4
logstash:
   hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
   roles:
- logstash

注意:用户的密码可用plugins/search-guard-2/tools/hash.sh生成。

3、sg_roles.yml:权限配置文件,以下为kibana4 和 logstash 的权限样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#< sg_role_name >:
#  cluster:
#    - '< permission >'
#  indices:
#    '< indexname  or alias>':
#      '< type >':  
#        - '< permission >'
#      _dls_: '< querydsl  query>'
#      _fls_:
#        - '< field >'
#        - '< field >'
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 用户对应的映射如下:

1
2
3
4
5
6
7
8
sg_logstash:
   users:
     - logstash
sg_kibana4:
   backendroles:
     - kibana
   users:
     - kibana4

5、sg_action_groups.yml:定义权限。

 

 

你可能感兴趣的:(elasticsearch的使用问题)