0

ElasticSearch 集群安全

 2 years ago
source link: https://codeshellme.github.io/2021/02/es-cluster-secure/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

公号:码农充电站pro

主页:https://codeshellme.github.io

在安装完 ES 后,ES 默认是没有任何安全防护的。

ES 的安全管理主要包括以下内容:

这里有一些免费的安全方案:

  • 设置 Nginx 方向代理。
  • 安装免费的安全插件,比如:

  • X-Pack 的 Basic 版:可参考这里

1,身份认证

ES 中提供的认证叫做 Realms,有以下几种方式,可分为两类:

  • 内部的:不需要与 ES 外部方通信。
    • file(免费):用户名和密码保存在 ES 索引中。
    • native(免费):用户名和密码保存在 ES 索引中。
  • 外部的:需要与 ES 外部组件通信。

2,用户鉴权

用户鉴权通过定义一个角色,并分配一组权限;然后将角色分配给用户,使得用户拥有这些权限。

ES 中的权限有不同的级别,包括集群级别(30 多种)和索引级别(不到 20 种)。

ES 中提供了很多内置角色(不到 30 种)可供使用。

ES 中提供了很多关于用户与角色的 API:

3,启动 ES 安全功能

下面演示如何使用 ES 的安全功能。

启动 ES 并通过 xpack.security.enabled 参数打开安全功能:

bin\elasticsearch -E node.name=node0 -E cluster.name=mycluster -E path.data=node0_data -E http.port=9200 -E xpack.security.enabled=true

使用 elasticsearch-setup-passwords 命令启用 ES内置用户及初始 6 位密码(需要手动输入,比如是 111111):

bin\elasticsearch-setup-passwords interactive

该命令会启用下面这些用户:

  • elastic:超级用户。
  • kibana:用于 ES 与 Kibana 之间的通信。
  • kibana_system:用于 ES 与 Kibana 之间的通信。
  • apm_system
  • logstash_system
  • beats_system
  • remote_monitoring_user

启用 ES 的安全功能后,访问 ES 就需要输入用户名和密码:

也可以通过 curl 命令(并指定用户)来访问 ES:

curl -u elastic 'localhost:9200'

更多内容可参考这里

4,启动 Kibana 安全功能

打开 Kibana 的配置文件 kibana.yml,写入下面内容:

elasticsearch.username: "kibana_system" # 用户名
elasticsearch.password: "111111" # 密码

然后使用 bin\kibana 命令启动 Kibana。

访问 Kibana 也需要用户和密码(这里使用的是超级用户):

5,使用 Kibana 创建角色和用户

下面演示如何使用 Kibana 创建角色和用户。登录 Kibana 之后进行如下操作:

点击 Stack Management 后进入下面页面:

5.1,创建角色

点击 Create role 创建角色:

创建角色需要填写如下内容:

  • 角色对哪些索引有权限及索引的权限级别
  • 添加一个 Kibana 权限
  • 最后创建角色

经过上面的操作,创建的角色名为 test_role,该角色对 test_index 索引有只读权限;如果进行超越范围的操作,将发生错误。

5.2,创建用户

进入到创建用户的界面,点击 Create user 创建用户:

填写用户名和密码,并将角色 test_role 赋予该用户。

5.3,使用用户

使用新创建的用户登录 Kibana:

该用户只对 test_index 索引有只读权限;如果进行超越范围的操作,将发生错误。

6,传输加密

传输加密指的是在数据的传输过程中,对数据进行加密(可防止数据被抓包)。

传输加密分为集群内加密和集群间加密:

  • 集群内加密指的是 ES 集群内部各节点之间的数据传输时的加密。
    • 通过 TLS 协议完成。
  • 集群间加密指的是外部客户访问 ES 时,数据传输的加密。
    • 通过 HTTPS 协议完成。

更多的内容可参考这里

6.1,集群内部传输加密

在 ES 中可以使用 TLS 协议对数据进行加密,需要进行以下步骤:

  • 为 ES 节点创建证书和私钥
1,创建 CA 证书

使用如下命令创建 CA:

bin\elasticsearch-certutil ca

成功后,可以看到当前文件夹下多了一个文件:

elastic-stack-ca.p12
2,生成证书和私钥

使用如下命令为 ES 中的节点生成证书和私钥

bin\elasticsearch-certutil cert --ca elastic-stack-ca.p12

成功后,可以看到当前文件夹下多了一个文件:

elastic-certificates.p12
3,配置证书

将创建好的证书 elastic-certificates.p12 放在 config/certs 目录下。

4,启动集群
# 启动第一个节点
bin\elasticsearch
-E node.name=node0
-E cluster.name=mycluster
-E path.data=node0_data
-E http.port=9200
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
# 启动第二个节点
bin\elasticsearch
-E node.name=node1
-E cluster.name=mycluster
-E path.data=node1_data
-E http.port=9201
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12

不提供证书的节点将无法加入集群:

bin\elasticsearch
-E node.name=node2
-E cluster.name=mycluster
-E path.data=node2_data
-E http.port=9202
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
# 加入失败

也可以将配置写在配置文件 elasticsearch.yml 中,如下:

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

6.2,集群外部传输加密

通过配置如下三个参数,使得 ES 支持 HTTPS:

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

在命令行启动:

bin\elasticsearch
-E node.name=node0
-E cluster.name=mycluster
-E path.data=node0_data
-E http.port=9200
-E xpack.security.enabled=true
-E xpack.security.transport.ssl.enabled=true
-E xpack.security.transport.ssl.verification_mode=certificate
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
-E xpack.security.http.ssl.enabled=true
-E xpack.security.http.ssl.keystore.path=certs\elastic-certificates.p12
-E xpack.security.http.ssl.truststore.path=certs\elastic-certificates.p12

启动成功后,可以通过 HTTPS 协议访问 ES:

https://localhost:5601/

6.3,配置 Kibana 链接 ES HTTPS

1,为 Kibana 生成 pem 文件

首先用 openssl 为 kibana 生成 pem:

openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem

成功后会生成如下文件:

elastic-ca.pem

将该文件放在 config\certs 目录下。

2,配置 kibana.yml

在 Kibana 的配置文件 kibana.yml 中配置如下参数:

elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.ssl.certificateAuthorities: ["C:\\elasticsearch-7.10.1\\config\\certs\\elastic-ca.pem"]
elasticsearch.ssl.verificationMode: certificate
3,运行 Kibana
bin\kibana

6.4,配置 Kibana 支持 HTTPS

1,为 Kibana 生成 pem
bin/elasticsearch-certutil ca --pem

上面命令执行成功后会生成如下 zip 文件:

elastic-stack-ca.zip

将该文件解压,会有两个文件:

ca.crt
ca.key

将这两个文件放到 Kibana 的配置文件目录 config\certs

2,配置 kibana.yml

在 Kibana 的配置文件 kibana.yml 中配置如下参数:

server.ssl.enabled: true
server.ssl.certificate: config\\certs\\ca.crt
server.ssl.key: config\\certs\\ca.key
3,运行 Kibana
bin\kibana

启动成功后,可以通过 HTTPS 协议访问 Kibana:

https://localhost:5601/

(本节完。)


推荐阅读:

ElasticSearch 搜索模板与建议

ElasticSearch 聚合分析

ElasticSearch 中的 Mapping

ElasticSearch 数据建模

ElasticSearch 分布式集群


欢迎关注作者公众号,获取更多技术干货。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK