elasticsearch基于ssl证书安全的集群搭建

一 简介

Elasticsearch 是Elastic Stack系列中的核心组件。Logstash和Beats负责收集、聚合以及丰富数据,最后存入Elasticsearch。Kibana负责数据展示,以及管理和监视堆栈。Elasticsearch使用称为倒排索引的数据结构,该结构支持非常快速的全文本搜索。

当集群中有多个 Elasticsearch 节点时,存储的文档会分布在整个集群中,并且可以从任何一个节点立即访问。Elasticsearch 的索引是由一个或多个物理分片组成的逻辑分组,每个分片实际上又是一个自包含的索引。通过将文档分布在多个分片组成的索引中,分片分布在集群中的多个节点上,Elasticsearch 可以确保一定的冗余,这样在增加节点时,既可以避免硬件故障,又可以提升查询容量,自动做到负载均衡。

72564105A50A7729D6E6BED54E66C20F.jpg

本文及后续文章讲述的场景基本架构如下:

Elasticsearch集群在生产环境部署时,为保证最低的可用性,需要至少3个可以胜任主节点的节点(有投票选举权的节点),主节点候选者过半不可用则集群服务不可用,所以3主节点候选者的集群最多能容忍一台主节点候选者不可用。

如果你只有2台服务器可用,建议要么只用1台,要么,将其中一台指定为主节点候选者,另一台指定为数据节点(并且关闭主节点)。更多关于节点的介绍,请关注后续文章。

二 性能考量

前面提到,索引是多个分片的逻辑组合,分片又分为主分片和副本分片。副本分片是主分片的一个拷贝,索引中的每个文档都隶属于一个主分片。副本可以提升集群的容错能力以及读请求能力。索引创建之初,主分片就是固定的了,但是其副本会随着集群环境变化而动态变化,这些变化对用户是透明的。

性能受多种因素的影响,例如过多的小分片会增加维护索引的开销;而减少分片数增大分片大小则会影响在集群中迁移(负载均衡)的速度。同样,查询多个小的分片在单个分片看来性能不错,但太多的查询也会增加额外的开销,所以我们更倾向于让分片稍大一点。

以下两点作为一个初步参考:

  • 平均分片大小应保持在几个GB到几十个GB之间;如果是基于时间的数据,可能在20GB到40GB之间。
  • 避免大分片问题。节点可容纳的分片数与堆大小是成正比的。通常,每GB堆中分片数量应保持在20个以内。

另外,集群节点应保持在同一个网络内,避免分布在跨数据中心的节点集群上,这样在负载均衡时效率会大打折扣。
同时为了满足高可用,Elasticsearch采用跨集群复制(CCR,Cross-cluster replication)的解决方案。

CCR可以自动将索引从主群集同步到可以用作热备份的远程备用群集。如果主机群宕掉,备用集群可以完全接管。另外CCR还可以用于提供区域读服务,例如客户可以从就近的集群中获取数据。

跨集群复制是主-被动模式的,这意味着主机群可以处理读和写,而备集群只能用于读。

三 系统配置

Elasticsearch 默认运行在开发模式下,所以对系统资源要求比较宽泛,满足不了的条件会以警告形式打印在日志中,但仍然可以运行。一旦修改了网略类的设置,比如network.host,Elasticsearch 会认为是运行在生产环境,并且会提高对系统资源的要求,如果不满足,则不再是警告,而是直接抛出异常并退出,因为这样的配置不能保证Elasticsearch正常运行,在未来可能会会导致数据丢失。
一般情况下,Elasticsearch 需要运行在单独的服务器上,并使用全部可用系统资源。所以需要对系统默认参数进行调整,以充分利用系统资源。

在准备将Elasticsearch迁移到生产环境时,以下配置必须确认:

  • 增加可用文件描述符
  • 确保有足够的线程
  • 关闭交换分区
  • 确保有足够的虚拟内存
  • JVM DNS缓存设置
  • 临时目录未用noexec挂载

3.1 增大文件描述符数量

官方建议该值不低于65536
检查:

ulimit -H -n

open files                      (-n) 4096

修改系统配置文件:

sudo vi /etc/security/limits.d/20-nproc.conf

添加以下内容并保存退出:

