ES(Elasticsearch)SSL集群部署

news2024/11/23 15:40:38

8.x后ES不在需要自行准备JDK环境,部署的服务包含ES、Kibana、Logstash,使用二进制方式部署,为了提高安全性,加密logstash、kibana及其他客户端到ES间的通信。

1、准备工作

1.1、 es无法使用root用户启动
useradd -m -s /bin/bash esuser
1.2、配置必要的内核参数,否则会启动失败
vm.max_map_count定义了一个进程可以拥有的最大内存映射区域数量。Elasticsearch,特别是其底层搜索引擎 Lucene,广泛使用内存映射文件 (mmap) 来提高索引和搜索数据的性能。如果 vm.max_map_count 的值太低,可能会因为无法创建足够的内存映射而导致 Elasticsearch 启动失败或在运行中出现性能问题

echo "vm.max_map_count = 262144" >> /etc/sysctl.conf 
sysctl -p

1.3、节点之间配置ssh免密(可选)

1.4、配置hosts

172.30.200.11 node-1
172.30.200.12 node-2
172.30.200.30 node-3

2、ES集群部署

2.1、下载安装包

规范安装在/data目录,包的下载直接官网复制链接以后wget

chown -R esuser:esuser /data/elasticsearch-8.14.3
sudo su - esuser

2.2、生成ES的CA并且分发证书

证书不同的扩展名代表不同用途

  • .p12 文件意味着它同时拥有证书和相应的私钥,这对于需要双向认证的场景(es集群node间通信)
  • pem和crt都可以存储公钥证书,里面包含了公钥、证书主体信息(如持有者名称、组织等)、颁发者信息(如颁发机构的名称和详情)以及有效期等。同时也用于确保网络通信的安全。
  • pem同时也可以存储私钥

2.2.1、生成CA证书
指定证书名称并且免密
bin/elasticsearch-certutil ca --out elastic-stack-ca.p12 --pass ""

2.2.2、免密生成ES节点证书

用户ES集群节点之间的传输层安全(Transport Layer Security,TLS)

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 --ca-pass "" --out elastic-certificates.p12 --pass ""
当前生成了elastic-certificates.p12和elastic-stack-ca.p12,将ca和证书拷贝到config/certs目录下,启用xpack以后es会从这里读取证书

mkdir config/certs
cp elastic-* config/certs/

2.2.4、免密生成http证书

HTTP 证书在 Elastic Stack 中主要用于保护客户端和服务器之间的通信,特别是 Elasticsearch 和 Kibana 的 REST API(CS架构、无状态、http方法实现增删改查)。这些证书确保数据在传输过程中的加密,同时也验证通信双方的身份,从而防止中间人攻击和数据窃听。

# ip和dns有一定预留,长远考虑还可以想到是否要迁移,给新的CIDR ip也加入进来
./bin/elasticsearch-certutil cert --name http \
  --ca config/certs/elastic-stack-ca.p12 --ca-pass "" \
  --dns node-1,node-2,node-3,node-4,node-5,logstash-1,logstash-2,logstash-3,kibana-1,kibana-2 \
  --ip 172.30.200.11,172.30.200.12,172.30.200.13,172.30.200.14,172.30.200.15,172.30.200.16,172.30.200.17,172.30.200.30 \
  --days 18250 \
  --out config/certs/http.p12 --pass ""

2.2.5、对证书进行检查

# 可以查看到证书名称、证书颁发者、证书Base64内容
openssl pkcs12 -in http.p12 -clcerts -nokeys -info
# 如果要查看更多的SAN信息,需要先提取证书出来
openssl pkcs12 -in http.p12 -clcerts -nokeys -out http_cert.crt -passin pass:
# 查看证书内容
openssl x509 -in http_cert.crt -text -noout
# 找到了有效期
            Not Before: Jul 21 03:38:30 2024 GMT
            Not After : Jul  9 03:38:30 2074 GMT

2.3 配置主节点

初始化集群

# 集群名称,三台集群,要配置相同的集群名称!!!
cluster.name: baga
# 节点名称
node.name: node-1
# 数据目录
path.data: data
# log目录
path.logs: logs
# 修改 network.host 为 0.0.0.0,表示对外开放,如对特定ip开放则改为指定ip
network.host: 0.0.0.0
# 设置对外服务http端口,默认为9200
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
discovery.seed_hosts: ["node-1"]
# 下面的两个配置在安装elasticsearch-head的时候会用到
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址,(允许所有域名)以上使用正则
http.cors.allow-origin: "*"
# 加密节点间通信-每个节点容器都要添加

xpack.security.enabled: true
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

# Enable encryption for HTTP API client connections
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/http.p12
xpack.security.http.ssl.truststore.path: certs/http.p12

