公号:码农充电站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 协议对数据进行加密,需要进行以下步骤:

  • 创建 CA
  • 为 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 分布式集群


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

ElasticSearch 集群安全的更多相关文章

  1. Ubuntu 14.04中Elasticsearch集群配置

    Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...

  2. elasticsearch 集群

    elasticsearch 集群 搭建elasticsearch的集群 现在假设我们有3台es机器,想要把他们搭建成为一个集群 基本配置 每个节点都要进行这样的配置: cluster.name: ba ...

  3. 我的ElasticSearch集群部署总结--大数据搜索引擎你不得不知

    摘要:世上有三类书籍:1.介绍知识,2.阐述理论,3.工具书:世间也存在两类知识:1.技术,2.思想.以下是我在部署ElasticSearch集群时的经验总结,它们大体属于第一类知识“techknow ...

  4. Elasticsearch集群中处理大型日志流的几个常用概念

    之前对于CDN的日志处理模型是从logstash agent==>>redis==>>logstash index==>>elasticsearch==>&g ...

  5. elasticsearch 集群配置

    2015-10-10 09:56 by 轩脉刃, 999 阅读, 1 评论, 收藏, 编辑 elasticsearch 集群 搭建elasticsearch的集群 现在假设我们有3台es机器,想要把他 ...

  6. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(5)

    数据操作与REST API(Data manipulation with REST API) ElasticSearch REST API可用于各种任务.多亏了它,我们可以管理索引,更改实例参数,检查 ...

  7. Elasticsearch集群搭建

    现有两部机器:192.168.31.86,192.168.31.87   参考以往博文对Elasticsearch进行配置完成:http://www.cnblogs.com/zhongshengzhe ...

  8. elasticsearch集群搭建实例

    elasticsearch集群搭建实例 下个月又开始搞搜索了,几个月没动这块还好没有落下. 晚上在自己虚拟机上搭建了一个简易搜索集群,分享一下. 操作系统环境: Red Hat 4.8.2-16 el ...

  9. 解剖 Elasticsearch 集群 - 之三

    解剖 Elasticsearch 集群 - 之三 本篇文章是一系列涵盖 Elasticsearch 底层架构和原型示例的其中一篇.在本篇文章中,我们会讨论 Elasticsearch 如何提供准实时搜 ...

  10. ES2:ElasticSearch 集群配置

    ElasticSearch共有两个配置文件,都位于config目录下,分别是elasticsearch.yml和logging.yml,其中,elasticsearch.yml 用来配置Elastic ...

随机推荐

  1. cf1291c-Mind Control

    题意:n个数n个人依次取数,每个人只能取第一个数或最后一个数,你可以从一开始控制k个人取最前边或是最后边的数,你排在第m位,能取到的最大的数是多少.所有人取数都是最优策略(不是每次取最大数). 题解: ...

  2. 牛客练习赛63 C.牛牛的揠苗助长

    题意:有一个长度为\(n\)的数组,从第一天开始,第\(i\)天可以使\(i\)位置上的数\(+1\),当\(i=n\)时,下次从\(i=1\)再开始,另外,在每天结束时,你可以使任意一个位置上的数\ ...

  3. Codeforces Round #641 (Div. 2) D. Orac and Medians (贪心)

    题意:有一个长度为\(n\)的数组,问能否通过多次使某个区间的所有元素变成这个区间的中位数,来使整个数组变成题目所给定的\(k\). 题解:首先这个\(k\)一定要在数组中存在,然后我们对中位数进行考 ...

  4. Codeforces Round #669 (Div. 2) A. Ahahahahahahahaha (构造)

    题意:有一个长度为偶数只含\(0\)和\(1\)的序列,你可以移除最多\(\frac{n}{2}\)个位置的元素,使得操作后奇数位置的元素和等于偶数位置的元素和,求新序列. 题解:统计\(0\)和\( ...

  5. [Python] Uvicorn+FastAPI快速搞定Restful API开发

    目录 安装模块 运行代码 运行命令 快速文档 安装模块 # 一个现代的,快速(高性能)python web框架 pip install fastapi # 主要用于加载和提供应用程序的服务器. pip ...

  6. Leetcode(17)-电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  7. Object Destructuring Assignment vs Object.assign

    Object Destructuring Assignment vs Object.assign // const params = Object.assign({}, this.$route.par ...

  8. cheerio & jQuery for server

    cheerio & jQuery for server Fast, flexible & lean implementation of core jQuery designed spe ...

  9. JavaScript Number Type Checker

    JavaScript Number Type Checker Number.isInteger // static 方法 Number.isInteger(value) https://develop ...

  10. Android 开发 权限管理

    Android 开发 权限管理 https://sspai.com/post/42779 $ adb shell pm list permissions -d -g https://zhuanlan. ...