隐藏侧边栏

ELK 运维入门(1)- Elasticsearch 8.1 单机安装以及常用配置详解 - 基于CentOS 7.9

nemo
2022-03-15 / 2 评论 / 6 点赞 / 2,224 阅读 / 25,774 字
温馨提示:
本文最后更新于 2022-06-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

ELK简介

ELK官网:Elasticsearch: The Official Distributed Search & Analytics Engine | Elastic

ELK 是三个开源项目的首字母缩写,分别是:Elasticsearch(存储分析)、Logstash(采集过滤) 和 Kibana(展示),它们是elastic公司研发的一套完整的日志收集、分析和展示的企业级解决方案

其中,Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到 Elasticsearch 的存储库中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。此外还有轻量型的单一功能数据采集器(Logstash 的轻量版),即 Beats

Elastic Stack 是 ELK Stack 的更新换代产品(新版本的新名称)

特点

  • Elasticsearch :支持集群、数据分片和备份;RESTful 接口;支持JSON
  • Logstash :通过插件实现日志多输入多输入的收集转发,支持日志过滤;支持自定义 JSON 格式的日志解析
  • Kibana :通过 Elasticsearch 的API接口进行数据操作 ,可以生成表格、绘制各种图形

在运维中的作用

  • 分布式日志数据统一收集,实现集中查询和管理分布式日志
  • 安全信息和事件管理
  • 报表功能
  • 故障恢复,故障自愈
  • 性能分析,用户行为分析

ELK架构

架构图

01_ELK_extend_structure

由 Logstash 或 Beats 对主机日志或者服务日志进行采集,发送到 Elasticsearch 单机或集群(中间可能经过缓存),Kibana 调用 Elasticsearch 的 API 对数据进行检索和展示

Elasticsearch 集群中的 master 和 datanode 的分工

  • master:负责统计集群状态信息、各个 datanode 节点的状态信息;负责创建、分配、删除索引;负责关闭 datanode 节点
  • datanode:数据相关操作,例如:CURD操作、检索、聚合等
  • master 和 datanode 可以在同一个 Elasticsearch 实例,也可以分离

Elasticsearch 集群建议奇数台(3、5、7...),方便选举 master

Elasticsearch 简介

Elasticsearch 官方文档:Elasticsearch Guide [8.1] | Elastic

Elasticsearch 官方下载地址:Download Elasticsearch | Elastic

Elasticsearch 的存储机制

存储图

02_shard

存储机制说明

  • 索引(Index)

    一个索引相当于是一个数据库的表,如存某网站的用户信息,就可以创建一个名为 user 的索引。但索引存储的时候并不是整个存一起的,它是被分片存储的

  • 分片(Shard)

    分片是数据的容器,数据保存在分片内,一个索引可以有多个分片,这些分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里,所以相当于一份数据被分成了多份并保存在不同的主机上

    如果一台主机挂掉了,那么这个分片里面的数据不就无法访问了?别的主机都是存储的其他的分片。其实是可以解决这个问题的,只需要让其他主机存储这个分片的备份,叫做副本

  • 副本(Replica)

    副本就是对原分片的复制,和原分片的内容是一样的,Elasticsearch 默认会生成一份副本,相当于一份数据存了两份

Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在不同的主机上,这样可以提高容错率、提高可用性

安装注意事项

ELK对操作系统版本支持情况详解:支持矩阵 | Elastic

Elasticsearch 服务与 Logstash 服务基于 Java 环境,因此需要安装 Java环境;但在新版本(7、8)的官方下载中已经自带了JDK,不需要单独下载安装;Elasticsearch 和 Logstash 与 JDK 版本对应关系详见:支持矩阵 | Elastic

可以在官方链接中下载不带JDK的版本,链接地址:Past Releases of Elastic Stack Software | Elastic

03_download_past-release

安装建议

生产中建议给 Elasticsreach 主机配置单独的数据硬盘,与系统盘分开。或者直接使用共享存储(NAS 或 SAN)

Elasticsearch 不仅提供了 tar 包、 rpm 包、deb 包等,还有各种常见操作系统的包管理器的仓库,例如:yum、apt-get 等;可以根据操作系统和项目情况选择安装方式

本文列举了三种安装方式,选择适合自己的方式即可

安装方式参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html

单机安装配置

安装过程参考:Installing Elasticsearch | Elasticsearch Guide [8.1] | Elastic

准备

主机设置

主机IP配置操作系统安装服务
es-1.skynemo.cn192.168.1.198内存建议 2G 以上CentOS 7.9.2009elasticsearch

主机已完成下面配置

  • 关闭防火墙
  • 配置国内的yum源(apt源)
  • 修改主机名称(建议配置,方便识别)

安装(推荐YUM或RPM)

方式一:YUM安装

适用于互联网主机,YUM安装本质上即下载RPM安装,不同在于安装最新版本时更方便

仓库地址及YUM安装流程:Install Elasticsearch with RPM | Elasticsearch Guide [8.1] | Elastic

# 设置 YUM 仓库
[root@es-1 ~]# cat > /etc/yum.repos.d/elasticsearch.repo << EOF
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md
EOF

# 安装 Elasticsearch
[root@es-1 ~]# yum install --enablerepo=elasticsearch elasticsearch -y

# 配置命令行工具路径
[root@es-1 ~]# vi /etc/profile.d/es-common-line.sh
# config elasticsearch common line path
export PATH=$PATH:/usr/share/elasticsearch/bin/


[root@es-1 ~]# source /etc/profile

方式二:RPM包安装

RPM包下载地址及安装流程:Install Elasticsearch with RPM | Elasticsearch Guide [8.1] | Elastic

# curl 直接下载 RPM 包到主机上
[root@es-1 ~]# curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.0-x86_64.rpm

# 安装
[root@es-1 ~]# rpm -ivh elasticsearch-8.1.0-x86_64.rpm 


# 配置命令行工具路径
[root@es-1 ~]# vi /etc/profile.d/es-common-line.sh
# config elasticsearch common line path
export PATH=$PATH:/usr/share/elasticsearch/bin/


[root@es-1 ~]# source /etc/profile

方式三:TAR包安装

TAR 包解压安装配置极为复杂,不推荐初学者使用

创建 elasticsearch 运行用户

[root@es-1 ~]# groupadd -r elasticsearch
[root@es-1 ~]# useradd -r -g elasticsearch -s /sbin/nologin -c "elasticsearch user" -M elasticsearch

创建 elasticsearch 目录

# 创建 elasticsearch 软件目录 
[root@es-1 ~]# mkdir -p /apps/

# 创建PID存放目录
[root@es-1 ~]# mkdir -p /var/run/elasticsearch

下载解压elasticsearch

# 下载
[root@es-1 ~]# curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.0-linux-x86_64.tar.gz
# 解压
[root@es-1 ~]# tar -xf elasticsearch-8.1.0-linux-x86_64.tar.gz -C /apps/
# 重命名
[root@es-1 ~]# mv /apps/elasticsearch-8.1.0/ /apps/elasticsearch


# 创建配置文件链接到默认目录,方便查找
[root@es-1 ~]# ln -sf /apps/elasticsearch/config /etc/elasticsearch

配置systemd管理(可选,建议配置)

/usr/lib/systemd/system/elasticsearch.service 配置系统环境默认参数,方便管理软件以及配置;若不配置 systemd 管理,则需要配置较多的系统环境参数

[root@es-1 ~]# vi /usr/lib/systemd/system/elasticsearch.service
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target

[Service]
Type=forking
RuntimeDirectory=elasticsearch
PrivateTmp=true
Environment=ES_HOME=/apps/elasticsearch
Environment=ES_PATH_CONF=/etc/elasticsearch
Environment=PID_DIR=/var/run/elasticsearch
Environment=ES_SD_NOTIFY=true
EnvironmentFile=-/etc/sysconfig/elasticsearch

WorkingDirectory=/apps/elasticsearch

User=elasticsearch
Group=elasticsearch

#ExecStart=/apps/elasticsearch/bin/elasticsearch -d -p \${PID_DIR}/elasticsearch.pid 
ExecStart=/apps/elasticsearch/bin/systemd-entrypoint -d -p \${PID_DIR}/elasticsearch.pid 

# StandardOutput is configured to redirect to journalctl since
# some error messages may be logged in standard output before
# elasticsearch logging system is initialized. Elasticsearch
# stores its logs in /var/log/elasticsearch and does not use
# journalctl by default. If you also want to enable journalctl
# logging, you can simply remove the "quiet" option from ExecStart.
StandardOutput=journal
StandardError=inherit

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65535
# Specifies the maximum number of processes
LimitNPROC=4096
# Specifies the maximum size of virtual memory
LimitAS=infinity
# Specifies the maximum file size
LimitFSIZE=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=0
# SIGTERM signal is used to stop the Java process
KillSignal=SIGTERM
# Send the signal only to the JVM rather than its control group
KillMode=process
# Java process is never killed
SendSIGKILL=no
# When a JVM receives a SIGTERM signal it exits with code 143
SuccessExitStatus=143
# Allow a slow startup before the systemd notifier module kicks in to extend the timeout
TimeoutStartSec=75

[Install]
WantedBy=multi-user.target
# Built for packages-8.1.0 (packages)

创建启动脚本

[root@es-1 ~]# vi /apps/elasticsearch/bin/systemd-entrypoint
#!/bin/sh

# This wrapper script allows SystemD to feed a file containing a passphrase into
# the main Elasticsearch startup script

if [ -n "$ES_KEYSTORE_PASSPHRASE_FILE" ] ; then
  exec /apps/elasticsearch/bin/elasticsearch "$@" < "$ES_KEYSTORE_PASSPHRASE_FILE"