# max number of open file descriptors
devops      -       nofile    65535

其中devops是指当前运行Elasticsearch的用户,根据实际情况修改。

另外,针对老版本的Ubuntu Server可能存在修改后不生效的情况,如果发现不生效,检查以下内容:
对于使用init.d启动的进程, 默认会忽略limits.conf文件。
编辑/etc/pam.d/su,并取消注释以下行:

# session    required   pam_limits.so

Ubuntu Server18.04 默认已经开启

最后退出当前会话,重新登录检查:

ulimit -H -n

如果是使用RPM或Debian包安装:
一般会在系统配置文件中指定:
RPM: /etc/sysconfig/elasticsearch
Debian: /etc/default/elasticsearch

对于使用systemd的系统,必须通过systemd设置:
默认在/usr/lib/systemd/system/elasticsearch.service。
可以增加以下文件进行覆盖:/etc/systemd/system/elasticsearch.service.d/override.conf

[Service]
LimitMEMLOCK=infinity

最后输入sudo systemctl daemon-reload重新加载。

当 Elasticsearch 启动后,还可以使用如下命令检查确认:

curl  -k --user elastic:iechie1Z \
-X GET "https://192.168.0.11:9200/_nodes/stats/process?filter_path=**.max_file_descriptors&pretty"

BashCopy

3.2 增大线程数

官方建议该值设置不低于4096。
检查:

ulimit -u

不够的话使用命令临时修改:

sudo ulimit -u 4096

或者修改配置文件永久修改:

sudo vi /etc/security/limits.d/20-nproc.conf

添加以下内容并保存退出:

# max number of processes
devops      -       nproc    4096

最后退出当前会话,重新登录检查:

ulimit -u

3.3 关闭内存交换

交换分区由于是在磁盘上的文件,所以相比物理内存性能很差。为了保证 Elasticsearch 节点稳定,应尽力避免出现内存交换。
有三种方法可以关闭内存交换。官方建议是完全禁用交换,如果不能满足,或者可以考虑最小化交换或者内存锁定。

以下方案选择一种即可:

  • 完全关闭交换分区
    如果当前服务器只用于运行 Elasticsearch 服务,则完全可以关闭交换分区,因为内存主要有JVM来管理。临时关闭:sudo swapoff -a这种方式不需要重启Elasticsearch服务。永久关闭
    编辑/etc/fstab,注释掉所有包含swap关键字的行,保存重启服务器。
  • 配置最小化交换
    检查:sysctl -a |grep vm.swappiness确保将该值设置为1,以尽可能的减少交换,正常情况下应该不会出现,只在紧急情况下可能会发生交换。临时修改
    使用以下命令临时修改:sudo sysctl -w vm.swappiness=1永久修改
    或者修改配置文件已达到永久修改的目的:vi /etc/sysctl.d/vm.conf增加以下内容:vm.swappiness=1重启服务器生效。
  • 启用内存锁定
    最后一种选择是使用mlockall,尝试将进程地址空间锁定在内存中,阻止 Elasticsearch 的内存被换出。
    编译ES配置文件config/elasticsearch.yml,增加以下内容:bootstrap.memory_lock: true需要注意的是,如果mlockall尝试分配的内存超出可用空间,则可能导致JVM或Shell会话退出。Elasticsearch 启动后可以使用以下命令检查是否生效:curl -k –user elastic:iechie1Z \ -X GET “https://192.168.0.11:9200/_nodes?filter_path=**.mlockall&pretty”如果mlockall显示为true,则表示已经生效,否则可能是因为权限问题失败,继续修改配置文件:sudo vi /etc/security/limits.d/20-nproc.conf添加以下内容并保存退出:# max locked-in-memory address space (KB) devops – memlock unlimited最后退出当前会话,重新登录检查:ulimit -l更多其他原因和其他安装方式的修改可以参考[常见问题汇总(待续)]中的方案。

3.4 增大虚拟内存

Elasticsearch默认使用mmapfs目录存储索引。操作系统对mmap计数的默认限制可能太低,这可能会导致内存不足异常。
检查:

sudo sysctl -a |grep vm.max_map_count

不够的话使用以下命令临时修改:

sudo sysctl -w vm.max_map_count=262144

BashCopy

