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实现的。具体如下图:
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协议的权限认证开启
其实这一块结合官方文档是最容易实现的,具体如下:
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