else
  exec /apps/elasticsearch/bin/elasticsearch "$@"
fi


# 授权启动脚本
[root@es-1 ~]# chmod 755 /apps/elasticsearch/bin/systemd-entrypoint

配置默认变量

[root@es-1 ~]# vi /etc/sysconfig/elasticsearch
################################
# Elasticsearch
################################

# Elasticsearch home directory
ES_HOME=/apps/elasticsearch

# Elasticsearch Java path
ES_JAVA_HOME=/apps/elasticsearch/jdk

# Elasticsearch configuration directory
# Note: this setting will be shared with command-line tools
ES_PATH_CONF=/etc/elasticsearch

# Elasticsearch PID directory
PID_DIR=/var/run/elasticsearch

# Additional Java OPTS
#ES_JAVA_OPTS=

# Configure restart on package upgrade (true, every other setting will lead to not restarting)
#RESTART_ON_UPGRADE=true

授权

[root@es-1 ~]# chown -R elasticsearch:elasticsearch /apps/elasticsearch
[root@es-1 ~]# chown -R elasticsearch:elasticsearch /var/run/elasticsearch

设置路径

# 配置命令行工具路径
[root@es-1 ~]# vi /etc/profile.d/es-common-line.sh
# config elasticsearch common line path
export PATH=$PATH:/apps/elasticsearch/bin/


[root@es-1 ~]# source /etc/profile

Elasticsearch 配置

配置参考:Important Elasticsearch configuration | Elasticsearch Guide [8.1] | Elastic

Elasticsearch 相关的配置文件

  • elasticsearch.yml :Elasticsearch 节点、集群信息的主要配置文件
  • jvm.options :配置 JVM 信息
  • log4j2.properties:配置 Elasticsearch 的日志信息
  • /etc/sysconfig/elasticsearch :该文件可以配置一些环境变量,例如:配置文件的默认目录 ES_PATH_CONF(使用 RPM 和 Debian 软件包安装时会自动创建,TAR 包安装时则是手动创建)

创建存储目录

# 创建数据、日志目录、临时目录
[root@es-1 ~]# mkdir -p /es/{data,logs,tmp}

# 授权
[root@es-1 ~]# chown -R elasticsearch:elasticsearch /es

配置 elasticsearch 单机环境

[root@es-1 ~]# vi /etc/elasticsearch/elasticsearch.yml
# 配置集群名称。集群名称相同表示在同一个集群
cluster.name: es-cluster-standalone
# 配置节点名称
node.name: es-1

# 配置数据目录
path.data: /es/data
# 配置日志目录
path.logs: /es/logs

# 配置暴露服务的IP
network.host: 0.0.0.0

# 配置服务端口
http.port: 9200

# 允许通配符删除索引
action.destructive_requires_name: true



# 配置集群初始时,作为master的主机,单节点时配置本节点名称(node.name)
# 必须使用完整的 node.name
# 重新启动集群或向现有集群添加新节点时,不要使用此设置
cluster.initial_master_nodes: ["es-1"]

# 配置启动时要发现的master列表(IP 或 可解析的域名),端口默认为9300
# 单节点时不用配置或配置为本节点IP
# discovery.seed_hosts: ["192.168.1.198"]

系统环境配置

重要的系统配置:Important system configuration | Elasticsearch Guide [8.1] | Elastic

YUM、RPM安装所需配置

apt、deb等包管理安装的配置类似

使用 RPM 或者 Debian 包安装时,需要的大部分系统环境默认参数已经写到 /usr/lib/systemd/system/elasticsearch.service 里,可以根据需要自行修改(一般不用修改),或者创建 /etc/systemd/system/elasticsearch.service.d/override.conf 配置进行覆盖

配置系统参数

禁用交换或防止频繁交换内存区域

禁用交换内存区域可以提升节点的稳定性和性能

# 方式一:完全禁止交换(推荐)
# 临时禁止,重启后恢复,适用于不能重启的主机
[root@es-1 ~]# swapoff -a
# 永久禁止,注释 /etc/fstab 中与 swap 相关的行,重启依旧有效
[root@es-1 ~]# vi /etc/fstab
...
# /swapfile                   none            swap    sw              0       0
...


# 方式二:systemd 的 [Service] 下新增一条 允许内存锁定 的配置(不推荐)
[root@es-1 ~]# vi /usr/lib/systemd/system/elasticsearch.service
[Service]
....
LimitMEMLOCK=infinity
....

TAR包解压安装所需配置

TAR 包安装的 elasticsearch 如果配置了 systemd 管理,并在其中配置了系统参数,则

需配置的参数

  • 必须配置的参数

    • 增加mmap的计数限制(VMA数量),最少需要 262144

    • 禁止交换 或 限制交换

  • 若配置了 systemd管理,则无需配置以下两个系统参数

    • elasticsearch 的运行用户的最大打开文件数,最少需要 65535
    • elasticsearch 的运行用户的最大线程数,最少需要 4096

配置系统参数

# 配置全局系统参数:mmap的计数限制
[root@es-1 ~]# cat >> /etc/sysctl.conf <<EOF
# 配置系统单个进程可以拥有的 VMA (虚拟内存区域)的数量,最少需要 262144 
vm.max_map_count = 262144
EOF

# 应用参数配置
[root@es-1 ~]# sysctl -p

# 查看参数配置
[root@es-1 ~]# sysctl -a | grep 'vm.max_map_count'


# 配置 elasticsearch 用户的限制
[root@es-1 ~]# cat >> /etc/security/limits.conf << EOF
# 配置用户elasticsearch打开的最大文件数,最少需要 65535
elasticsearch                soft    nofile          1000000
elasticsearch                hard    nofile          1000000
# 配置用户elasticsearch最大线程数,最少需要 4096
elasticsearch                soft    nproc           1000000
elasticsearch                hard    nproc           1000000
EOF

禁用交换或防止频繁交换内存区域

禁用交换内存区域可以提升节点的稳定性和性能

# 方式一:完全禁止交换(推荐)
# 临时禁止,重启后恢复,适用于不能重启的主机
[root@es-1 ~]# swapoff -a
# 永久禁止,注释 /etc/fstab 中与 swap 相关的行,重启依旧有效
[root@es-1 ~]# vi /etc/fstab
...
# /swapfile                   none            swap    sw              0       0
...


# 方式二:配置最小交换(不推荐)
[root@es-1 ~]# vi /etc/sysctl.conf
vm.swappiness=1


# 方式三:允许内存锁定(不推荐)
# 未启动 elasticsearch 时,直接编辑 elasticsearch.yml
vi   elasticsearch.yml
bootstrap.memory_lock: true
# 已启动 elasticsearch 时,配置系统参数限制允许内存锁定
/etc/security/limits.conf
# 
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

其他设置

性能设置(建议配置)

[root@es-1 ~]# cat >> /etc/sysctl.conf <<EOF
# 配置TCP重传的最大次数减少到5次,超时时间约为6秒,方便及时发现节点故障
net.ipv4.tcp_retries2=5
EOF

# 应用参数配置
[root@es-1 ~]# sysctl -p

# 查看参数配置
[root@es-1 ~]# sysctl -a | grep 'net.ipv4.tcp_retries2'

临时目录设置(建议配置)

修改临时目录

默认情况下,Elasticsearch 使用启动脚本在系统 /tmp 下创建的私有临时目录

在某些Linux发行版上,如果文件和目录最近未被访问,系统实用程序将从 /tmp 中清除它们。如果长时间不使用需要临时目录的功能,此行为可能会导致在 Elasticsearch 运行时的专用临时目录被系统删除,随后使用需要此目录的功能,则会出现问题

使用 RPM 或者 Debian 包安装时,不会出现该问题

在使用 TAR包安装时,在启动 Elasticsearch 之前,可以将 $ES_TMPDIR 环境变量设置为不同位置的专用临时目录,以规避问题

# 配置环境变量 $ES_TMPDIR,使用不同位置的临时目录(推荐)
[root@es-1 ~]# cat > /etc/profile.d/es.sh << EOF
export ES_TMPDIR=/es/tmp
EOF

# 加载环境变量
[root@es-1 ~]# source /etc/profile

/tmp 挂载设置

根据 Linux 系统进行设置,CentOS 一般不用设置

Elasticsearch 运行时允许需要加载一些 Java Native Access ( JNA ) 库到 /tmp 目录中,一些 Linux 系统的 /tmp 目录挂载带有 noexec 选项,会导致 Elasticsearch 运行出错

可以在启动 Elasticsearch 之前,将 $ES_TMPDIR 环境变量修改为其他临时目录

# 查看挂载情况
findmnt -l

# 方式一:删除 /tmp 文件系统中的 noexec 选项(不推荐)


# 方式二:配置环境变量 $ES_TMPDIR,使用不同位置的临时目录(推荐)
[root@es-1 ~]# cat > /etc/profile.d/es.sh << EOF
export ES_TMPDIR=/es/tmp
EOF

# 加载环境变量
[root@es-1 ~]# source /etc/profile

Java 环境设置(一般无需设置)

JVM heap 大小设置

官网参考:Advanced configuration | Elasticsearch Guide [8.1] | Elastic

自动调整堆大小需要绑定 JDK,如果使用自定义 JRE 位置,则需要 Java 14或更高版本的 JRE

默认情况下,Elasticsearch 会根据节点的角色和总内存自动设置 JVM heap 大小。对于大多数生产环境,建议使用默认大小

设置 JVM heap 大小基于当前系统的可用内存(RAM),XmsXmx 值必须相同,并且不超过总内存的 50%,最大值一般不超过压缩普通对象指针(OOP)的阈值,大多数系统为 26GB,某些系统可以到 30GB