该操作无需重启操作系统;

或者修改配置文件已达到永久修改的目的:

vi /etc/sysctl.d/vm.conf

BashCopy

增加以下内容:

vm.max_map_count=262144

ConfCopy

注意该操作需要重启后生效。

RPM 和 Debian安装包会自动配置该操作,无需再配置。

3.5 DNS 缓存设置

ES启用了安全管理器,在有安全管理器的情况下,JVM默认将无限缓存正向主机名解析,10s反向解析。ES修改了该行为,将正向解析缓存时间设置为60s,反向解析为10s。这些值一般应适用于大多数环境,如果有问题,可以在jvm.options文件中修改es.networkaddress.cache.ttl和es.networkaddress.cache.negative.ttl的值。

需要注意的是,如果设置了以上两个值(默认),则在Java security policy中的networkaddress.cache.ttl=<timeout>和networkaddress.cache.negative.ttl=<timeout>的值会被ES忽略。

对于tar.gz或.zip配置文件在config/jvm.options;RPM和Debian安装的在/etc/elasticsearch/jvm.options。

3.6 确保临时目录未用noexec挂载

Elasticsearch使用JNA库来执行一些平台相关的本机代码。在Linux上,在运行时从JNA归档中提取支持该库的本机代码。默认情况下,此代码被提取到Elasticsearch临时目录,该目录默认为/tmp的子目录。该目录可以使用JVM参数-Djna.tmpdir=<path>来设置。如果/tmp目录是用noexec挂载的,则JVM无法使用该目录,要么重新挂载,要么更换目录。

可以使用以下命令检查确认:

mount |grep /tmp

如果没返回任何东西或者,在返回的结果中,/tmp一行后边不存在noexec字样就是没问题。

四 下载安装

Elasticsearch 提供了多种安装包,例如适用于Linux和macOS通用的.tar.gz;适用于Win系的.zip、.msi;适用于Debian/Ubuuntu系的.deb;适用于Red Hat/CentOS的.rpm。对于macOS还提供了brew安装;另外还提供了Docker镜像,用于在容器中运行。

对于大型集群,还提供以下配置管理工具的支持:

本文对配置管理工具的支持不作过多介绍。

本文选择使用通用的.tar.gz格式进行安装,后续其他产品也一样。默认下载的是商业版,使用的是永久免费的BASIC证书,这对我们来说功能足够用了。

各个版本功能对比参见:Elastic Stack 订阅

4.1 约定

4.1.1 目录约定

以下目录是 Elasticsearch 重要数据,对于tar.gz安装的,默认均在主目录下(临时目录除外)。为防止后续升级被误删除,我们将其更改至其他位置:

位置对应变量路径
主目录ES_HOME/var/lib/elasticsearch-7.4.1
临时目录ES_TMPDIR/opt/data/elasticsearch/tmp
配置目录ES_PATH_CONF/opt/data/elasticsearch/config
数据目录path.data/opt/data/elasticsearch/data
日志目录path.log/opt/data/elasticsearch/logs

创建所需目录:

# 主目录无需创建
sudo mkdir -p /opt/data/elasticsearch/tmp && \
sudo mkdir /opt/data/elasticsearch/config && \
sudo mkdir /opt/data/elasticsearch/data && \
sudo mkdir /opt/data/elasticsearch/logs && \
sudo chown -R devops:devops /opt/data/elasticsearch && \
ls -al /opt/data/elasticsearch

4.1.2 IP约定

本文系列文章3个节点假设使用以下3个IP:

  • 192.168.0.11 node-M1,默认节点类型
  • 192.168.0.12 node-M2,默认节点类型
  • 192.168.0.13 node-M3,默认节点类型

4.2 JDK版本

ES是一个Java应用,需要JDK环境的支持,而且ES默认自带了一个捆绑的openJDK,位于解压后的jdk子目录下,当前版本为openJDK13,如果希望使用自己的JDK,只需设置一个JAVA_HOME变量即可,否则会使用自带的JDK,JDK最低版本要求为1.8。另外,官方推荐使用LTS版本的发行版,像Java9,10,12这些短期发行版本不推荐使用。

如何确保只使用绑定的Java:
如果你的当前环境已经有配置的JAVA_HOME变量(使用echo $JAVA_HOME检查),而你想使用Elasticsearch自带的JDK,只需要编辑bin/elasticsearch-env文件,找到以下片段:

# now set the path to java
if [ ! -z "$JAVA_HOME" ]; then

然后在其中添加一行JAVA_HOME=””即可:

# now set the path to java
JAVA_HOME=""
if [ ! -z "$JAVA_HOME" ]; then

4.3 下载安装

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.1-linux-x86_64.tar.gz && \
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.1-linux-x86_64.tar.gz.sha512 && \
shasum -a 512 -c elasticsearch-7.4.1-linux-x86_64.tar.gz.sha512 

下载的文件一定要进行指纹校验,确保未被篡改。

没问题的话,会提示elasticsearch-7.4.1-linux-x86_64.tar.gz: OK,我们解压到指定的目录:

sudo tar -zxvf elasticsearch-7.4.1-linux-x86_64.tar.gz -C /var/lib && \
sudo chown -R devops:devops /var/lib/elasticsearch-7.4.1 && \
cd /var/lib/elasticsearch-7.4.1

解压后的目录elasticsearch-7.4.1称为$ES_HOME。

五 Elasticsearch配置

有三个主要配置文件,默认位于主目录的config目录下:

  • elasticsearch.yml ES配置
  • jvm.options JVM配置
  • log4j2.properties 日志配置

5.1 修改默认配置文件存放路径

使用环境变量ES_PATH_CONF来修改默认配置文件存放路径:

ES_PATH_CONF="/opt/data/elasticsearch/config"

该变量可以配置到系统环境变量中,或者在命令行中指定,或者直接保存到bin/elasticsearch-env文件中:
编辑该文件,找到以下片段(位于文件末尾处):

if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; fi

在其前面添加一行配置,将其修改为:

# custom the config path.
ES_PATH_CONF="/opt/data/elasticsearch/config"
if [ -z "$ES_PATH_CONF" ]; then ES_PATH_CONF="$ES_HOME"/config; fi

保存退出。

接着将配置文件全部复制到目标位置:

cp config/* /opt/data/elasticsearch/config/

注意,后续关于配置文件的修改都在新的位置进行,默认路径下的已经无效。

5.2 修改临时工作目录

默认情况下,ES需要在系统临时目录(一般是/tmp)中创建私有临时目录。但系统临时目录下的文件可能会被周期性地清除,这可能导致运行中的ES出现问题。如果使用的是.tar.gz安装,为避出现免该问题,应使用环境变量ES_TMPDIR指定一个其他安全且可访问的位置,我们直接配置到bin/elasticsearch-env中:
找到上边添加ES_PATH_CONF变量的地方,加在它前面即可。

# for java.io.tmpdir.
ES_TMPDIR="/opt/data/elasticsearch/tmp"

该参数也可以放到命令行参数中。

5.3 修改数据和日志目录:

cd /opt/data/elasticsearch/config

修改elasticsearch.yml:

path.data: /opt/data/elasticsearch/data
path.logs: /opt/data/elasticsearch/logs

注意冒号后的空格。

5.4 修改堆内存大小

编辑jvm.options,修改堆内存大小,应始终保持这两个值是相等的:

-Xms8g
-Xmx8g

其他选择默认就好。

5.5 启用集群监控

默认情况下,监控是打开状态,但是数据收集是关闭的,需要同时打开数据收集:
修改elasticsearch.yml:

# Enable data collection.
xpack.monitoring.collection.enabled: true

该配置启动后也可以在Kibana中开启,集群设置优先于elasticsearch.yml文件中的设置。

5.6 修改集群名称cluster.name

集群名称,多个集群时,集群间需要保持唯一;单个集群时,各个节点需要保持相同,修改elasticsearch.yml:

cluster.name: AppLogCluster

5.7 修改节点名称node.name

节点名称,默认显示机器名。修改elasticsearch.yml:
三个节点分别配置为node-M1,node-M2,node-M3,例如:

node.name: node-M1

5.8 修改节点其他信息

修改elasticsearch.yml,添加:

node.master: true 
node.voting_only: false 
node.data: true 
node.ingest: true 
node.ml: false 
xpack.ml.enabled: false 
cluster.remote.connect: false

5.9 网络配置network.host

网络地址。默认绑定到本地回环:127.0.0.1 和 [::1]:
修改elasticsearch.yml,添加:
三台IP按前面的约定分别指定:
node-M1:

network.host: 192.168.0.11

node-M2:

network.host: 192.168.0.12

node-M3:

network.host: 192.168.0.13

伪集群模式可以在同一个节点上运行多个实例。

注意一旦更改该配置,Elasticsearch 将从开发模式切换到生产模式,并在启动时做必要的系统配置检查。

5.10 发现和集群组成配置

以下配置用于节点之间相互发现和主节点选举。集群主节点候选者至少3个。过半不可用。建议主节点候选者数量固定,通过从节点方式扩容集群。

5.10.1 discovery.seed_hosts

默认情况下,Elasticsearch 会扫描9300-9305之间的端口,以发现本机运行的其他实例,这样可以自动形成一个集群。
当指定其他不同节点上的实例时,必须使用该选项配置。另外,该选项必须包含所有主节点候选者的IP,并且每个节点都要保持一致。格式为host:port,端口不指定则保持默认。对于IPv6格式的IP,必须放到中括号中[]。

修改elasticsearch.yml,添加:

discovery.seed_hosts:
   - 192.168.0.11
   - 192.168.0.12
   - 192.168.0.13

5.10.2 cluster.initial_master_nodes

初始化主节点候选者列表。我们选择将该配置放在命令行参数中,以避免后续重启时还要再修改配置文件:
注意现在先不要执行:

./bin/elasticsearch -d -Ecluster.initial_master_nodes=node-M1,node-M2,node-M3

需要注意的是,这里指定的节点名字必须与node.name中的保持一致。该参数只能在第一次启动的时候加入,后续重启和新加入的节点不可以再使用

六 安全配置

Elastic stack提供了多种安全特性,如加密通信,基于角色的访问控制,文件和原生身份验证,Kibana工作区,Kibana 功能控制,等等,针对黄金版和白金版还提供了更多丰富的功能和更细粒度的安全控制。
前面提到默认安装的版本证书是BASIC的,在该证书下,安全设置默认是关闭的。使用以下配置开启:
修改elasticsearch.yml,添加:

xpack.security.enabled: true

如果你只需要Kibana有个权限管理,那么这一个选项就够了。如果你要在集群中,以及Elasticsearch与其他产品之间全部开启TLS/SSL,则还需要配置相应签名证书,请继续往下看。

详细可以参考:Elastic Stack 订阅.

6.1 配置的安全

对于配置文件中的一些敏感配置信息如用户名密码,Elasticsearch 提供了一个密钥库和elasticsearch-keystore工具来管理。
需要注意的是,Elasticsearch的密钥库只支持指定的配置项,其他自定义配置不支持,如果设置了不支持的配置项,Elasticsearch 无法启动。配置重启生效。

后续会用到该工具。

6.2 加密节点间通信(多节点)

确保xpack.security.enabled已开启。使用TLS/SSL保护所有节点间连接的安全。

  1. 确保xpack.security.enabled已开启。
  2. 生成私钥和X.509证书。
  3. 每个节点配置:
    a. 必须:在传输层上启用TLS
    b. 推荐:在HTTP层上启用TLS

6.2.1 生成节点证书

证书的生成主要使用elasticsearch-certutil工具。它负责生成CA并使用该CA签名证书。另外,它还支持生成证书签名请求(CSR),如果你已经有证书(商业,阻止等)的情况下可以使用csr。
相关用法如下:

命令:
--------
csr - 生成证书签名请求
cert - 生成 X.509 证书和密钥
ca - 生成一个新的本地CA

参数:
-s, --silent   静默模式,最小信息输出

重要说明:Elasticsearch集群节点间即支持PKCS#12格式证书,也支持PEM格式证书,但由于Kibana只能使用PEM格式的证书,暂时无法使用PKCS#12格式的证书,所以我们这里只使用PEM格式来生成所有证书,避免后续再转换。另外,我们打算在同一个集群的所有节点中使用相同的证书,不再单独为每个节点生成特定证书。

如果你只希望在Elasticsearch集群之间开启TLS/SSL加密,不打算在Elasticsearch集群和Kibana之间,Kibana与浏览器之间,以及Elasticsearch集群和其他HTTP Client之间开启TLS/SSL加密,则直接使用PKCS#12格式证书即可。

要使用PKCS#12格式证书,请关注后续文章介绍。

步骤:
1. 生成自签名用根证书CA
PEM格式(我们使用该格式):

cd /var/lib/elasticsearch-7.4.1 && \
./bin/elasticsearch-certutil ca \
--ca-dn C=CN,ST=SH,O=Favorstack,OU=Favorstack,CN=favorstack.io \
--days 3650 \
--keysize 2048 \
--pass aeDow7Nu \
--out es-ca.zip \
--pem

–ca-dn选项中,C=国家;ST=州或省份;O=组织;OU=组织单位;CN=常用名称

执行完会输出一个.zip压缩包,内含:

ca
├── ca.crt
├── ca.key

解压备用:

unzip es-ca.zip

注意保护好这两个文件。

我们可以将群集配置为信任具有此CA签名的证书的所有节点。

ca命令部分可用选项如下:

--ca-dn   <name>       用于生成ca的专有名称。默认为CN=Elastic Certificate Tool Autogenerated CA
--days    <Integer>    证书有效期。默认1095(3年)
--keysize <Integer>    RSA密钥的大小(bit)。默认2048。
--out     <file_path>  文件输出路径
--pass    <password>   生成私钥的密码
--pem                  以PEM格式输出证书,而不是PKCS#12

2. 为集群中的每个节点生成证书和私钥
PEM格式(我们使用该格式):

./bin/elasticsearch-certutil cert \
--ca-cert ca/ca.crt \
--ca-key ca/ca.key \
--days 3650 \
--keysize 2048 \
--ca-pass aeDow7Nu \
--name node-M \
--pass quie5aRo \
--out node-cert.zip \
--pem

执行完会输出一个.zip压缩包,内含:

node-M
├── node-M.crt
├── node-M.key

cert命令部分可用选项如下:

--ca <file_path>         已有CA的路径(PKCS#12格式)。
--ca-cert <file_path>    已有ca证书路径(PEM格式)。
--ca-dn <name>           用于生成ca的专有名称(DN)。默认为CN=Elastic Certificate Tool Autogenerated CA
--ca-key <file_path>     已有ca私钥的路径(PEM格式)。
--ca-pass <password>     已有ca私钥的密码或新生成ca私钥的密码
--days <Integer>         证书有效期。默认1095(3年)
--dns <domain_name>      逗号隔开的DNS名称
--ip <IP_addresses>      逗号隔开的IP地址
--keep-ca-key            自动生成CA证书的情况下,保留CA私钥以供将来使用。
--keysize <Integer>      RSA密钥的大小(bit)。默认2048。
--multiple               为多个实例生成证书
--name <file_name>       生成证书的名字
--out <file_path>        文件输出路径
--pass <password>        生成私钥的密码
--pem                    以PEM格式输出证书,而不是PKCS#12

3. 分发证书
将节点证书node-cert.zip以及ca.crt复制到每个节点上:
可以使用scp命令进行节点间复制文件,例如:

scp ca/ca.crt devops@192.168.0.12:~

scp ca/ca.crt devops@192.168.0.13:~

scp node-cert.zip devops@192.168.0.12:~

scp node-cert.zip devops@192.168.0.13:~

~表示当前用户家目录

然后到每个目标节点上的家目录执行以下命令:

mkdir /opt/data/elasticsearch/config/certs && \
mv ca.crt /opt/data/elasticsearch/config/certs && \
unzip -j node-cert.zip -d /opt/data/elasticsearch/config/certs && \
rm -rf node-cert.zip && \
ls -al /opt/data/elasticsearch/config/certs/

6.2.2 在集群节点间加密通信(必须)

1. 启用TLS并指定访问节点证书所需的信息
修改elasticsearch.yml,添加:

xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  key: /opt/data/elasticsearch/config/certs/node-M.key
  certificate: /opt/data/elasticsearch/config/certs/node-M.crt
  certificate_authorities: [ "/opt/data/elasticsearch/config/certs/ca.crt" ]

2. 将节点证书的密码添加至Elasticsearch的keystore中

cd /var/lib/elasticsearch-7.4.1

# 如果尚未创建
./bin/elasticsearch-keystore create 

./bin/elasticsearch-keystore add xpack.security.transport.ssl.secure_key_passphrase

根据提示输入密码:quie5aRo

注意不要搞混,是节点证书的密码,不是CA证书的密码。

6.2.3 加密HTTP客户端通信(推荐)

  1. 启用TLS并指定访问节点证书所需的信息:

修改elasticsearch.yml,添加:

xpack.security.http.ssl:
  enabled: true
  verification_mode: certificate
  key: /opt/data/elasticsearch/config/certs/node-M.key
  certificate: /opt/data/elasticsearch/config/certs/node-M.crt
  certificate_authorities: [ "/opt/data/elasticsearch/config/certs/ca.crt" ]
  1. 将节点证书的密码添加至Elasticsearch的keystore中:
./bin/elasticsearch-keystore add xpack.security.http.ssl.secure_key_passphrase

根据提示输入密码:quie5aRo

到此配置完成。

七 启动和停止服务

7.1 初次启动

每个节点上,依次执行以下命令:

./bin/elasticsearch -d -Ecluster.initial_master_nodes=node-M1,node-M2,node-M3

7.2 停止

jps | grep Elasticsearch

14542 Elasticsearch

或者:

ps -ef| grep Elasticsearch
kill -15 pid

7.3 重启

注意与初次启动服务的差别:

./bin/elasticsearch -d

八 鉴权

8.1 用户认证

Elasticsearch 提供了多种认证方式,如Native,LDAP,Active_Directory,PKI,File,SAML,OIDC等这些认证实现被称为Realm,并且支持多层认证,这被称为Realm链。默认启用了File认证和Native认证。File认证方式主要是作为一种回退/恢复方案。例如在所有人都忘记密码时,可以使用该方式新添加一个管理员。Native认证方式主要是通过Kibana来管理。

我们主要介绍Native认证,这也是BASIC许可证所支持的其中一种。

BASIC许可证还支持File认证方式。

8.1.1 内建用户

Elasticsearch 默认内建了一批内部用户,这些用户主要用作服务内部之间的通信:

用户说明
elastic超级管理员
apm_systemAPM server用来在Elasticsearch中存储监控信息时使用的用户
kibanaKibana用来与Elasticsearch通信的用户
logstash_systemLogstash用来在Elasticsearch中存储监控信息时使用的用户
beats_systemBeats用来在Elasticsearch中存储监控信息时使用的用户
remote_monitoring_userMetricbeat用来在Elasticsearch中收集和存储监控信息时使用的用户

其中,超级管理员还可以用于登录Kibana UI。

8.1.2 为内建用户设置密码

使用以下交互命令可以为这些用户一次性初始化密码,后续相关模块要用。

./bin/elasticsearch-setup-passwords interactive

我们为每个用户单独准备一个密码:

用户密码
elasticiechie1Z
apm_systemuitahb3C
kibanaob9boTh7
logstash_systemesaeth3I
beats_systemxohb3Bo8
remote_monitoring_userOojo5Boa

注意,该命令需要 Elasticsearch 处于运行状态,否则会报错:

Connection failure to: http://127.0.0.1:9200/_security/_authenticate?pretty failed: Connection refused

ERROR: Failed to connect to elasticsearch at http://127.0.0.1:9200/_security/_authenticate?pretty. Is the URL correct and elasticsearch running?

8.1.3 检查集群状态

可以使用以下命令查看集群状态:

curl -k --user elastic:iechie1Z \
-X GET "https://192.168.0.11:9200/_cat/health?v&pretty"

显示

epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1574700922 16:55:22  AppLogCluster green           3         3      2   2    0    0        0             0                  -                100.0%

8.2 用户授权

8.2.1 基于角色的访问控制

2CD70ECC4149C84BCFC82F41E5CC6EBB.jpg

安全模块提供了基于角色的访问控制(RBAC)这是我们最常使用的一种授权方式:

(图片来自Elastic官网)
组(Group)的概念在file,native,PKI等realm中不支持。

8.2.2 基于属性的访问控制

安全模块还提供了基于属性的访问控制(ABAC)。这种方案可以做到更细粒度的权限控制,目前只有白金级会员支持。

九 elasticsearch.yml参考

最后,给出一个完整的elasticsearch.yml:

# ======================== Elasticsearch Configuration =========================
#
# NOTE: Elasticsearch comes with reasonable defaults for most settings.
#       Before you set out to tweak and tune the configuration, make sure you
#       understand what are you trying to accomplish and the consequences.
#
# The primary way of configuring a node is via this file. This template lists
# the most important settings you may want to configure for a production cluster.
#
# Please consult the documentation for further information on configuration options:
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- Cluster -----------------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: AppLogCluster
cluster.remote.connect: false
#
# ------------------------------------ Node ------------------------------------
#
# Use a descriptive name for the node:
#
node.name: node-M1
node.master: true
node.voting_only: false
node.data: true
node.ingest: true
node.ml: false
#
# Add custom attributes to the node:
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# Path to directory where to store the data (separate multiple locations by comma):
#
path.data: /opt/data/elasticsearch/data
#
# Path to log files:
#
path.logs: /opt/data/elasticsearch/logs
#
# ----------------------------------- Security -----------------------------------
xpack.security.enabled: true
#
# The file realm is added to the realm chain by default. 
# As the administrator of the cluster, it is your responsibility to ensure the same  
# users are defined on every node in the cluster. The Elastic Stack security features 
# do not deliver any mechanism to guarantee this.
#
# The native realm is available by default when no other realms are configured. 
# If other realm settings have been configured in elasticsearch.yml, you must add 
# the native realm to the realm chain.
#xpack.security.authc:
#  realms:
#
#    file:
#      type: file
#      order: 0
#
#    native:
#      type: native
#      order: 1
#
# Enable TLS and specify the information required to access the node’s certificate.
#
# Enabling TLS on the Transport layer is required.
#
# In PKCS#12 format.
#xpack.security.transport.ssl:
#  enabled: true
#  verification_mode: certificate
#  keystore.path: certs/su-cert.p12
#  truststore.path: config/certs/su-cert.p12
#
# In PEM format.
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  key: /opt/data/elasticsearch/config/certs/node-M.key
  certificate: /opt/data/elasticsearch/config/certs/node-M.crt
  certificate_authorities: [ "/opt/data/elasticsearch/config/certs/ca.crt" ]
#
#
# Enabling TLS on the HTTP layer is strongly recommended but is not required.
#
# In PKCS#12 format.
#xpack.security.http.ssl: 
#  enabled: true
#  keystore.path: /opt/data/elasticsearch/config/certs/node-M.p12
#  truststore.path: /opt/data/elasticsearch/config/certs/node-M.p12
#
# In PEM format.
xpack.security.http.ssl:
  enabled: true
  verification_mode: certificate
  key: /opt/data/elasticsearch/config/certs/node-M.key
  certificate: /opt/data/elasticsearch/config/certs/node-M.crt
  certificate_authorities: [ "/opt/data/elasticsearch/config/certs/ca.crt" ]
#
# ----------------------------------- Memory -----------------------------------
#
# Lock the memory on startup:
#
#bootstrap.memory_lock: true
#
# Make sure that the heap size is set to about half the memory available
# on the system and that the owner of the process is allowed to use this
# limit.
#
# Elasticsearch performs poorly when the system is swapping the memory.
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 192.168.0.11
#
# Set a custom port for HTTP:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
#
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
#discovery.seed_hosts: ["host1", "host2"]
discovery.seed_hosts:
  - 192.168.0.11
  - 192.168.0.12
  - 192.168.0.13
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
#cluster.initial_master_nodes: ["node-1", "node-2"]
#
# For more information, consult the discovery and cluster formation module documentation.
#
# ---------------------------------- Gateway -----------------------------------
#
# Block initial recovery after a full cluster restart until N nodes are started:
#
#gateway.recover_after_nodes: 3
#
# For more information, consult the gateway module documentation.
#
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true
#
# ---------------------------------- Monitoring -----------------------------------
xpack.monitoring.collection.enabled: true
#
# ---------------------------------- Machine learning -----------------------------------
xpack.ml.enabled: false
此条目发表在ELK日志服务器分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注