ElasticSearch 集群安全
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.
公号:码农充电站pro
在安装完 ES 后,ES 默认是没有任何安全防护的。
ES 的安全管理主要包括以下内容:
这里有一些免费的安全方案:
- 设置 Nginx 方向代理。
安装免费的安全插件,比如:
- X-Pack 的 Basic 版:可参考这里。
1,身份认证
ES 中提供的认证叫做 Realms,有以下几种方式,可分为两类:
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/
(本节完。)
推荐阅读:
欢迎关注作者公众号,获取更多技术干货。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK