ElasticSearch集群搭建与安全认证

news2024/9/20 18:40:08

文章目录

    • 核心概念
      • 集群
      • 节点
      • 分片
      • CAT API查看集群信息
    • 搭建三节点ES集群
      • 安装ES
      • 安装Cerebro客户端
      • 安装kibana
    • ES集群安全认证
      • ES敏感信息泄露的原因
      • 免费的方案
      • 集群内部安全通信
      • 开启并配置X-Pack的认证

核心概念

集群

  • 一个集群可以有一个或者多个节点
  • 不同的集群通过不同的集群名来区分,默认是elasticsearch,搭建集群时需要在配置文件中修改这个cluster.name配置项 ,或者在命令行中 -E cluster.name=es-cluster进行设定



节点

  • 节点是ElasticSearch的一个实例,节点不是指一个机器,因为一个机器可以运行多个ES进程
  • 每一个节点都有一个名字,在配置文件中通过node.name指定
  • 每一个节点在启动之后,会分配一个UID,保存在data目录下



节点类型

  • Master Node:主节点
  • master eligible nodes:可以参与选举的合格节点,配置文件中的配置项node.master,默认值是true
  • Data Node:数据节点,配置文件中的配置项node.data,默认值是true
  • Ingest Node:预处理节点。配置文件中的配置项node.ingest,默认值是true
  • Coordinating Node:协调节点,每个节点都默认是协调者节点



Master eligible nodes和Master Node

  • 每个节点启动后,默认就是一个Master eligible节点,可以通过node.master: false禁止
  • Master-eligible节点可以参加选主流程,成为Master节点

  • 当第一个节点启动时候,它会将自己选举成Master节点

  • 每个节点上都保存了集群的状态,只有Master节点才能修改集群的状态信息,其中包括:所有节点信息、所有索引信息以及相关的Mappings和Setting信息、分片的路由信息



Master Node的职责

  • 处理创建,删除索引等请求,负责索引的创建与删除
  • 决定分片被分配到哪个节点
  • 维护并且更新Cluster State



Data Node 数据节点

  • 可以保存数据的节点,叫做Data Node,负责保存分片数据。

  • 节点启动后,默认就是数据节点。可以设置node.data: false 禁止

  • 由Master Node决定如何把分片分发到数据节点上

  • 通过增加数据节点可以解决数据水平扩展和解决数据单点问题



Coordinating Node预处理节点

  • 负责接受Client的请求, 将请求分发到合适的节点,最终把结果汇集到一起
  • 每个节点默认都起到了Coordinating Node的职责



其他节点类型

  • Hot & Warm Node

  • 不同硬件配置 的Data Node,用来实现Hot & Warm架构,降低集群部署的成本

  • Ingest Node

  • 数据前置处理转换节点,支持pipeline管道设置,可以使用ingest对数据进行过滤、转换等操作

  • Machine Learning Node

  • 负责跑机器学习的Job,用来做异常检测

  • Tribe Node

  • Tribe Node连接到不同的Elasticsearch集群,并且支持将这些集群当成一个单独的集群处理



分片

在ES中,分片Shard的概念是针对索引Index的,这也是和其他中间件不同的地方

  • 主分片(Primary Shard)

    • 用以解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
    • 主分片数在索引创建时指定,后续不允许修改,除非Reindex
  • 副本分片(Replica Shard)

    • 用以解决数据高可用的问题。 副本分片是主分片的拷贝
    • 副本分片数,可以动态调整
    • 增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)



# 指定索引的主分片和副本分片数
PUT /blogs
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

在这里插入图片描述



#查看集群的健康状况
GET _cluster/health

集群status

  • Green: 主分片与副本都正常分配
  • Yellow: 主分片全部正常分配,有副本分片未能正常分配
  • Red: 有主分片未能分配。例如,当服务器的磁盘容量超过85%时,去创建了一个新的索引



CAT API查看集群信息

GET /_cat/nodes?v   #查看节点信息
GET /_cat/health?v    #查看集群当前状态:红、黄、绿
GET /_cat/shards?v        #查看各shard的详细情况  
GET /_cat/shards/{index}?v     #查看指定分片的详细情况
GET /_cat/master?v          #查看master节点信息
GET /_cat/indices?v         #查看集群中所有index的详细信息
GET /_cat/indices/{index}?v      #查看集群中指定index的详细信息       