# 可以在 Elasticsearch 日志中看到类似的输出,以检查 JVM heap 大小是否超出阈值
heap size [1.9gb], compressed ordinary object pointers [true]

需要修改设置时,可以在 jvm.options.d 目录下创建一个 .options 结尾的文件,在其中设置 JVM heap 大小

# 示例-设置 JVM heap 最大最小值为 2GB
vi ${ES_HOME}/config/jvm.options.d/heap.options
-Xms2g
-Xmx2g

JVM 堆转存(heap dump)文件路径设置

使用 RPM 和 Debian 软件包安装时,JVM heap dump路径是 /var/lib/elasticsearch;在 TAR 包安装时,路径在 Elasticsearch 安装的根目录下

可以修改 jvm.options 中的 -XX:HeapDumpPath=*** 选项,对 JVM heap dump路径进行设置

GC 日志设置

一般无需设置

GC日志 默认输出到与 Elasticsearch 日志相同的位置。默认配置每64MB循环一次日志,最多可占用2GB的磁盘空间

# 示例-常用的 gc 设置

vi $ES_HOME/config/jvm.options.d/gc.options
# Turn off all previous logging configuratons
-Xlog:disable

vi $ES_HOME/config/jvm.options.d/gc.options
# Default settings from JEP 158, but with `utctime` instead of `uptime` to match the next line
-Xlog:all=warning:stderr:utctime,level,tags

vi $ES_HOME/config/jvm.options.d/gc.options
# Enable GC logging to a custom location with a variety of options
-Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,pid,tags:filecount=32,filesize=64m

致命错误日志(JVM fatal error log)设置

默认情况下,Elasticsearch 将 JVM 致命错误日志写入默认日志目录。

使用 RPM 和 Debian 软件包安装时,这个目录是 /var/log/elasticsearch 。在 TAR 包安装时,日志目录位于 Elasticsearch 安装的根目录下

可以修改 jvm.options 中的 -XX:ErrorFile= 选项,对 JVM 致命错误日志存储路径进行设置

安全配置

Elasticsearch 在 6.8 版本后开始免费提供一些基础安全功能,例如:基于文件验证和本地身份验证、基于角色的访问控制等;但高级安全功能仍属于收费范畴,例如: 自定义身份验证和授权 Realm,详见官网会员服务:订阅 | Elastic Stack 产品和支持 | Elastic

如果使用的 Elasticsearch 是 6.8 版本之前,可以使用 nginx 代理,然后在 nginx 设置密码以规避等保测评等安全检查

安全功能相关

内置用户

内置用户文档:Built-in users | Elasticsearch Guide [8.1] | Elastic

  • elastic:超级用户
  • kibana_system: Kibana 连接到 Elasticsearch 时使用
  • logstash_system: Logstash 存储监控信息到 Elasticsearch 时使用
  • beats_system: Beats 存储监控信息到 Elasticsearch 时使用
  • apm_system: APM 服务连接到 Elasticsearch 时使用
  • remote_monitoring_user: Metricbeat 收集和存储监控信息到 Elasticsearch 时使用,具有 remote_monitoring_agentremote_monitoring_collector 两个内置角色

安全配置提示信息

开启安全功能时,启动 elasticsearch 会提示一些安全配置信息(如:超级用户密码等)

####### YUM安装、RPM安装时提示如下 #######
--------------------------- Security autoconfiguration information ------------------------------

Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

# 超级用户(elastic)密码
The generated password for the elastic built-in superuser is : Zefx*dR7m*Tbbm5zZ_sC

# 如何加入已经存在的集群
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.

You can complete the following actions at any time:
# 如何重置超级用户的密码
Reset the password of the elastic built-in superuser with 
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
# 如何生成 Kibana 的 注册 token
Generate an enrollment token for Kibana instances with 
 '/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
# 如何生成集群 token
Generate an enrollment token for Elasticsearch nodes with 
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.

-------------------------------------------------------------------------------------------------


####### TAR包安装后,初次启动也会提示类似以下信息 #######
# 超级用户(elastic)密码
The generated password for the elastic built-in superuser is:
<password>

The enrollment token for Kibana instances, valid for the next 30 minutes:
<enrollment-token>

The hex-encoded SHA-256 fingerprint of the generated HTTPS CA DER-encoded certificate:
<fingerprint>

# 如何重置超级用户的密码
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'bin/elasticsearch-reset-password -u elastic'.

# 如何生成 Kibana 的 注册 token
Generate an enrollment token for Kibana instances with
'bin/elasticsearch-create-enrollment-token -s kibana'.

# 如何生成集群 token
Generate an enrollment token for Elasticsearch nodes with
'bin/elasticsearch-create-enrollment-token -s node'.

常用的安全配置

vi /etc/elasticsearch/elasticsearch.yml

...............
# 安全功能的开关,默认为 true
xpack.security.enabled: true