上面配置如果开始init和seed就写三个集群,集群状态为Yellow,REST请求会503,所以先改为单节点

2.4、启动集群并重置elastic用户密码

# 测试简单点123456
bin/elasticsearch-reset-password  -i -u elastic

2.5、查看集群状态

集群状态没有问题以后就可以让新节点加入了

# 查看节点
curl -k  -u elastic:123456 "https://localhost:9200/_cat/nodes?v"
# 集群健康检查,确认status为green
curl -k  -u elastic:123456 "https://localhost:9200/_cluster/health?pretty"

2.6、拷贝证书到其他节点

我这里直接scp,其他节点也要授权用户

chown -R esuser:esuser /data/elasticsearch-8.14.3
./bin/elasticsearch  -d

日志中也看到新节点的成功加入

[2024-07-21T13:06:29,850][INFO ][o.e.c.s.MasterService    ] [node-1] node-join[{node-3}{HimPVAGmQQW9HLNnaEw1dg}{9pd9bUsNQti9VMryrOpSgw}{node-3}{172.30.200.30}{172.30.200.30:9300}{cdfhilmrstw}{8.14.3}{7000099-8505000} joining], term: 7, version: 96, delta: added {{node-3}{HimPVAGmQQW9HLNnaEw1dg}{9pd9bUsNQti9VMryrOpSgw}{node-3}{172.30.200.30}{172.30.200.30:9300}{cdfhilmrstw}{8.14.3}{7000099-8505000}}
[2024-07-21T13:06:30,337][INFO ][o.e.c.s.ClusterApplierService] [node-1] added {{node-3}{HimPVAGmQQW9HLNnaEw1dg}{9pd9bUsNQti9VMryrOpSgw}{node-3}{172.30.200.30}{172.30.200.30:9300}{cdfhilmrstw}{8.14.3}{7000099-8505000}}, term: 7, version: 96, reason: Publication{term=7, version=96}
[2024-07-21T13:06:30,342][INFO ][o.e.c.c.NodeJoinExecutor ] [node-1] node-join: [{node-3}{HimPVAGmQQW9HLNnaEw1dg}{9pd9bUsNQti9VMryrOpSgw}{node-3}{172.30.200.30}{172.30.200.30:9300}{cdfhilmrstw}{8.14.3}{7000099-8505000}] with reason [joining]

2.7 故障切换

停掉一台后master已经切换到了node-3
image

2.8、错误(单节点集群)

第三台节点也是scp的主节点es目录,没有删除es的data目录,导致启动后node-3成了一个新的集群
清空data目录后重新启动服务加入集群成功

esuser@elk-1:~$ curl -k -u elastic:123456 "https://node-3:9200/_cat/nodes?v"
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
172.30.200.30           10          98  10    1.01    0.41     0.16 cdfhilmrstw *      node-3
esuser@elk-1:~$ curl -k -u elastic:123456 "https://node-2:9200/_cat/nodes?v"
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
172.30.200.11           13          66   0    0.06    0.20     0.10 cdfhilmrstw *      node-1
172.30.200.12           12          89   1    0.10    0.13     0.08 cdfhilmrstw -      node-2

3、配置Kibana

我这里三台节点,采用node-3作为Kibana节点。

3.1、生成kibana用户密码

bin/elasticsearch-reset-password -u kibana

3.2、kibana配置文件

这版配置文件中ssl配置为none表示不对es证书进行验证

# 服务端口
server.port: 5601
# 服务主机名
# 国际化
server.host: "0.0.0.0"
i18n.locale: "zh-CN"
# ES服务器主机地址
elasticsearch.hosts: ["https://node-1:9200","https://node-2:9200","https://node-3:9200"]
# 访问ES服务器的账号 密码
elasticsearch.username: "kibana"
elasticsearch.password: "=fdguzIt7amKm7MJKOum"

#elasticsearch.ssl.certificateAuthorities: [ "config/elasticsearch-ca.pem" ]
elasticsearch.ssl.verificationMode: none

3.3、启动测试kibana和es联通性

bin/kibana
登录http://172.30.200.30:5601创建索引baga
过滤目标索引
curl -s -u elastic:123456 -k "https://node-1:9200/_cat/indices?v" | grep baga

3.4、Kibana配置加密

elasticsearch.ssl.verificationMode 设置定义了 Kibana 如何验证 Elasticsearch 的 SSL/TLS 证书。常见的值有 none(不推荐,因为这会禁用验证),certificate(验证证书,但不验证主机名),或 full(验证证书和主机名)
我们改为full模式

3.4.1、生成kibana所需ca

Kibana 使用 CA 证书来验证连接到的 Elasticsearch 节点的证书。这是确保连接的安全性和信任性的关键一步。通过这种方式,Kibana 能够确认它连接的 Elasticsearch 节点确实是由可信的证书颁发机构(即你的 CA)颁发的证书