搭建三节点ES集群

安装ES

建议:每台机器先安装好单节点ES进程,并能正常运行,再修改配置,搭建集群

单机版本的搭建请参考上文,而集群和单机的区别就是需要修改配置文件

# 给各个服务器创建es 用户
adduser es
passwd es

安装版本:elasticsearch-7.17.3

切换到root用户,修改/etc/hosts

vim  /etc/hosts
192.168.75.65 hs-es-node1  
192.168.75.66 hs-es-node2  
192.168.75.67 hs-es-node3  



修改elasticsearch.yml

[es@localhost elasticsearch-7.17.3]$ vim config/elasticsearch.yml
# 指定集群名称3个节点必须一致
cluster.name: hs-es-cluster
#指定节点名称,每个节点名字唯一
node.name: node-1
#是否有资格为master节点,默认为true
node.master: true
#是否为data节点,默认为true
node.data: true
# 绑定ip,开启远程访问,可以配置0.0.0.0
network.host: 0.0.0.0
#指定web端口 默认端口9200 前端请求端口
#http.port: 9200
#指定tcp端口 集群内各个节点通信端口
#transport.tcp.port: 9300
# 用于节点发现,这里可以指定各节点服务器ip,因为我上面在本机的hosts文件中配置了域名解析,所以就直接用域名
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"] 
# 初始主节点列表,用于启动新集群时选举主节点
#该选项配置为node.name的值,指定可以初始化集群节点的名称
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
# 解决跨域问题
# 是否允许跨域请求,如果设置为false,则不允许非localhost的请求
http.cors.enabled: true
http.cors.allow-origin: "*"



三个节点配置如下:

#192.168.75.65的配置
cluster.name: hs-es-cluster
node.name: node-1
node.master: true
node.data: true
network.host: 0.0.0.0
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"] 
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
http.cors.enabled: true
http.cors.allow-origin: "*"

#192.168.75.66的配置
cluster.name: hs-es-cluster
node.name: node-2
node.master: true
node.data: true
network.host: 0.0.0.0
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"] 
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
http.cors.enabled: true
http.cors.allow-origin: "*"

#192.168.75.67的配置
cluster.name: hs-es-cluster
node.name: node-3
node.master: true
node.data: true
network.host: 0.0.0.0
discovery.seed_hosts: ["hs-es-node1", "hs-es-node2", "hs-es-node3"] 
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
http.cors.enabled: true
http.cors.allow-origin: "*"



启动每个节点的ES服务

# 注意:如果运行过单节点模式,需要删除data目录, 否则会导致无法加入集群
# ES 运行如果我们没有在config/elasticsearch.yml配置文件中显示指定 path.data 和 path.logs 这两个配置项,
# 那么默认会在 ${ES_HOME}目录下创建data和log两个目录
[es@localhost elasticsearch-7.17.3]$ rm -rf ./data/
# 启动ES服务
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch -d
[es@localhost elasticsearch-7.17.3]$ ps -ef | grep elasticsearch



验证集群

http://192.168.75.65:9200/_cat/nodes?pretty

在这里插入图片描述



安装Cerebro客户端

需要JDK

Cerebro 可以查看分片分配和通过图形界面执行常见的索引操作。

项目网址:https://github.com/lmenezes/cerebro

下载地址:https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.zip



运行 cerebro

[root@localhost ~]# unzip cerebro-0.9.4.zip
[root@localhost ~]# cd cerebro-0.9.4

# 前台运行 
[root@localhost cerebro-0.9.4]#cerebro-0.9.4/bin/cerebro
#后台启动
[root@localhost cerebro-0.9.4]#nohup bin/cerebro > cerebro.log &

访问:http://192.168.75.65:9000/,默认端口是9000,如果想修改可以去更改conf/application.conf文件

在这里插入图片描述

输入ES集群节点:http://192.168.75.65:9200,建立连接



此时我创建一个索引

# 创建一个索引,shard分片数为3   每个分片副本数为2
PUT /sys_user
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

在这里插入图片描述



安装kibana

[es@localhost kibana-7.17.3-linux-x86_64]$ vim ./config/kibana.yml