xpack.security.enrollment.enabled: true

# 配置http安全(Kibana、Logstash等)
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12

# 配置传输层安全(集群节点相互通信)
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  client_authentication: required
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12


# Allow HTTP API connections from localhost and local networks
# Connections are encrypted and require user authentication
http.host: [_local_, _site_]

# Allow other nodes to join the cluster from localhost and local networks
# Connections are encrypted and mutually authenticated
#transport.host: [_local_, _site_]

...............

常用命令行工具

官网参考:Command line tools | Elasticsearch Guide [8.1] | Elastic

证书管理

elasticsearch-certutil 命令简化了证书的创建,拥有 ca、cert、csr、http 四种模式

CA 模式

CA 模式会生成一个新的证书颁发机构(ca),默认情况下,生成一个 PKCS#12 格式的输出文件,其中保存 ca 证书和 ca 的私钥。如果指定 --pem 参数,该命令将生成一个 zip 文件,其中包含 PEM 格式的证书和私钥

CERT 模式

CERT 模式生成 X.509 格式的证书和私钥。

默认情况下,它生成一对证书和密钥,用于单个实例。要,指定 --multiple 参数时,可以为多个实例生成证书和密钥,需要提供有关每个实例的详细信息,或者使用 --in 参数指定包含实例详细信息的 YAML 文件

默认情况下,生成一个 PKCS#12 格式的输出文件,其中包含实例证书、实例私钥和CA证书。如果指定 --pem 参数,该命令将生成 PEM 格式的证书和密钥,并将它们打包到zip文件中

CSR 模式

CSR 模式生成证书签名请求(csr),可以将其发送到受信任的证书颁发机构以获取签名证书。签名证书必须采用 PEM 或 PKCS#12 格式,才能与 Elasticsearch 安全功能配合使用

默认情况下,该命令为单个实例生成单个 csr。要为多个实例生成 csr,请指定 --multiple 参数,该参数将提示您输入每个实例的详细信息。或者使用 --in 参数指定包含实例详细信息的 YAML 文件。

默认情况下,生成一个zip文件,其中包含每个实例的 csr 和 密钥(私钥)。其中每个 csr 都是标准 PEM 编码的 PKCS#10 CSR。每个密钥都是 PEM 编码 的 RSA私钥

HTTP 模式

HTTP 模式会以交互式生成证书,以便在 Elasticsearch 的 http(REST)接口上使用。根据选择,可以生成一个包含证书颁发机构(CA)、证书签名请求(CSR)文件,或者是其他证书和密钥

命令格式

bin/elasticsearch-certutil
(
(ca [--ca-dn <name>] [--days <n>] [--pem])

| (cert ([--ca <file_path>] | [--ca-cert <file_path> --ca-key <file_path>])
[--ca-dn <name>] [--ca-pass <password>] [--days <n>]
[--dns <domain_name>] [--in <input_file>] [--ip <ip_addresses>]
[--multiple] [--name <file_name>] [--pem] [--self-signed])

| (csr [--dns <domain_name>] [--in <input_file>] [--ip <ip_addresses>]
[--name <file_name>])

[-E <KeyValuePair>] [--keysize <bits>] [--out <file_path>]
[--pass <password>]
)

| http

[-h, --help] ([-s, --silent] | [-v, --verbose])

示例

创建CA

bin/elasticsearch-certutil ca

使用新的 CA 创建 X.509 证书和私钥

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

(静默模式)使用新的 CA 创建 X.509 证书和私钥

# 创建实例信息
vi instances.yml
instances:
  - name: "node1" 
    ip: 
      - "192.0.2.1"
    dns: 
      - "node1.mydomain.com"
  - name: "node2"
    ip:
      - "192.0.2.2"
      - "198.51.100.1"
  - name: "node3"
  - name: "node4"
    dns:
      - "node4.mydomain.com"
      - "node4.internal"
  - name: "CN=node5,OU=IT,DC=mydomain,DC=com"
    filename: "node5" 

# 生成证书
bin/elasticsearch-certutil cert --silent --in instances.yml --out test1.zip --pass testpassword --ca elastic-stack-ca.p12
内置用户密码重置

elasticsearch-reset-password 命令可以重置本机 Realm 和内置用户的密码

命令格式

bin/elasticsearch-reset-password
[-a, --auto] [-b, --batch] [-E <KeyValuePair]
[-f, --force] [-h, --help] [-i, --interactive]
[-s, --silent] [-u, --username] [--url] [-v, --verbose]

示例

### 修改所有内置用户的密码 ###
# elasticsearch 8.0 版本以前
bin/elasticsearch-setup-passwords interactive

# elasticsearch 8.0 版本及以后
bin/elasticsearch-reset-password interactive

### 重置指定内置用户的密码 ###
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-reset-password  -u elastic
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y


Password for the [elastic] user successfully reset.
New value: +dl4RCO-seyUXPTxllF-
token管理

