通过TransportClient这个接口,我们可以不启动节点就可以和es集群进行通信,它需要指定es集群中其中一台或多台机的ip地址和端口,例子如下:
- Client client = new TransportClient()
- .addTransportAddress(newInetSocketTransportAddress("host1", 9300))
- .addTransportAddress(newInetSocketTransportAddress("host2", 9300));
- client.close();
Client client = new TransportClient()
.addTransportAddress(newInetSocketTransportAddress("host1", 9300))
.addTransportAddress(newInetSocketTransportAddress("host2", 9300));
client.close();
如果你需要更改集群名(默认是elasticsearch),需要如下设置:
- Settings settings =ImmutableSettings.settingsBuilder()
- .put("cluster.name","myClusterName").build();
- Client client = newTransportClient(settings);
Settings settings =ImmutableSettings.settingsBuilder()
.put("cluster.name","myClusterName").build();
Client client = newTransportClient(settings);
你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。代码实例如下:
- Settings settings = ImmutableSettings.settingsBuilder()
- .put("client.transport.sniff", true).build();
- 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:定义权限。