server.port: 5601
server.host: "192.168.75.65" 
elasticsearch.hosts: ["http://192.168.75.65:9200", "http://192.168.75.66:9200", "http://192.168.75.67:9200"]
i18n.locale: "zh-CN" 
# 注意要以非root用户启动
# 后台启动
[es@localhost kibana-7.17.3-linux-x86_64]$ nohup ./bin/kibana &


#查询kibana进程
[es@localhost kibana-7.17.3-linux-x86_64]$ netstat -tunlp | grep 5601

在这里插入图片描述

访问:http://192.168.75.65:5601/



ES集群安全认证

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/configuring-stack-security.html



ES敏感信息泄露的原因

  • Elasticsearch在默认安装后,不提供任何形式的安全防护
  • 不合理的配置导致公网可以访问ES集群。比如在elasticsearch.yml文件中,server.host配置为0.0.0.0



免费的方案

  • 设置nginx反向代理

  • 安装免费的Security插件

    • Search Guard : https://search-guard.com/
    • readonlyrest: https://readonlyrest.com/
  • X-Pack的Basic版

    • 从ES 6.8开始,Security纳入x-pack的Basic版本中,免费使用一些基本的功能



集群内部安全通信

ElasticSearch集群内部的数据是通过9300进行传输的,如果不对数据加密,可能会造成数据被抓包,敏感信息泄露。

解决方案: 为节点创建证书

TLS 协议要求Trusted Certificate Authority (CA)签发x.509的证书。证书认证的不同级别:

  • Certificate ——节点加入需要使用相同CA签发的证书
  • Full Verification——节点加入集群需要相同CA签发的证书,还需要验证Host name 或IP地址
  • No Verification——任何节点都可以加入,开发环境中用于诊断目的



1、生成节点证书

在其中一台服务器上执行下面命名,不用三台服务器都执行

[es@localhost elasticsearch-7.17.3]$ ./bin/elasticsearch-certutil ca

在这里插入图片描述



# 为集群中的每个节点生成证书和私钥,这里也可以不用输入密码,直接回车
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

在这里插入图片描述



# 把上方生成的两个.p12文件 移动到config目录下
[es@localhost elasticsearch-7.17.3]$ mv *.p12 ./config/



将如上命令生成的两个证书文件拷贝到另外两个节点作为通信依据。

