手动配置安全
edit手动配置安全
edit安全需求因您是在笔记本电脑上本地开发还是在生产环境中保护所有通信而异。无论您在何处部署 Elastic Stack("ELK"),运行一个安全的集群对于保护您的数据都至关重要。这就是为什么在 Elasticsearch 8.0 及更高版本中,安全功能是默认启用和配置的。
如果您想在现有的、未受保护的集群上启用安全性,使用您自己的证书颁发机构(CA),或者更愿意手动配置安全性,以下场景提供了在传输层配置TLS的步骤,如果您需要,还可以保护HTTPS流量。
如果你在启动 Elasticsearch 节点之前手动配置安全设置,自动配置过程将尊重你的安全配置。你可以随时调整你的 TLS 配置,例如 更新节点证书。

最小安全配置(Elasticsearch 开发)
edit如果您一直在使用 Elasticsearch 并希望在现有的、未受保护的集群上启用安全性,请从这里开始。您将为内置用户设置密码,以防止未经授权访问您的本地集群,并同时为 Kibana 配置密码认证。
最小的安全场景不足以满足生产模式集群的需求。如果你的集群有多个节点,你必须启用最小安全设置,然后配置节点间的传输层安全(TLS)。
基本安全(Elasticsearch + Kibana)
edit此场景配置节点间通信的TLS。此安全层要求节点验证安全证书,从而防止未经授权的节点加入您的Elasticsearch集群。
您的Elasticsearch和Kibana之间的外部HTTP流量将不会被加密,但节点间通信将会被保护。
基本安全加安全 HTTPS 流量(Elastic Stack)
edit此场景基于基本安全场景,并通过TLS保护所有HTTP流量。除了在Elasticsearch集群的传输接口上配置TLS外,您还需要在Elasticsearch和Kibana的HTTP接口上配置TLS。
如果你需要在HTTP层使用双向(双向)TLS,那么你需要配置双向认证加密。
然后,您配置 Kibana 和 Beats 以使用 TLS 与 Elasticsearch 通信,以便所有通信都经过加密。这种安全级别很高,并确保进出集群的任何通信都是安全的。
为 Elasticsearch 设置最小安全配置
edit如果您正在运行现有的、未受保护的集群,并且希望启用 Elasticsearch 安全功能,则只需完成以下步骤。
在 Elasticsearch 8.0 及更高版本中,安全性在您首次启动 Elasticsearch 时会自动启用。
如果您正在运行一个现有的Elasticsearch集群,其中安全功能被禁用,您可以手动启用Elasticsearch安全功能,然后为内置用户创建密码。您可以稍后添加更多用户,但使用内置用户简化了为您的集群启用安全性的过程。
最小的安全场景不足以满足生产模式集群的需求。如果你的集群有多个节点,你必须启用最小安全配置,然后配置节点间的传输层安全(TLS)。
启用 Elasticsearch 安全功能
edit启用Elasticsearch安全功能提供了基本身份验证,以便您可以使用用户名和密码在本地集群上运行。
- 在集群中的每个节点上,如果 Kibana 和 Elasticsearch 正在运行,请停止它们。
-
在集群中的每个节点上,将
xpack.security.enabled
设置添加到$ES_PATH_CONF/elasticsearch.yml
文件中,并将值设置为true
:xpack.security.enabled: true
$ES_PATH_CONF
变量是 Elasticsearch 配置文件的路径。如果您使用存档分发版(zip
或tar.gz
)安装了 Elasticsearch,该变量默认指向$ES_HOME/config
。如果您使用包分发版(Debian 或 RPM),该变量默认指向/etc/elasticsearch
。 -
如果你的集群只有一个节点,请在
$ES_PATH_CONF/elasticsearch.yml
文件中添加discovery.type
设置,并将其值设置为single-node
。此设置确保你的节点不会意外连接到可能在你网络上运行的其他集群。discovery.type: single-node
为内置用户设置密码
edit要与您的集群通信,您必须为内置用户elastic
和kibana_system
配置密码。除非您启用匿名访问(不推荐),否则所有不包含凭据的请求都将被拒绝。
启用最小或基本安全功能时,只需为elastic
和kibana_system
用户设置密码。
-
在您的集群中的每个节点上,启动Elasticsearch。例如,如果您使用
.tar.gz
包安装了Elasticsearch,请从ES_HOME
目录运行以下命令:./bin/elasticsearch
-
在集群中的任何节点上,打开另一个终端窗口,并通过运行
elasticsearch-reset-password
工具为内置用户elastic
设置密码。此命令将密码重置为自动生成的值。./bin/elasticsearch-reset-password -u elastic
如果您想将密码设置为特定值,请使用交互式(
-i
)参数运行命令。./bin/elasticsearch-reset-password -i -u elastic
-
为内置用户
kibana_system
设置密码。./bin/elasticsearch-reset-password -u kibana_system
-
保存新密码。在下一步中,您将添加
kibana_system
用户的密码到Kibana。
配置 Kibana 以使用密码连接到 Elasticsearch
edit当启用了Elasticsearch安全功能时,用户必须使用有效的用户名和密码登录Kibana。
您将配置 Kibana 使用内置的 kibana_system
用户和您之前创建的密码。Kibana 执行一些后台任务,这些任务需要使用 kibana_system
用户。
此账户不适用于个人用户,并且没有权限从浏览器登录到 Kibana。相反,您将以 elastic
超级用户身份登录到 Kibana。
-
将
elasticsearch.username
设置添加到KBN_PATH_CONF/kibana.yml
文件中,并将值设置为kibana_system
用户:elasticsearch.username: "kibana_system"
KBN_PATH_CONF
变量是 Kibana 配置文件的路径。如果你使用归档分发版(zip
或tar.gz
)安装了 Kibana,该变量默认指向KIB_HOME/config
。如果你使用包分发版(Debian 或 RPM),该变量默认指向/etc/kibana
。 -
从您安装 Kibana 的目录中,运行以下命令以创建 Kibana 密钥库并添加安全设置:
-
创建 Kibana 密钥库:
./bin/kibana-keystore create
-
将
kibana_system
用户的密码添加到 Kibana 密钥库中:./bin/kibana-keystore add elasticsearch.password
当提示时,输入
kibana_system
用户的密码。
-
-
重新启动 Kibana。例如,如果您使用
.tar.gz
包安装了 Kibana,请从 Kibana 目录运行以下命令:./bin/kibana
-
以
elastic
用户身份登录到 Kibana。使用此超级用户帐户来 管理空间、创建新用户和分配角色。如果您在本地运行 Kibana,请访问http://localhost:5601
查看登录页面。
下一步是什么?
edit恭喜!您已为本地集群启用了密码保护,以防止未经授权的访问。您可以以elastic
用户身份安全地登录Kibana,并创建其他用户和角色。如果您运行的是单节点集群,那么您可以到此为止。
如果您的集群有多个节点,则必须在节点之间配置传输层安全(TLS)。生产模式集群在未启用TLS的情况下将无法启动。
为Elastic Stack设置基本安全以确保集群中节点之间的所有内部通信安全。
为Elastic Stack设置基本安全
edit当您首次启动 Elasticsearch 时,会为 elastic
用户生成密码,并且会自动为您配置 TLS。如果您在启动 Elasticsearch 节点之前手动配置安全设置,自动配置过程将尊重您的安全配置。您可以随时调整您的 TLS 配置,例如 更新节点证书。
如果您的集群有多个节点,则必须在节点之间配置TLS。生产模式集群将不会启动,如果您没有启用TLS。
传输层依赖于相互TLS进行节点之间的加密和身份验证。正确应用TLS确保恶意节点无法加入集群并与其他节点交换数据。虽然在HTTP层实现用户名和密码身份验证对于保护本地集群很有用,但节点间通信的安全性需要TLS。
在节点之间配置TLS是基本的安全设置,以防止未经授权的节点访问您的集群。
生成证书颁发机构
edit您可以在集群中添加任意数量的节点,但它们必须能够相互通信。集群中节点之间的通信由传输模块处理。为了保护您的集群,您必须确保节点间通信是加密和验证的,这可以通过相互TLS实现。
在安全集群中,Elasticsearch 节点使用证书在与其他节点通信时进行身份验证。
集群必须验证这些证书的真实性。推荐的方案是信任特定的证书颁发机构(CA)。当节点添加到您的集群时,它们必须使用由同一CA签名的证书。
对于传输层,我们建议使用一个单独的、专用的CA,而不是一个现有的、可能共享的CA,以便严格控制节点成员资格。使用elasticsearch-certutil
工具为您的集群生成一个CA。
-
在启动 Elasticsearch 之前,请在任意单个节点上使用
elasticsearch-certutil
工具为您的集群生成 CA。./bin/elasticsearch-certutil ca
-
当提示时,接受默认文件名,即
elastic-stack-ca.p12
。该文件包含您的 CA 的公钥证书和用于为每个节点签署证书的私钥。 - 为您的 CA 输入一个密码。如果您没有部署到生产环境,可以选择不设置密码。
-
当提示时,接受默认文件名,即
-
在任何单个节点上,为集群中的节点生成证书和私钥。您包含在上一步中生成的
elastic-stack-ca.p12
输出文件。./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
-
--ca
-
用于签署您的证书的CA文件的名称。
elasticsearch-certutil
工具的默认文件名是elastic-stack-ca.p12
。- 输入您的 CA 的密码,或者如果您在上一步中没有配置密码,请按 Enter。
-
为证书创建一个密码并接受默认文件名。
输出文件是一个名为
elastic-certificates.p12
的密钥库。该文件包含节点证书、节点密钥和CA证书。
-
-
在您的集群中的 每个 节点上,将
elastic-certificates.p12
文件复制到$ES_PATH_CONF
目录。
使用 TLS 加密节点间通信
edit传输网络层用于集群中节点之间的内部通信。当启用安全功能时,您必须使用TLS来确保节点之间的通信是加密的。
现在您已经生成了证书颁发机构和证书,您将更新您的集群以使用这些文件。
Elasticsearch 监控所有配置为 TLS 相关节点设置值的文件,例如证书、密钥、密钥库或信任库。如果您更新这些文件中的任何一个,例如当您的主机名更改或证书即将到期时,Elasticsearch 会重新加载它们。文件会以 Elasticsearch 全局设置 resource.reload.interval.high
决定的频率进行轮询,该设置默认值为 5 秒。
完成以下步骤 对于集群中的每个节点。要加入同一个集群,所有节点必须共享相同的 cluster.name
值。
-
打开
$ES_PATH_CONF/elasticsearch.yml
文件并进行以下更改:-
添加
cluster-name
设置并输入您的集群名称:cluster.name: my-cluster
-
添加
node.name
设置并为节点输入一个名称。 当Elasticsearch启动时,节点名称默认为机器的主机名。node.name: node-1
-
添加以下设置以启用节点间通信并提供对节点证书的访问。
因为您在集群中的每个节点上都使用了相同的
elastic-certificates.p12
文件,请将验证模式设置为certificate
: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
如果您想使用主机名验证,请将验证模式设置为
full
。您应该为每个与 DNS 或 IP 地址匹配的主机生成不同的证书。请参阅 TLS 设置中的xpack.security.transport.ssl.verification_mode
参数。
-
-
如果在创建节点证书时输入了密码,请运行以下命令将密码存储在 Elasticsearch 密钥库中:
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
- 为集群中的每个节点完成上述步骤。
-
在集群中的每个节点上,启动Elasticsearch。启动和停止Elasticsearch的方法因您的安装方式而异。
例如,如果您使用归档分发版安装了Elasticsearch(
tar.gz
或.zip
),您可以在命令行中输入Ctrl+C
来停止 Elasticsearch。您必须执行完整的集群重启。配置为使用TLS进行传输的节点无法与使用未加密传输连接的节点进行通信(反之亦然)。
下一步是什么?
edit恭喜!您已经加密了集群中节点之间的通信,并且可以通过 TLS 引导检查。
为了增加一层安全保障,为Elastic Stack设置基本安全保障以及安全的HTTPS流量。除了在Elasticsearch集群的传输接口上配置TLS外,您还需要在Elasticsearch和Kibana的HTTP接口上配置TLS。
为Elastic Stack设置基本安全功能以及安全的HTTPS流量
edit当您在HTTP层启用TLS时,它提供了一个额外的安全层,以确保所有进出您的集群的通信都是加密的。
当您在http
模式下运行elasticsearch-certutil
工具时,该工具会询问有关您希望如何生成证书的几个问题。虽然有众多选项,但以下选择将生成适用于大多数环境的证书。
先决条件
edit完成为Elastic Stack设置基本安全中的所有步骤。
为Elasticsearch加密HTTP客户端通信
edit- 在您的集群中的每个节点上,停止 Elasticsearch 和 Kibana(如果它们正在运行)。
-
在任何单个节点上,从您安装 Elasticsearch 的目录中,运行 Elasticsearch HTTP 证书工具以生成证书签名请求(CSR)。
./bin/elasticsearch-certutil http
此命令生成一个包含证书和密钥的
.zip
文件,用于与 Elasticsearch 和 Kibana 一起使用。每个文件夹都包含一个README.txt
文件,解释如何使用这些文件。-
当被问到是否要生成一个 CSR 时,输入
n
。 -
当被问到是否要使用现有的 CA 时,输入
y
。 -
输入您的 CA 的路径。这是您为集群生成的
elastic-stack-ca.p12
文件的绝对路径。 - 输入您的 CA 的密码。
-
输入您的证书的过期值。您可以输入有效期(以年、月或天为单位)。例如,输入
90D
表示 90 天。 -
当被问到是否要为每个节点生成一个证书时,输入
y
。每个证书将拥有自己的私钥,并且将为特定的主机名或IP地址颁发。
- 当提示时,输入您的集群中第一个节点的名称。使用与您在生成节点证书时使用相同的节点名称。
-
输入用于连接到您的第一个节点的所有主机名。这些主机名将作为DNS名称添加到您的证书的Subject Alternative Name (SAN)字段中。
列出通过HTTPS连接到您的集群所使用的每个主机名和变体。
- 输入客户端可以用来连接到您的节点IP地址。
- 为您的集群中的每个附加节点重复这些步骤。
-
当被问到是否要生成一个 CSR 时,输入
- 为您的每个节点生成证书后,当提示时输入您的私钥密码。
-
解压缩生成的
elasticsearch-ssl-http.zip
文件。这个压缩文件包含一个目录,用于 Elasticsearch 和 Kibana。/elasticsearch |_ README.txt |_ http.p12 |_ sample-elasticsearch.yml
/kibana |_ README.txt |_ elasticsearch-ca.pem |_ sample-kibana.yml
-
在您的集群中的每个节点上,完成以下步骤:
-
将相关的
http.p12
证书复制到$ES_PATH_CONF
目录。 -
编辑
elasticsearch.yml
文件以启用 HTTPS 安全功能并指定http.p12
安全证书的位置。xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: http.p12
-
将您的私钥密码添加到 Elasticsearch 的安全设置中。
./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
- 启动 Elasticsearch。
-
将相关的
下一步: 加密Kibana的HTTP客户端通信
加密 Kibana 的 HTTP 客户端通信
edit浏览器将流量发送到 Kibana,Kibana 将流量发送到 Elasticsearch。 这些通信通道分别配置为使用 TLS。您加密 Kibana 和 Elasticsearch 之间的流量,然后加密浏览器和 Kibana 之间的流量。
加密 Kibana 和 Elasticsearch 之间的流量
edit当你使用http
选项运行elasticsearch-certutil
工具时,它创建了一个包含elasticsearch-ca.pem
文件的/kibana
目录。你使用此文件来配置Kibana以信任Elasticsearch CA用于HTTP层。
-
将
elasticsearch-ca.pem
文件复制到 Kibana 配置目录, 由$KBN_PATH_CONF
路径定义。 -
打开
kibana.yml
并添加以下行以指定 HTTP 层的安全证书位置。elasticsearch.ssl.certificateAuthorities: $KBN_PATH_CONF/elasticsearch-ca.pem
-
添加以下行以指定您的 Elasticsearch 集群的 HTTPS URL。
elasticsearch.hosts: https://
:9200 - 重启 Kibana。
下一步: 加密浏览器和Kibana之间的流量
加密浏览器与Kibana之间的流量
edit您为 Kibana 创建一个服务器证书和私钥。Kibana 在接收来自网络浏览器的连接时使用此服务器证书和相应的私钥。
当您获取服务器证书时,必须正确设置其主题备用名称(SAN),以确保浏览器会信任它。您可以将一个或多个SAN设置为Kibana服务器的完全限定域名(FQDN)、主机名或IP地址。在选择SAN时,选择您将在浏览器中用于连接到Kibana的属性,这很可能是FQDN。
以下说明为Kibana创建一个证书签名请求(CSR)。 CSR包含CA用于生成和签署安全证书的信息。该证书可以是可信的(由公共可信CA签署)或不可信的(由内部CA签署)。自签名或内部签署的证书适用于开发环境和构建概念验证,但不应在生产环境中使用。
在投入生产之前,请使用受信任的CA(如Let’s Encrypt)或您组织的内部CA来签署证书。使用签名证书可以为内部访问或公共互联网上的Kibana连接建立浏览器信任。
-
为Kibana生成服务器证书和私钥。
./bin/elasticsearch-certutil csr -name kibana-server -dns example.com,www.example.com
CSR 的通用名称(CN)为
kibana-server
,SAN 为example.com
, 另一个 SAN 为www.example.com
。此命令默认生成一个包含以下内容的
csr-bundle.zip
文件:/kibana-server |_ kibana-server.csr |_ kibana-server.key
-
解压缩
csr-bundle.zip
文件以获取未签名的kibana-server.csr
安全证书和未加密的kibana-server.key
私钥。 -
将
kibana-server.csr
证书签名请求发送给您的内部CA或受信任的CA进行签名,以获取已签名的证书。签名文件可以是不同的格式,例如.crt
文件,如kibana-server.crt
。 -
打开
kibana.yml
并添加以下行以配置 Kibana 访问服务器证书和未加密的私钥。server.ssl.certificate: $KBN_PATH_CONF/kibana-server.crt server.ssl.key: $KBN_PATH_CONF/kibana-server.key
$KBN_PATH_CONF
包含 Kibana 配置文件的路径。如果你使用归档分发版(zip
或tar.gz
)安装 Kibana,路径默认为$KBN_HOME/config
。如果你使用包分发版(Debian 或 RPM),路径默认为/etc/kibana
。 -
将以下行添加到
kibana.yml
以启用入站连接的 TLS。server.ssl.enabled: true
- 启动 Kibana。
完成这些更改后,您必须始终通过HTTPS访问Kibana。例如,https://
。
下一步: 配置 Beats 安全
配置 Beats 安全
editBeats 是开源的数据发送器,您可以将其作为代理安装在服务器上,以将操作数据发送到 Elasticsearch。每个 Beat 都是一个单独可安装的产品。以下步骤涵盖了配置 Metricbeat 的安全性。对于您想要配置安全性的每个 additional Beat,请按照这些步骤操作。
为 Metricbeat 创建角色
edit通常,您需要创建以下单独的角色:
- setup 用于设置索引模板和其他依赖项的角色
- monitoring 用于发送监控信息的角色
- writer 用于发布由 Metricbeat 收集的事件的角色
- reader 用于需要查看和创建访问 Metricbeat 数据的可视化的 Kibana 用户的角色
这些说明假设您使用的是Metricbeat索引的默认名称。如果未列出指示的索引名称,或者您使用的是自定义名称,请在定义角色时手动输入,并修改权限以匹配您的索引命名模式。
要在 Kibana 的 Stack Management 中创建用户和角色,请从侧边导航中选择 角色 或 用户。
下一步: 创建设置角色
创建一个设置角色和用户
edit设置 Metricbeat 的管理员通常需要加载映射、仪表板和其他用于将数据索引到 Elasticsearch 并在 Kibana 中可视化的对象。
设置 Metricbeat 是一个需要额外权限的管理员级别任务。作为最佳实践,仅向管理员授予设置角色,并使用更具限制性的角色进行事件发布。
- 创建设置角色:
- 输入 metricbeat_setup 作为角色名称。
- 选择 monitor 和 manage_ilm 集群权限。
-
在 metricbeat-\* 索引上,选择 管理 和 写入 权限。
如果 metricbeat-\* 索引未列出,请将该模式输入到索引列表中。
- 创建设置用户:
- 输入 metricbeat_setup 作为用户名。
- 输入用户名、密码和其他用户详细信息。
-
将以下角色分配给metricbeat_setup用户:
角色 用途 metricbeat_setup
设置 Metricbeat。
kibana_admin
加载依赖项,例如示例仪表板(如果可用),到 Kibana
ingest_admin
设置索引模板,并在可用时设置摄取管道
下一步: 创建监控角色
创建一个监控角色和用户
edit要安全地发送监控数据,请创建一个监控用户并授予其必要的权限。
如果您的环境中可用,您可以使用内置的 beats_system
用户。由于内置用户在 Elastic Cloud 中不可用,这些说明将创建一个专门用于监控 Metricbeat 的用户。
-
如果您使用的是内置的
beats_system
用户,在集群中的任何节点上, 运行elasticsearch-reset-password
工具来设置该用户的密码:此命令将
beats_system
用户的密码重置为自动生成的值。./bin/elasticsearch-reset-password -u beats_system
如果您想将密码设置为特定值,请使用交互式(
-i
)参数运行命令。./bin/elasticsearch-reset-password -i -u beats_system
- 创建监控角色:
- 输入 metricbeat_monitoring 作为角色名称。
- 选择 monitor 集群权限。
- 在 .monitoring-beats-\* 索引上,选择 create_index 和 create_doc 权限。
- 创建监控用户:
- 输入 metricbeat_monitoring 作为用户名。
- 输入用户名、密码和其他用户详细信息。
-
将以下角色分配给metricbeat_monitoring用户:
角色 用途 metricbeat_monitoring
监控 Metricbeat。
kibana_admin
使用 Kibana
monitoring_user
在 Kibana 中使用 Stack Monitoring 来监控 Metricbeat
下一步: 创建一个写入角色
创建一个写入角色和用户
edit向 Elasticsearch 发布事件的用户需要创建并写入 Metricbeat 索引。为了最小化写入者角色所需的权限,请使用设置角色来预加载依赖项。本节假设您已经创建了设置角色。
- 创建写入角色:
- 输入 metricbeat_writer 作为角色名称。
- 选择 monitor 和 read_ilm 集群权限。
- 在 metricbeat-\* 索引上,选择 create_doc、create_index 和 view_index_metadata 权限。
- 创建写入用户:
- 输入 metricbeat_writer 作为用户名。
- 输入用户名、密码和其他用户详细信息。
-
将以下角色分配给metricbeat_writer用户:
角色 用途 metricbeat_writer
监控 Metricbeat
远程监控收集器
从 Metricbeat 收集监控指标
远程监控代理
将监控数据发送到监控集群
下一步: 创建一个读者角色
创建一个读者角色和用户
editKibana 用户通常需要查看包含 Metricbeat 数据的仪表板和可视化内容。这些用户可能还需要创建和编辑仪表板和可视化内容。创建读者角色以分配适当的权限给这些用户。
- 创建读者角色:
- 输入 metricbeat_reader 作为角色名称。
- 在 metricbeat-\* 索引上,选择 读取 权限。
-
在Kibana下,点击添加Kibana权限。
- 在 Spaces 下,选择 Default。
- 为 Discover、Visualize、Dashboard 和 Metrics 选择 Read 或 All。
- 创建读者用户:
- 输入 metricbeat_reader 作为用户名。
- 输入用户名、密码和其他用户详细信息。
-
将以下角色分配给metricbeat_reader用户:
角色 用途 metricbeat_reader
读取 Metricbeat 数据。
monitoring_user
允许用户监控Metricbeat自身的健康状况。仅将此角色分配给管理Metricbeat的用户
beats_admin
在Beats中央管理中创建和管理配置。仅将此角色分配给需要使用Beats中央管理的用户。
下一步: 配置 Metricbeat 使用 TLS
配置 Metricbeat 使用 TLS
edit在启动 Metricbeat 之前,您需要配置与 Elasticsearch 和 Kibana 的连接。您可以使用基本身份验证、API 密钥身份验证或公钥基础设施 (PKI) 证书来配置身份验证,以便将数据发送到受保护的集群。
以下说明使用您创建的metricbeat_writer
和metricbeat_setup
用户的凭据。如果您需要更高级别的安全性,我们建议使用PKI证书。
在配置了与 Elasticsearch 和 Kibana 的连接后,您将启用 elasticsearch-xpack
模块并配置该模块以使用 HTTPS。
在生产环境中,我们强烈建议使用一个独立的集群(称为监控集群)来存储您的数据。使用一个独立的监控集群可以防止生产集群的故障影响您访问监控数据的能力。同时,它还可以防止监控活动影响生产集群的性能。
-
在您为HTTP层生成证书的节点上,导航到
/kibana
目录。 -
将
elasticsearch-ca.pem
证书复制到您安装Metricbeat的目录。 -
打开
metricbeat.yml
配置文件并配置与Elasticsearch的连接。在
output.elasticsearch
下,指定以下字段:output.elasticsearch: hosts: ["
:9200"] protocol: "https" username: "metricbeat_writer" password: " " ssl: certificate_authorities: ["elasticsearch-ca.pem"] verification_mode: "certificate" -
hosts
- 指定您的Elasticsearch集群正在运行的主机。
-
protocol
-
指示连接到Elasticsearch时要使用的协议。此值必须为
https
。 -
username
-
具有将事件发布到Elasticsearch所需权限的用户的名称。您创建的
metricbeat_writer
用户具有这些权限。 -
password
-
指定
username
的密码。 -
certificate_authorities
-
指示包含您的CA证书的本地
.pem
文件的路径。
-
-
配置与Kibana的连接。
在
setup.kibana
下,指定以下字段:setup.kibana host: "https://
:5601" ssl.enabled: true username: "metricbeat_setup" password: "p@ssw0rd" -
hosts
-
用于所有查询的Elasticsearch实例的URL。确保在URL中包含
https
。 -
username
-
具有在Kibana中设置仪表板所需权限的用户的名称。您创建的
metricbeat_setup
用户具有这些权限。 -
password
-
指定
username
的密码。
-
-
启用
elasticsearch-xpack
模块。./metricbeat modules enable elasticsearch-xpack
-
修改
elasticsearch-xpack
模块以使用HTTPS。该模块收集有关Elasticsearch的指标。打开
/modules.d/elasticsearch-xpack.yml
并指定以下字段:- module: elasticsearch xpack.enabled: true period: 10s hosts: ["https://
:9200"] username: "remote_monitoring_user" password: " " ssl: enabled: true certificate_authorities: ["elasticsearch-ca.pem"] verification_mode: "certificate" 配置SSL是监控加密流量节点的必要步骤。 请参阅为Metricbeat配置SSL。
-
hosts
-
指定您的Elasticsearch集群正在运行的主机。确保在URL中包含
https
。 -
username
-
具有收集指标数据权限的用户的名称。内置的
monitoring_user
用户具有这些权限。或者,您可以创建一个用户并为其分配monitoring_user
角色。 -
password
-
指定
username
的密码。 -
certificate_authorities
-
指示包含您的CA证书的本地
.pem
文件的路径。
-
-
如果你想使用预定义的资产进行解析、索引和可视化你的数据,运行以下命令来加载这些资产:
./metricbeat setup -e
-
启动Elasticsearch,然后启动Metricbeat。
./metricbeat -e
-e
是可选的,它将输出发送到标准错误而不是配置的日志输出。 -
登录到Kibana,打开主菜单,然后点击堆栈监控。
您将看到需要您关注的集群警报以及Elasticsearch的可用监控指标摘要。点击任何可用卡片上的标题链接以查看更多信息。
为本地和内置用户设置密码
edit在您实施安全措施后,您可能需要或希望为不同用户更改密码。您可以使用elasticsearch-reset-password
工具或更改密码API来更改本地用户和内置用户(如elastic
或kibana_system
用户)的密码。
例如,以下命令将用户名为 user1
的用户的密码更改为自动生成的值,并将新密码打印到终端:
bin/elasticsearch-reset-password -u user1
要为用户显式设置密码,请使用预期的密码包含-i
参数。
bin/elasticsearch-reset-password -u user1 -i <password>
如果你在 Kibana 中工作或没有命令行访问权限,你可以使用更改密码 API 来更改用户的密码:
POST /_security/user/user1/_password { "password" : "new-test-password" }
启用更强的加密密码套件
editTLS 和 SSL 协议使用一个密码套件来确定用于保护数据的加密强度。当使用 Oracle JVM 时,您可能希望增加所使用的加密强度;IcedTea OpenJDK 在发布时没有这些限制。成功使用加密通信并不需要这一步骤。
The Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 使您能够在Java中使用额外的密码套件,这些套件位于一个需要添加到您的Java安装中的单独JAR文件中。您可以从Oracle的 下载页面 下载此JAR文件。 JCE Unlimited Strength Jurisdiction Policy Files 是使用密钥长度超过128位的加密(如256位AES加密)所必需的。
安装后,JCE中的所有密码套件都可以使用,但需要进行配置才能使用它们。要启用与Elasticsearch安全功能一起使用更强的密码套件,请配置cipher_suites
参数。
必须在集群中的所有节点上安装JCE无限强度司法管辖区策略文件,以建立更高级别的加密强度。
JDK版本支持的SSL/TLS版本
editElasticsearch 依赖于您的 JDK 的 SSL 和 TLS 实现。
不同的JDK版本支持不同版本的SSL,这可能会影响Elasticsearch的运行方式。
此支持适用于在JDK中的默认JSSE提供程序上运行时。 配置为使用FIPS 140-2安全提供程序的JVM可能具有自定义TLS实现,这可能支持与此列表不同的TLS协议版本。
查看您的安全提供商的发布说明以获取有关TLS支持的信息。
-
SSLv3
- SSL v3 在所有 Elasticsearch 兼容的 JDK 上都受支持,但默认情况下是禁用的。 请参阅 在您的 JDK 上启用额外的 SSL/TLS 版本。
-
TLSv1
- TLS v1.0 在所有 Elasticsearch 兼容的 JDK 上都受支持。 一些较新的 JDK,包括与 Elasticsearch 捆绑的 JDK,默认情况下禁用 TLS v1.0。 请参阅 在您的 JDK 上启用额外的 SSL/TLS 版本。
-
TLSv1.1
- TLS v1.1 在所有 Elasticsearch 兼容的 JDK 上均受支持。 一些较新的 JDK,包括与 Elasticsearch 捆绑的 JDK,默认情况下禁用 TLS v1.1。 请参阅 在您的 JDK 上启用额外的 SSL/TLS 版本。
-
TLSv1.2
- TLS v1.2 在所有与 Elasticsearch 兼容的 JDK 上都受支持。 它在所有受 Elasticsearch 支持的 JDK 上默认启用,包括捆绑的 JDK。
-
TLSv1.3
-
TLS v1.3 在 JDK11 及更高版本上受支持,并且在 JDK8 构建版本高于 8u261(包括 Elasticsearch 支持的每个 JDK8 发行版的最新版本)上也受支持。 TLS v1.3 在 Elasticsearch 捆绑的 JDK 上受支持并默认启用。
尽管Elasticsearch支持在不启用TLS v1.3的旧版JDK8上运行, 我们建议升级到包含TLS v1.3的JDK版本,以获得更好的支持和更新。
在您的JDK上启用额外的SSL/TLS版本
editJDK支持的SSL/TLS版本集合由一个Java安全属性文件控制,该文件作为JDK的一部分安装。
此配置文件列出了在该JDK中禁用的SSL/TLS算法。 完成以下步骤以从该列表中移除TLS版本并在您的JDK中使用它。
- 找到您的JDK的配置文件。
-
从该文件中复制
jdk.tls.disabledAlgorithms
设置,并将其添加到Elasticsearch配置目录中的自定义配置文件中。 -
在自定义配置文件中,从
jdk.tls.disabledAlgorithms
中删除您想要使用的TLS版本的值。 - 配置Elasticsearch以将自定义系统属性传递给JDK,以便使用您的自定义配置文件。
查找您的JDK的配置文件
edit对于Elasticsearch的捆绑JDK,配置文件位于Elasticsearch主目录($ES_HOME
)的子目录中:
-
Linux:
$ES_HOME/jdk/conf/security/java.security
-
Windows:
$ES_HOME/jdk/conf/security/java.security
-
macOS:
$ES_HOME/jdk.app/Contents/Home/conf/security/java.security
对于JDK8,配置文件位于Java安装目录的jre/lib/security
目录中。
如果$JAVA_HOME
指向您用于运行Elasticsearch的JDK的主目录,
那么配置文件将位于:
-
$JAVA_HOME/jre/lib/security/java.security
对于JDK11 或更高版本,配置文件位于 Java 安装目录的 conf/security
目录中。
如果 $JAVA_HOME
指向您用于运行 Elasticsearch 的 JDK 的主目录,则配置文件将位于:
-
$JAVA_HOME/conf/security/java.security
复制 disabledAlgorithms 设置
edit在JDK配置文件中,有一行以jdk.tls.disabledAlgorithms=
开头。此设置控制JDK中哪些协议和算法被禁用。该设置的值通常会跨多行。
例如,在 OpenJDK 16 中,设置为:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
在您的 Elasticsearch 配置目录中创建一个名为 es.java.security
的新文件。
将 jdk.tls.disabledAlgorithms
设置从 JDK 的默认配置文件复制到 es.java.security
中。
您不需要复制任何其他设置。
启用所需的TLS版本
edit编辑 Elasticsearch 配置目录中的 es.java.security
文件,并修改 jdk.tls.disabledAlgorithms
设置,以便您希望使用的任何 SSL 或 TLS 版本不再列出。
例如,要在OpenJDK 16上启用TLSv1.1(使用前面显示的jdk.tls.disabledAlgorithms
设置),es.java.security
文件将包含之前禁用的TLS算法除了TLSv1.1
:
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
启用自定义安全配置
edit要启用您的自定义安全策略,请在您的 Elasticsearch 配置目录中的 jvm.options.d
目录下添加一个文件。
要启用您的自定义安全策略,请在 Elasticsearch 配置目录的 jvm.options.d 目录中创建一个名为 java.security.options
的文件,内容如下:
-Djava.security.properties=/path/to/your/es.java.security
在 Elasticsearch 中启用 TLS 版本
edit可以通过 ssl.supported_protocols
设置 在 Elasticsearch 中启用和禁用 SSL/TLS 版本。
Elasticsearch 只会支持由 底层 JDK 启用的 TLS 版本。如果你配置 ssl.supported_procotols
包含你的 JDK 中未启用的 TLS 版本,那么它将被静默忽略。
同样地,在您的JDK中启用的TLS版本,除非在Elasticsearch中配置为ssl.supported_protocols
之一,否则不会被使用。
安全文件
editElasticsearch 安全功能使用以下文件:
-
ES_PATH_CONF/roles.yml
定义了集群中使用的角色。参见 定义角色。 -
ES_PATH_CONF/elasticsearch-users
定义了file
领域中的用户及其哈希密码。参见 基于文件的用户认证。 -
ES_PATH_CONF/elasticsearch-users_roles
定义了file
领域中的用户角色分配。参见 基于文件的用户认证。 -
ES_PATH_CONF/role_mapping.yml
定义了将可分辨名称 (DN) 分配给角色的角色分配。这允许将 LDAP 和 Active Directory 组和用户以及 PKI 用户映射到角色。参见 将用户和组映射到角色。 -
ES_PATH_CONF/log4j2.properties
包含审计信息。参见 日志文件审计输出。
这些文件中有几个是 YAML 格式的。在编辑这些文件时,请注意 YAML 对缩进级别敏感,缩进错误可能导致配置错误。避免使用制表符来设置缩进级别,或者使用自动将制表符扩展为空格的编辑器。
请注意正确转义YAML结构,例如:
或在引号字符串中的前导感叹号。使用|
或>
字符来定义块文字,而不是转义有问题的字符,可以帮助避免问题。
FIPS 140-2
edit联邦信息处理标准(FIPS)出版物140-2(FIPS PUB 140-2),标题为“加密模块的安全要求”,是美国政府用于批准加密模块的计算机安全标准。Elasticsearch提供了一个符合FIPS 140-2的模式,因此可以在配置为FIPS 140-2的JVM中运行。
遵守FIPS 140-2要求仅使用FIPS批准/NIST推荐的加密算法。通常可以通过以下方式实现:
- 安装和配置符合FIPS认证的Java安全提供程序。
- 确保Elasticsearch的配置符合FIPS 140-2标准,如下文所述。
-
在
elasticsearch.yml
中将xpack.security.fips_mode.enabled
设置为true
。注意 - 仅此设置不足以符合FIPS 140-2标准。
配置 Elasticsearch 以支持 FIPS 140-2
edit详细说明为符合FIPS 140-2要求所需的配置超出了本文档的范围。确保符合FIPS 140-2是用户的责任。Elasticsearch已通过以下特定配置进行了测试。然而,还有其他可能的配置可以实现合规性。
以下是所需配置的高级概述:
- 使用外部安装的Java安装。Elasticsearch捆绑的JVM未配置为符合FIPS 140-2。
-
在Elasticsearch的
lib
目录中安装符合FIPS认证的安全提供程序.jar文件。 - 配置Java以使用符合FIPS认证的安全提供程序(见下文)。
- 配置Elasticsearch的安全管理器以允许使用符合FIPS认证的提供程序(见下文)。
- 确保密钥库和信任库配置正确(见下文)。
- 确保TLS设置配置正确(见下文)。
- 确保密码哈希设置配置正确(见下文)。
- 确保缓存密码哈希设置配置正确(见下文)。
-
配置
elasticsearch.yml
以使用FIPS 140-2模式,参见(下文)。 - 验证安全提供程序是否已正确安装和配置(见下文)。
- 查看升级注意事项(见下文)和限制(见下文)。
Java 安全提供者
edit详细说明如何安装和配置符合FIPS标准的Java安全提供程序超出了本文档的范围。 具体来说,需要符合FIPS标准的 JCA 和 JSSE 实现, 以便JVM使用NIST推荐的加密算法的FIPS验证实现。
Elasticsearch 已经测试了 Bouncy Castle 的 bc-fips 1.0.2.4 和 bctls-fips 1.0.17。 请参考 Elasticsearch 的 JVM 支持矩阵 以了解在 FIPS 模式下支持哪些 JVM 和安全提供者的组合。Elasticsearch 不附带 FIPS 认证的提供者。用户有责任 安装和配置安全提供者,以确保符合 FIPS 140-2。使用 FIPS 认证的提供者将确保仅使用 批准的加密算法。
要配置 Elasticsearch 使用额外的安全提供程序,请将 Elasticsearch 的 JVM 属性 java.security.properties
指向 Elasticsearch 的 config
目录中的文件(示例)。确保 FIPS 认证的安全提供程序配置为最低顺序。此文件应包含必要的配置,以指示 Java 使用 FIPS 认证的安全提供程序。
Java 安全管理器
edit在Elasticsearch中运行的所有代码都受到Java安全管理器强制执行的安全限制。 您安装和配置的安全提供程序可能需要额外的权限才能正常运行。您可以通过提供自己的 Java安全策略来授予这些权限。
要配置 Elasticsearch 的安全管理器,请将 JVM 属性 java.security.policy
指向 Elasticsearch 的 config
目录中的一个文件(示例),并包含所需的权限。此文件应包含 Java 安全管理器所需的配置,以授予安全提供程序所需的权限。
Elasticsearch 密钥库
editFIPS 140-2(通过NIST特别出版物800-132)规定加密密钥应至少具有112位的有效强度。 因此,存储节点安全设置的Elasticsearch密钥库需要使用满足此要求的密码进行密码保护。 这意味着密码需要至少14字节长,相当于14个字符的ASCII编码密码,或7个字符的UTF-8编码密码。 您可以使用elasticsearch-keystore passwd子命令来更改或设置现有密钥库的密码。 请注意,当密钥库受密码保护时,每次Elasticsearch启动时都必须提供密码。
TLS
editSSLv2 和 SSLv3 不被 FIPS 140-2 允许,因此 SSLv2Hello
和 SSLv3
不能用于 ssl.supported_protocols
。
TLS 密码的使用主要由相关的加密模块(您的 JVM 使用的 FIPS 批准的安全提供程序)管理。Elasticsearch 中默认配置的所有密码都符合 FIPS 140-2 标准,因此可以在 FIPS 140-2 JVM 中使用。请参阅 ssl.cipher_suites
。
TLS 密钥库和密钥
edit密钥库可以在多个通用TLS设置中使用,以便方便地存储密钥和信任材料。无论是JKS
还是PKCS#12
密钥库,都不能在配置为FIPS 140-2的JVM中使用。请避免使用这些类型的密钥库。您的FIPS 140-2提供商可能会提供一个合规的密钥库实现,可以使用该实现,或者您可以使用PEM编码的文件。要使用PEM编码的密钥材料,您可以使用相关的\*.key
和*.certificate
配置选项,而对于信任材料,您可以使用*.certificate_authorities
。
FIPS 140-2 合规性规定,用于 TLS 的公钥长度必须与 TLS 中使用的对称密钥算法强度相对应。根据您选择的 ssl.cipher_suites
值,TLS 密钥必须具有以下表格中对应的长度:
存储密码哈希
edit虽然 Elasticsearch 提供了多种算法来安全地对磁盘上的凭证进行哈希处理,但只有基于 PBKDF2
的算法系列符合 FIPS 140-2 的存储密码哈希要求。然而,由于 PBKDF2
本质上是一个密钥派生函数,您的 JVM 安全提供程序可能会强制执行 112 位密钥强度要求。尽管 FIPS 140-2 并未规定用户密码标准,但此要求可能会影响 Elasticsearch 中的密码哈希处理。为了满足此要求,同时允许您使用符合安全策略的密码,Elasticsearch 提供了 pbkdf2_stretch,这是在 FIPS 140-2 环境中运行 Elasticsearch 时建议使用的哈希算法。pbkdf2_stretch
在将用户密码传递给 PBKDF2
实现之前,会对用户密码执行一轮 SHA-512 哈希处理。
如果您有外部策略和工具可以确保保留、本机和文件领域中所有用户密码的长度超过14字节,您仍然可以使用其中一个普通的pbkdf2
选项,而不是pbkdf2_stretch
。
您必须将 xpack.security.authc.password_hashing.algorithm
设置为其中一个可用的 pbkdf_stretch_*
值。
当启用 FIPS-140 模式时,xpack.security.authc.password_hashing.algorithm
的默认值为 pbkdf2_stretch
。
请参阅 用户缓存和密码哈希算法。
密码哈希配置更改不是回溯性的,因此保留、本地和文件领域中现有用户的存储哈希凭据不会在磁盘上更新。 为了确保符合FIPS 140-2标准,请使用elasticsearch-user CLI工具重新创建用户或更改其密码, 对于文件领域,以及使用创建用户和 更改密码 API为本地和保留领域。 其他类型的领域不受影响,不需要任何更改。
缓存的密码哈希
editssha256
(加盐的 sha256
)推荐用于缓存哈希。虽然 PBKDF2
符合 FIPS-140-2 标准,但它是——根据设计——较慢的,因此通常不适合作为缓存哈希算法。缓存的凭证永远不会存储在磁盘上,而加盐的 sha256
提供了足够的内存中凭证哈希安全性,而不会带来过高的性能开销。您可以使用 PBKDF2
,但您应首先仔细评估性能影响。根据您的部署情况,PBKDF2
的开销可能会抵消使用缓存的大部分性能提升。
要么将所有cache.hash_algo
设置为ssha256
,要么保持它们未定义,因为ssha256
是所有cache.hash_algo
设置的默认值。请参阅用户缓存和密码哈希算法。
用户缓存将在节点重启时被清空,因此任何使用不符合规范算法的现有哈希将被丢弃,新的哈希将使用您选择的算法创建。
配置 Elasticsearch elasticsearch.yml
edit-
在
elasticsearch.yml
中将xpack.security.fips_mode.enabled
设置为true
。此设置用于确保配置一些内部配置以符合 FIPS 140-2 标准,并提供一些额外的验证。 -
将
xpack.security.autoconfiguration.enabled
设置为false
。这将禁用安全设置的自动配置。用户必须确保安全设置已正确配置以符合 FIPS-140-2 标准。这仅适用于新安装。 -
适当地设置
xpack.security.authc.password_hashing.algorithm
,请参见 上文。 - 其他相关的安全设置。例如,传输和 HTTP 接口的 TLS。(此处或下面的示例中未明确涵盖)
-
可选:在
elasticsearch.yml
中设置xpack.security.fips_mode.required_providers
以确保所需的安全提供程序(8.13+)。请参见 下文。
xpack.security.fips_mode.enabled: true xpack.security.autoconfiguration.enabled: false xpack.security.fips_mode.required_providers: ["BCFIPS", "BCJSSE"] xpack.security.authc.password_hashing.algorithm: "pbkdf2_stretch"
验证安全提供程序已安装
edit要验证安全提供程序是否已安装并正在使用,您可以使用以下任一步骤:
-
验证所需的安全提供程序在
java.security.properties
指向的文件中以最低顺序配置。 例如,security.provider.1
的顺序低于security.provider.2
-
在
elasticsearch.yml
中设置xpack.security.fips_mode.required_providers
为所需的安全提供程序列表。 此设置用于确保安装并配置了正确的安全提供程序。(8.13+) 如果安全提供程序未正确安装,Elasticsearch将无法启动。["BCFIPS", "BCJSSE"]
是用于Bouncy Castle的FIPS JCE和JSSE认证提供程序的值。
升级注意事项
editElasticsearch 8.0+ 需要 Java 17 或更高版本。Elasticsearch 8.13+ 已与 Bouncy Castle 的 Java 17 认证 FIPS 实现进行了测试,并且在 FIPS 140-2 模式下运行 Elasticsearch 时,推荐使用此 Java 安全提供程序。 注意 - Elasticsearch 不附带 FIPS 认证的安全提供程序,需要显式安装和配置。
或者,考虑在FedRAMP认证的GovCloud区域中使用Elasticsearch服务。
一些加密算法在更新的FIPS 140-2安全提供程序中可能不再默认可用。 值得注意的是,三重DES和PKCS1.5 RSA现在已被弃用,并且Bouncy Castle现在 需要显式配置才能继续使用这些算法。
如果您计划将现有集群升级到可以在FIPS 140-2配置的JVM中运行的版本,我们建议首先在现有JVM中执行滚动升级到新版本,并执行所有必要的配置更改,以准备在FIPS 140-2模式下运行。然后,您可以执行节点的滚动重启,在FIPS 140-2 JVM中启动每个节点。在重启期间,Elasticsearch:
- 将安全设置升级到最新、符合要求的格式。 FIPS 140-2 JVM无法加载以前的格式版本。如果您的密钥库未受密码保护,您必须手动设置密码。请参阅 Elasticsearch 密钥库。
- 将自生成的试用许可证升级到最新的符合FIPS 140-2的格式。
如果你的订阅已经支持FIPS 140-2模式,你可以选择在执行滚动升级的同时,在FIPS 140-2 JVM中运行每个升级后的节点。在这种情况下,你需要在启动每个节点之前,手动重新生成你的elasticsearch.keystore
并将所有安全设置迁移到其中,此外还需要进行下面列出的必要配置更改。
限制
edit由于FIPS 140-2合规性所施加的限制,在FIPS 140-2模式下运行时,有少量功能不可用。列表如下:
- Azure Classic Discovery Plugin
-
The
elasticsearch-certutil
工具。然而,elasticsearch-certutil
可以在非 FIPS 140-2 配置的 JVM 中使用(通过将ES_JAVA_HOME
环境变量指向不同的 Java 安装),以便生成可以在 FIPS 140-2 配置的 JVM 中稍后使用的密钥和证书。 - SQL CLI 客户端在 FIPS 140-2 配置的 JVM 中无法运行,同时使用 TLS 进行传输安全或使用 PKI 进行客户端身份验证。