Elasticsearch X-pack的实际应用

2021-07-08 14:45:57 浏览数 (1)

1.简介

用户数据的安全性一直是开发和运维人员关注的重点问题,Elasticsearch在6.8之前官方的X-pack安全认证功能都是收费的,所以很多人都采用Search Guard或者ReadOnly REST这些免费的安全插件对Elasticsearch进行安全认证。但是使用者都知道Search Guard插件存在很多Bug,比如节点gc超时导致集群掉线后,重启很有可能就要重新进行Search Guard的刷新。从Elasticsearch 6.8开始,Security 纳入 x-pack 的 Basic 版本中,免费使用一些基本的功能。本文将对X-pack安全认证的过程进行详细的讲解。

2.X-pack认证实现的原理讲解

2.1 Authentication-身份认证

说到X-pack认证体系,主要包括两种认证体系类型:1.提供用户名和密码 2.提供秘钥或 Kerberos 票据。而Realms:X-Pack 中的认证服务又分为收费和免费的两种类型,分别是:A.内置 Realms (免费)是通过File / Native(用户名密码保存在 Elasticsearch)实现的。B.外部 Realms (收费)是通过LDAP / Active Directory / PKI / SAML / Kerberos实现的。具体如下图:

雨夜-Authentication-身份认证雨夜-Authentication-身份认证

2.2 RBAC - 用户鉴权

RBAC 为Role Based Access Control, 定义一个角色,并分配一组权限。权限包括索引级,字段级,集群级的不同的操作。然后通过将角色分配给用户,使得用户拥有这些权限。

● User:The authenticated Use

● Role:A named set of permissions

● Permission – A set of one or more privileges against a secured resource

● Privilege – A named group of 1 or more actions that user may execute against a secured

resource

2.3 Privilege

Elasticsearch的角色其实又是通过权限去控制,而Elasticsearch的权限主要分为对cluster和对索引的权限,分表如下:

● Cluster Privileges

● all / monitor / manager / manage_index / manage_index_template / manage_rollup

● Indices Privileges

● all / create / create_index / delete / delete_index / index / manage / read /write / view_index_metadata

3.开启并配置 X-Pack 的认证与鉴权

上面讲解了X-pack认证的原理,下面本人将带领搭建看下X-pack的认证和鉴权是如何开启配置的。而这一部分我们将进行两个部分的讲解,第一部分为http的权限认证,第二部分为https的的权限认证开启。

3.1 http协议的权限认证开启

其实这一块结合官方文档是最容易实现的,具体如下:

官方X-pack开启http协议认证的方式官方X-pack开启http协议认证的方式

3.1.1 配置文件增加xpack.security.enabled参数

在elasticsearch.yml文件增加如下参数:

代码语言:javascript复制
xpack.security.enabled:true

3.1.2 开启节点证书

代码语言:javascript复制
bin/elasticsearch-certutil ca  --days  100000
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12  --days  100000

注意: 一定要加--days 指定证书过期时间,否则默认证书过期时间为3年,最终生成的节点证书为:elastic-certificates.p12 。将其放到集群的每个节点config目录下面。

3.1.3 增加ES认证配置

代码语言:javascript复制
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate 
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

3.1.4 开启Elasticsearch集群,并初始化Elasticsearch密码

代码语言:javascript复制
bin/elasticsearch-setup-passwords interactive/auto  

注意: interactive为自定义密码,auto为自动生成密码。

至此Elasticsearch的X-pack安全认证功能就讲完了,至于kibana的配置呢?

3.1.5 kibana安全认证配置

代码语言:javascript复制
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.248.xxx:9200"]
elasticsearch.username: kibana
elasticsearch.password: xxxxx

3.2 https协议的权限认证开启

为什么需要开启https协议的权限认证呢?主要有两个优势:1.加密数据 – 避免数据抓包,敏感信息泄漏 2.防止imposter node的加入。

3.2.1 增加http认证配置

https协议的权限认证实现其实非常简单,主要比http协议开启就多了一个步骤。也就是说开启ES https协议你需要先完成3.1.1-3.1.4。完成之后你在配置文件,即elasticsearch.yml文件增加如下配置:

代码语言:javascript复制
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12 
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12

然后重启整个ES集群即可。

3.2.2 kibana的认证

首先kibana需要生成一个pem的证书

代码语言:javascript复制
openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem

如何将elastic-ca.pem文件传到kibana配置文件对应的路径,kibana的配置如下:

代码语言:javascript复制
server.port: 5603
server.host: "0.0.0.0"
elasticsearch.hosts: ["https://192.168.248.xxx:9200"]
elasticsearch.username: kibana
elasticsearch.password: xxxx
elasticsearch.ssl.certificateAuthorities: /home/kibana/kibana3/config/elastic-ca.pem
elasticsearch.ssl.verificationMode: certificate

3.2.3 kibana的https协议认证

同理将kibana配置为https协议也是更安全的,具体做法如下:

代码语言:javascript复制
bin/elasticsearch-certutil ca --pem

整个命令会生成elastic-stack-ca.zip,解压后是instance.crt和instance.key将这两个文件传到kibana的config目录下,kibana的配置文件增加如下参数:

代码语言:javascript复制
server.ssl.enabled: true
server.ssl.certificate: config/instance.crt
server.ssl.key: config/instance.key

kibana访问的时候就得访问https://192.168.248.xxx:5693 这样访问了。

4.常用的用户角色管理语法

4.1 修改Elasticsearch用户密码

代码语言:javascript复制
curl -XPOST -k -u elastic:changeme "https://ESIP:9200/_security/user/beats_system/_password" -H 'Content-Type: application/json' -d'{"password": "'"$BEAT_PASS"'"}'

4.2 创建用户并赋角色

代码语言:javascript复制
curl -XPOST -k -u elastic:changeme "https://ESIP:9200/_security/user/logstash_admin" -H 'Content-Type: application/json' -d'{ "password" : "'"$BEAT_PASS"'", "roles" :[ "logstash_admin", "logstash_system", "monitoring_user" ], "full_name" : "LogstashAdmin", "email" : "logstash_admin@slb.com"}'

4.3 删除一个用户

代码语言:javascript复制
curl -XDELETE -k -u elastic:changeme "https://ESIP:9200/_security/user/logstash_admin"

4.4 创建角色

代码语言:javascript复制
curl -uelastic:"xxx" -XPOST -H "Content-Type: application/json" http://192.168.248.xxx:9201/_xpack/security/role/index_wr -d '{"cluster" : ["manage"],"indices" : [ {"names" : ["*"], "privileges" : ["manage", "read","index","create","delete","write","create_index","view_index_metadata"],"allow_restricted_indices" : false }] }'

4.5 用户和角色查看

代码语言:javascript复制
#查看elastic用户对应的角色
curl -uelastic:"xxx" -XGET -H "Content-Type: application/json" http://192.168.248.xxx:9201/_xpack/security/user/elastic
#查看superuser角色对应的权限
curl -uelastic:"xxx" -XGET -H "Content-Type: application/json" http://192.168.248.xxx:9201/_xpack/security/role/superuser

5.总结:

本文主要介绍了X-pack认证的基本原理,X-pack如何开启http协议或者开启https协议认证,常见的用户角色管理权限的语法等三部分内容。通过本篇文章希望你能更好的掌握X-pack的知识。

6.参考文献

https://www.elastic.co/what-is/elastic-stack-security

https://www.elastic.co/guide/en/elasticsearch/reference/current/configuring-stack-security.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.1/configuring-tls.html

0 人点赞