# 拷贝到192.168.75.66  192.168.75.67 两个节点上
[es@localhost elasticsearch-7.17.3]$ scp ./config/*.p12 es@192.168.75.66:/home/es/elasticsearch-7.17.3/config
[es@localhost elasticsearch-7.17.3]$ scp ./config/*.p12 es@192.168.75.67:/home/es/elasticsearch-7.17.3/config



2、配置节点间通信

三个ES节点增加如下配置:

[es@localhost elasticsearch-7.17.3]$ vim ./config/elasticsearch.yml
# shift + G 跳至文件结尾   最后指定两个文件的位置,因为我上一步已经复制到config目录下了,所以这里就直接使用的相对路径 表示当前目录下

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



开启并配置X-Pack的认证

修改elasticsearch.yml配置文件,开启xpack认证机制,三台服务器都要执行下面的命令

[es@localhost elasticsearch-7.17.3]$ vim ./config/elasticsearch.yml

xpack.security.enabled: true # 开启xpack认证机制



重启三个节点的ES实例

[es@localhost elasticsearch-7.17.3]$ ps -ef | grep elasticsearch
[es@localhost elasticsearch-7.17.3]$ kill -9

# -d 后台启动
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch -d

测试:

# 使用Curl访问ES,返回401错误
[es@localhost elasticsearch-7.17.3]$ curl 'localhost:9200/_cat/nodes?pretty'
{
  "error" : {
    "root_cause" : [
      {
        "type" : "security_exception",
        "reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",
        "header" : {
          "WWW-Authenticate" : "Basic realm=\"security\" charset=\"UTF-8\""
        }
      }
    ],
    "type" : "security_exception",
    "reason" : "missing authentication credentials for REST request [/_cat/nodes?pretty]",
    "header" : {
      "WWW-Authenticate" : "Basic realm=\"security\" charset=\"UTF-8\""
    }
  },
  "status" : 401
}

浏览器访问http://192.168.75.67:9200/_cat/nodes?pretty需要输入用户名密码

在这里插入图片描述



为内置账号添加密码

ES中内置了几个管理其他集成组件的账号即:

elastic、apm_system、kibana_system、logstash_system、beats_system、remote_monitoring_user 使用之前,首先需要添加一下密码。

三台服务器都需要执行下面的命令

# 为上面的各个用户设置密码,我这里就都设置123456
[es@localhost elasticsearch-7.17.3]$ bin/elasticsearch-setup-passwords interactive

在这里插入图片描述



测试

# -u 指定用户名
curl -u elastic 'localhost:9200/_cat/nodes?pretty'

在这里插入图片描述



配置Kibana

开启了安全认证之后,kibana连接es以及访问es都需要认证。

修改kibana.yml

[es@localhost kibana-7.17.3-linux-x86_64]$ vim ./config/kibana.yml

elasticsearch.username: "kibana_system"
elasticsearch.password: "123456"

在这里插入图片描述



重新启动kibana服务

# 通过端口找kibana的运行进程号 
[es@localhost kibana-7.17.3-linux-x86_64]$ netstat -tulnp | grep 5601
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.75.65:5601      0.0.0.0:*               LISTEN      2066/./bin/../node/
# 直接通过查询node关键字 找kibana的进程号
[es@localhost kibana-7.17.3-linux-x86_64]$ ps -ef | grep node
es         2066   1905  1 10:32 pts/0    00:00:55 ./bin/../node/bin/node ./bin/../src/cli/dist
es         6574   6480  0 11:48 pts/1    00:00:00 grep --color=auto node
# kill
[es@localhost kibana-7.17.3-linux-x86_64]$ kill -9 2066

# 重启
[es@localhost kibana-7.17.3-linux-x86_64]$ nohup  bin/kibana &

此时再连接http://192.168.75.65:5601/,此时我们通过用户名elastic 密码为123456就能登录进去了

在这里插入图片描述



配置cerebro客户端

修改配置文件

[root@localhost cerebro-0.9.4]# vim conf/application.conf

hosts = [
  {
    host = "http://192.168.75.65:9200"
    name = "hs-es-cluster"
    auth = {
      username = "elastic"
      password = "123456"
    }
  }
]



启动cerebro服务

nohup bin/cerebro > cerebro.log &

进行连接:http://192.168.75.65:9000

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度百科创建收费吗

百度百科作为一个开放的网络百科全书,旨在为用户提供丰富的知识信息。根据百度百科的官方声明,创建百度百科词条是完全免费的。任何人都可以自由编辑、修改和添加条目。百度百科的创建和编辑过程是由用户自发进行的,不存在官方收费的情况。 百…

【流程引擎】springboot完美集成activiti工作流方案

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 项目源码配套文档获取:本文末个人名片直接获取。 一、项目形式 springboot…

聊一下软件测试中沟通的原则

目录 一、沟通要清晰,简洁,准确,透明 二、沟通要尽早,及时,适应 三、既要对事,也要对人 四、保持开放心态 五、亲自验证 从事多年测试工作,一项基本功必须练会,那就是“沟通”。…

Springboot项目中使用druid实现多数据源和动态数据源,因数据库不可用导致的项目挂起的处理方案

Springboot项目中使用druid因数据库不可用导致的项目挂起的处理方案 在Spring Boot项目中使用Druid实现多数据源和动态数据源管理是一个常见的场景。通过合理的配置和错误处理机制,您可以有效地管理数据源,避免因数据库不可用而导致整个项目挂起。 1.…

npm包更新发布:从准备到发布的全面指南

引言 在Node.js的生态系统中,npm(Node Package Manager)是不可或缺的一部分,它不仅是获取和管理Node.js项目依赖的核心工具,也是分享和发布自己开发的模块或库的关键平台。 由于一些长期不更新的依赖没有原作者没有及…

精通C++ STL(五):list的介绍及使用

目录 ​编辑 list的介绍 list的使用 list的定义方式 list的插入和删除 push_front和pop_front push_back和pop_back insert erase list的迭代器使用 begin和end rbegin和rend list的元素获取 front和back list的大小控制 size resize empty clear list的操作函数 sort splic…

内部排序(插入、交换、选择)

一、排序的部分基本概念 1. 算法的稳定性 若待排序表中有两个元素 Ri 和 Rj ,其对应的关键字相同即 keyi keyj,且在排序前 Ri 在 Rj 的前面,若使用某一排序算法排序后,Ri 仍然在 Rj 的前面,则称这个排序算法是稳定的…

EMC学习笔记4——传导骚扰发射

传导骚扰发射是最基本的实验项目,主要是检测设备在工作时是否通过电源线产生过强的骚扰发射。 一、传导骚扰发射判断 可以通过两个方面来判断设备是否产生了传导发射: 1.电流的时域波形判断:电流波形与电压的波形不一样。如下图所示&#xf…

界面控件DevExpress .NET MAUI v24.1 - 发布TreeView等新组件

DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 今年第一个重要版本v23.1正式发布,该版本拥有众多…

探索谜题,畅享推理——海龟汤智能体来袭

本文由 ChatMoney团队出品 介绍说明 在神秘与智慧交织的世界里,有一种游戏能让您的思维飞速旋转,激发无限的想象力和推理能力,那就是海龟汤。现在,我们为您带来全新的海龟汤智能体,为您的娱乐时光增添无尽乐趣&#x…

YOLOv5改进 | 融合改进 | C3融合动态卷积模块ODConv【完整代码】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改…

学生高性价比运动耳机有哪些?五大性价比高的运动耳机学生党分享

2024年春季,开放式蓝牙耳机就凭借“佩戴舒适、开放安全”等优势火热出圈,这让各大音频厂商更新迭代速度不断加快,新品层出不穷。而用户面对市场上琳琅满目的开放式蓝牙耳机,一时间也不知道如何选择。对于学生来说,比较…

RepQ-ViT 阅读笔记

RepQ-ViT: Scale Reparameterization for Post-Training Quantization of Vision Transformers ICCV 2023 中国科学院自动化研究所 Abstract RepQ-ViT,一种新的基于量化缩放因子(quantization scale)重参数化的PTQ框架 解耦量化和推理过程…

ios使用plist实现相册功能

第一步:照片复制到Assets文件夹再创建plist 第二步:页面设计 第三步:代码实现 // // PhotoViewController.m // study2024 // // Created by zhifei zhu on 2024/8/11. //#import "PhotoViewController.h"interface PhotoView…

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

🚗💨打车、顺风车、滴滴车&跑腿系统,一键解决出行生活难题! 一、出行新选择,打车从此不再难 忙碌的生活节奏,让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统,正是为了满足…

通天星CMSV6代码审计

fofa指纹 body"./open/webApi.html"||body"/808gps/" /gpsweb/WEB-INF/classes/config/version.conf中可以查看版本。 框架分析 默认安装目录为C:\Program Files\CMSServerV6\ 默认账户:admin/admin 框架结构 跟进web.xml,可以看…

WebGL 入门:开启三维网页图形的新篇章(上)

一、引言 介绍 WebGL 的背景和意义 一、背景 WebGL 是一种 JavaScript API,用于在网页上呈现三维图形。 它是在 2009 年由 Khronos Group 提出的,并于 2011 年成为 W3C 的标准。 在 WebGL 出现之前,网页上的三维图形主要是通过插件&…

TEMU卖家们如何提高temu店铺排名、权重、流量、采购测评成功率?

一、什么叫做自养号测评? 自养号测评类似于国内的某宝S单,就是通过搭建海外的服务器和IP采用海外真实买家资料来注册、养号、下单。 二、自养号测评有哪些作用? 自养号快速提高产品的排名、权重和销量,可以提升订单量、点赞(rat…

Excel工作表同类数据合并工具

下载地址:https://pan.quark.cn/s/81b1aeb45e4c 在Excel表格中,把多行同类数据合并为一行是件令人无比头痛的事情:首先,你得确定哪几条记录是可合并的同类数据,人工对比多个字段难免顾此失彼挂一漏万;其次&…

【深度学习】【文本LLM】如何使用文本相似度挑选语料?

在GitHub上挑选和优化语料库的开源工具与方法 在GitHub上挑选和优化语料库的开源工具与方法 在数据科学和自然语言处理(NLP)的世界里,拥有一个干净且高质量的语料库是成功的关键。然而,随着数据量的增加,处理和优化这些数据变得尤为重要。幸运的是,GitHub上提供了许多开…