full模式会验证主机名,配置hosts
172.30.200.30 node-3 kibana-1 logstash-1
# 创建证书目录
mkdir config/certs
# kibana使用的ca证书格式必须为pem,我们p12格式的不好使
# 分离出证书的公钥(不对证书和私钥进行导出)
openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nokeys -out ca-cert.pem
  -clcerts 提取证书,不包括 CA 证书。
  -nokeys 确保不会尝试导出私钥。
  -out ca-cert.pem 指定输出文件。

# 查看ca公钥
openssl x509  -in  config/certs/ca-cert.pem  -text -noout
... Subject Public Key Info ...

3.4.2、生成kibana自身证书

/data/elasticsearch-8.14.3/bin/elasticsearch-certutil csr -name kibana -dns kibana-1
# 生成zip包后解压
# 签发证书
openssl x509 -req -in kibana.csr -signkey kibana.key -out kibana.crt
# 将证书拷贝到config/certs目录下

3.4.2、更新配置文件
这里需要注意当elasticsearch.ssl.verificationMode 为none表示不验证ES身份,不需要指定证书
server.ssl是kibana被客户端访问提供ssl协议,和es无关。如果不想https访问这里可以不配置

# 服务端口
server.port: 5601
# 服务主机名
# 国际化
server.host: "0.0.0.0"
i18n.locale: "zh-CN"
# ES服务器主机地址
elasticsearch.hosts: ["https://node-1:9200","https://node-2:9200","https://node-3:9200"]
# 访问ES服务器的账号 密码
elasticsearch.username: "kibana"
elasticsearch.password: "=fdguzIt7amKm7MJKOum"

elasticsearch.ssl.certificateAuthorities: [ "config/certs/ca-cert.pem" ]
elasticsearch.ssl.verificationMode: full
# 启用kibana的ssl,也就是说kibana之后需要使用https访问
server.ssl.enabled: true
server.ssl.certificate: config/certs/kibana.crt
server.ssl.key: config/certs/kibana.key

3.4.3 启动kibana
可以对比下ca的公钥结构是否正确
image
至此ES和Kibana的SSL通信建立完毕

4、Logstash部署

4.1、 logstash直接使用root用户启动,logstash本质和kibana一样,作为ES的客户端,都需要ca证书来验证ES

mkdir /data/logstash-8.14.3/config/certs
# 直接拷贝kibana使用过的ca公钥
cp /data/kibana-8.14.3/config/certs/ca-cert.pem config/certs/

4.2、logstash写入测试

为了方便直接将屏幕标准输出写到ES

# 输入配置: 从标准输入读取数据
input {
  stdin {}
}

# 输出配置: 发送数据到 Elasticsearch
output {
  elasticsearch {
    hosts => ["https://node-1:9200"]  # 修改为你的 Elasticsearch 主机地址
    index => "dadadihao-%{+YYYY.MM.dd}"   # 设置索引名称,根据日期动态生成
    user => "elastic"                # Elasticsearch 用户名
    password => "123456"      # Elasticsearch 密码
    ssl => true                      # 启用 SSL
    cacert => "config/certs/ca-cert.pem"  # 指定 CA 证书路径
  }
}

4.3、确认索引写入

curl -s -u elastic:123456 -k "https://node-1:9200/_cat/indices?v" | grep dadadi

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

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

相关文章

搭建安全的分析环境

分析恶意软件,动态行为分析是必不可少的一步,所有样本都必须在虚拟环境中执行,不可在主机上执行。因此,我们要需要搭建供动态分析的环境以及防止在主机运行的环境。 动态分析环境搭建 工具 虚拟机 虚拟机软件有很多&#xff0…

前端面试:项目细节重难点问题分享(17)

更多详情:爱米的前端小笔记(csdn~xitujuejin~zhiHu~Baidu~小红shu)同步更新,等你来看!都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们…

案例分享—国外ui设计优秀案例

国外企业更注重用户体验设计,倾向于简洁清晰的设计风格,以提高用户的使用体验和操作效率。他们注重“简约至上”的设计理念,认为简洁的设计可以减少用户的认知负担,提高用户的工作效率。 设计师在界面设计中往往更加注重创意性和个…

Stable Diffusion绘画 | IP角色多视图生成技巧