elasticsearch-create-enrollment-token 可以创建一个 token,该 token 将用于新的 Elasticsearch 节点注册到现有集群,或配置 Kibana 实例与已启用安全功能的现有 Elasticsearch 集群通信

命令格式

bin/elasticsearch-create-enrollment-token
[-f, --force] [-h, --help] [-E <KeyValuePair>] [-s, --scope] [--url]

示例

生成节点 token

bin/elasticsearch-create-enrollment-token -s node

生成Kibana 实例 token

bin/elasticsearch-create-enrollment-token -s kibana --url "https://172.0.0.3:9200"
重新配置节点工具

elasticsearch-reconfigure-node 命令可以将 Elasticsearch 节点重新配置为加入已启用安全功能的现有集群(该节点必须是通过RPM或DEB包安装)

命令格式

bin/elasticsearch-reconfigure-node
[--enrollment-token] [-h, --help] [-E <KeyValuePair>]
[-s, --silent] [-v, --verbose]

示例

sudo /usr/share/elasticsearch/elasticsearch-reconfigure-node --enrollment-token <TOKEN>
用户管理

在使用基于文件的身份验证时,elasticsearch-users 命令可以用来添加、删除用户、为用户指定角色、管理每个节点的密码

命令格式

bin/elasticsearch-users
([useradd <username>] [-p <password>] [-r <roles>]) |
([list] <username>) |
([passwd <username>] [-p <password>]) |
([roles <username>] [-a <roles>] [-r <roles>]) |
([userdel <username>])

示例

# 添加用户
bin/elasticsearch-users useradd jacknich -p theshining -r network,monitoring

# 查看用户列表
bin/elasticsearch-users list
rdeniro        : admin
alpacino       : power_user
jacknich       : monitoring,network

# 修改密码
bin/elasticsearch-users passwd jachnich


# 删除用户
bin/elasticsearch-users userdel jacknich
密钥库管理

elasticsearch-keystore 命令用于管理 Elasticsearch 的一些安全设置,防止一些设置或密码明文写入配置文件中

命令格式

bin/elasticsearch-keystore
( [add <settings>] [-f] [--stdin]
| [add-file (<setting> <path>)+]
| [create] [-p]
| [has-passwd]
| [list]
| [passwd]
| [remove <setting>]
| [show [-o <output-file>] <setting>]
| [upgrade]
) [-h, --help] ([-s, --silent] | [-v, --verbose])

示例

# 创建密钥库,并设置密码
bin/elasticsearch-keystore create -p

# 查看密钥库已有的设置
bin/elasticsearch-keystore list

# 添加设置
bin/elasticsearch-keystore add the.setting.name.to.set

# 查看设置的值
bin/elasticsearch-keystore show the.name.of.the.setting.to.show

# 删除设置
bin/elasticsearch-keystore remove the.setting.name.to.remove

YUM、RPM安装所需配置

YUM、RPM安装时,会自动创建可提供单节点运行的证书,并且自动运行 elasticsearch-reconfigure-node,所以无需进行配置

TAR包解压安装所需配置

Set up basic security for the Elastic Stack | Elasticsearch Guide [8.1] | Elastic

Set up basic security for the Elastic Stack plus secured HTTPS traffic | Elasticsearch Guide [8.1] | Elastic

创建CA

# 创建一个CA,证书有效期3650天,默认1095天,密码为 520123
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-certutil ca --ca-dn "CN=Elastic Certificate Tool Autogenerated CA" --days 3650 --out "/etc/elasticsearch/elastic-stack-ca.p12"
This tool assists you in the generation of X.509 certificates and certificate
signing requests for use with SSL/TLS in the Elastic stack.

The 'ca' mode generates a new 'certificate authority'
This will create a new X.509 certificate and private key that can be used
to sign certificate when running in 'cert' mode.

Use the 'ca-dn' option if you wish to configure the 'distinguished name'
of the certificate authority

By default the 'ca' mode produces a single PKCS#12 output file which holds:
    * The CA certificate
    * The CA's private key

If you elect to generate PEM format certificates (the -pem option), then the output will
be a zip file containing individual files for the CA certificate and private key
# 配置CA信息的密码
Enter password for elastic-stack-ca.p12 : 

生成实例传输层证书和密钥

用于节点间的发现和通信加密,建议使用自建CA签发证书

# 创建实例信息
[root@es-1 ~]# vi /etc/elasticsearch/instances.yml
instances:
  - name: "CN=es-1.skynemo.cn"
    ip: 
      - "192.168.1.198"
    filename: "transport" 

# 生成证书,指定CA,配置密码为 123456
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-certutil cert --silent --in "/etc/elasticsearch/instances.yml" --out "/etc/elasticsearch/certs.zip" --pass "123456" --ca "/etc/elasticsearch/elastic-stack-ca.p12" --ca-pass "520123"


# 解压,需有安装 unzip,或下载到本地后解压再上传
[root@es-1 ~]# unzip /etc/elasticsearch/certs.zip -d /etc/elasticsearch/

# 重命名
[root@es-1 ~]# mv /etc/elasticsearch/transport /etc/elasticsearch/certs

配置传输层证书

[root@es-1 ~]# vi /etc/elasticsearch/elasticsearch.yml

# 配置安全功能开关
xpack.security.enabled: true

# 配置传输层安全(TLS)
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  client_authentication: required
  keystore.path: certs/transport.p12
  truststore.path: certs/transport.p12



# 如果证书配置了密码,则需要在密钥库添加配置
# 创建keystore,不指定密码,否则每次启动时都需要输入keystore密码,并且只能以命令行方式启动
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-keystore create
Created elasticsearch keystore in /apps/elasticsearch/config/elasticsearch.keystore


# 填入传输层证书密码(此处为123456)
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
Enter value for xpack.security.transport.ssl.keystore.secure_password: 


[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
Enter value for xpack.security.transport.ssl.truststore.secure_password: 

创建节点HTTPS证书和密钥

如果有中央CA,可以创建CSR申请中央CA的证书,此处使用自建CA

# 生成 https 证书的主要步骤如下,根据需要生成即可
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-certutil http

# 选择是否生成证书请求文件 csr
Generate a CSR? [y/N]n
# 是否使用现有的CA
Use an existing CA? [y/N]y
# 输入CA路径
CA Path: /etc/elasticsearch/elastic-stack-ca.p12
# 输入CA密码
Password for elastic-stack-ca.p12:
# 生成证书的有效时间
For how long should your certificate be valid? [5y] 10y
# 是否每个节点都生成证书
Generate a certificate per node? [y/N]y
# 输入第一个节点的名称(与 elasticsearch.yml 中的 node.name 一致)
node #1 name: es-1
# 输入第一个节点的主机名

Enter all the hostnames that you need, one per line.
When you are done, press <ENTER> once more to move on to the next step.

es-1.skynemo.cn

You entered the following hostnames.

 - es-1.skynemo.cn

# 确认主机名
Is this correct [Y/n]Y

# 输入第一个节点的IP
Enter all the IP addresses that you need, one per line.
When you are done, press <ENTER> once more to move on to the next step.

192.168.1.198

You entered the following IP addresses.

 - 192.168.1.198

# 确认IP
Is this correct [Y/n]Y

# 确认节点信息是否需要修改
Do you wish to change any of these options? [y/N]N
# 是否生成其他节点证书
Generate additional certificates? [Y/n]n
# 证书密码(666666)
Provide a password for the "http.p12" file:  [<ENTER> for none]
Repeat password to confirm: 
# 证书的存储路径
What filename should be used for the output zip file? [/apps/elasticsearch/elasticsearch-ssl-http.zip] /etc/elasticsearch/elasticsearch-ssl-http.zip

Zip file written to /etc/elasticsearch/elasticsearch-ssl-http.zip


# 解压
[root@es-1 ~]# unzip /etc/elasticsearch/elasticsearch-ssl-http.zip -d /etc/elasticsearch

# 移动 https 证书和密钥文件 http.p12 到 certs 目录中
[root@es-1 ~]# mv /etc/elasticsearch/elasticsearch/http.p12 /etc/elasticsearch/certs/

配置HTTPS证书

[root@es-1 ~]# vi /etc/elasticsearch/elasticsearch.yml
# 配置https安全(用于Kibana、Logstash等)
xpack.security.http.ssl:
  enabled: true
  keystore.path: certs/http.p12
  
  
# 密钥库添加配置,填入https证书密码(此处为666666)
[root@es-1 ~]# /apps/elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
Enter value for xpack.security.http.ssl.keystore.secure_password: 

证书文件权限设置

[root@es-1 ~]# chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs

[root@es-1 ~]# chmod 766 /apps/elasticsearch/config/elasticsearch.keystore

启动测试

# 启动并设置开机启动
[root@es-1 ~]# systemctl enable --now elasticsearch

访问测试

需要状态值(status)为 green

# 使用浏览器访问 https://192.168.1.198:9200/_cluster/health 进行验证,出现如下信息
# 需要输入安全配置提示信息中 elastic 内置用户的密码,或者重置后的密码
{"cluster_name":"es-cluster","status":"green","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":2,"active_shards":2,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":0,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":100.0}


# 也可以使用curl进行验证
[root@es-1 ~]# curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://localhost:9200/_cluster/health

响应信息中最重要的一块就是 status 字段,表示集群的健康这状态。状态可能是下列三个值之一:

  • green

    所有的主分片和副本分片都已分配。你的集群是 100% 可用的。

  • yellow

    所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果更多的分片消失,你就会丢数据了。把 yellow 想象成一个需要及时调查的警告。

  • red

    至少一个主分片(以及它的全部副本)都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常

0

评论区