在游戏设计、小说推文、角色设计里面,很多场景都运用到IP角色的多视图。 人物角色多视图 第1步,输入提示词: 第2步,由于要在同一张图片中生成多角度的并排展示,需要修改图片的分辨率(尤其是宽度&#xff…

Vue 3 + TypeScript + Vite + Echarts

Vue 3 TypeScript Vite Echarts 1、创建工程 npm create vitelatestcd echarts npm install npm run dev2、安装项目依赖模块 npm install types/node --save-devnpm install vue-router4npm install animate.css --save npm install gsap --savenpm install fetch --save…

LayaAir3.2正式版来了:支持鸿蒙Next系统、程序蓝图(可视化编程)等重要的功能模块...

LayaAir3.2-beta.1的版本中,我们已介绍了3.2是真正的全平台发布版本《LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎》。 在其后的beta版本迭代中,我们不仅及时修复了开发者们反馈的BUG&…

知识改变命运 数据结构【java对象的比较】

0:前言 在基本数据类型中,我们可以直接使用号比较是否相等,还记的学堆哪里时候,插入一个数据,就会与其他数据进行比较,当时我们传入的是Integer类型,在Integer类里面已经实现了compare。 如果…

Ubuntu22.04 获取docker 镜像失败如何处理

最近在使用docker 获取镜像发现 如下错误 无法正常的访问 如果能正常上网的情况下,可以尝试如下操作 首先进入/etc/docker/daemon.json文件 然后在里面加入下面的配置 { "registry-mirrors": ["https://docker.registry.cyou", "htt…

探索杨辉三角形的奥秘:C#实现

文章目录 杨辉三角形简介特点 C#实现杨辉三角形环境准备代码实现代码解释1. 用户输入2. 输入验证3. 初始化第一行4. 生成杨辉三角形5. 打印杨辉三角形 结论 杨辉三角形,也被称为帕斯卡三角形,是一个历史悠久且充满数学魅力的数字模式。它不仅在数学领域有…

论文速读:基于概率教师学习的域自适应目标检测

原文标题:Learning Domain Adaptive Object Detection with Probabilistic Teacher 中文标题:基于概率教师学习的域自适应目标检测 代码地址: GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 p…

【计算机毕设】springboot-家具销售电商平台(附源码)

摘 要 Abstracts 目 录 第1章 绪论 1.1课题背景 1.2研究意义 1.3研究内容 第2章 技术介绍 2 2.1相关技术 3 2.2 Java技术 3 2.3 MySQL数据库 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第3章 需求分析 5 3.1需求分析概述 6 3.2可行性分析 6 3.2.1经济可行性 6 3.2.2技…

Docker:快速部署

docker安装: ​‌​‬​⁠​‍‬​‍‬‬‌​‬‬‬​⁠​‍​​‌‬‌​​​​​​‌​​​​⁠​‍⁠‌安装Docker - 飞书云文档 (feishu.cn) docker命令解读 docker run -d \ > --name mysql \ > -p 33…

OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【异常调测】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 OpenHarmony LiteOS-M提供异常接管调测手段,…

【基础算法总结】字符串篇

目录 一,算法简介二,算法原理和代码实现14.最长公共前缀5.最长回文子串67.二进制求和43.字符串相乘 三,算法总结 一,算法简介 字符串 string 是一种数据结构,它一般和其他的算法结合在一起操作,比如和模拟&…

守护数据安全:.rmallox勒索病毒的防范与应对策略

导言 在当今这个数字化时代,网络空间已成为人们生活、工作和娱乐不可或缺的一部分。然而,随着互联网的普及和技术的飞速发展,网络安全问题也日益凸显,成为了一个全球性的挑战。其中,.rmallox勒索病毒作为一种恶意软件…

【linux】进程间的通信(一)

1. 了解进程通信 两个或者多个进程实现数据层面的交互 因为进程独立性的存在,导致进程通信成本较高(通信需要成本) 2. 进程间通信目的 进程间通信的本质是,让不同的进程看到同一份"资源"(即同一份内存空…

基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和

这里是Themberfue 和为 K 的子数组 题目解析 返回子数组中所有元素的和等于给定k的个数。 算法讲解 这题好像是用滑动窗口解决,但其实不能,因为 nums 中的元素可能存在负数,就不能保证其单调性的性质。 用前缀和求也不易想到,…

Java编码方式:Base64编码与解码

1、Base64 算法介绍 Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它主要用于在不支持二进制数据的场合(如电子邮件、URL、文件系统名等)传输二进制数据。严格来说 Base64 并不是一种加密/解密算法,而是一种编码方式。Bas…

数据挖掘学习笔记:朴素贝叶斯 | Python复现

数据挖掘学习笔记:朴素贝叶斯 机器学习系列(四):朴素贝叶斯(华强买瓜版) - yyxy的文章 - 知乎 十分钟,让你再也忘不掉贝叶斯分类 - VoidHaruhi的文章 - 知乎 《机器学习》(西瓜书&am…

快速生成单元测试

1. Squaretest插件 2. 依赖 <dependency><groupId>junit</groupId>