为 Elastic Stack 设置基本安全性

编辑

首次启动 Elasticsearch 时,会为 elastic 用户生成密码,并自动为您配置 TLS。如果您在启动 Elasticsearch 节点之前手动配置安全性,则自动配置过程将尊重您的安全配置。您可以随时调整 TLS 配置,例如更新节点证书

如果您的集群有多个节点,则必须在节点之间配置 TLS。如果不启用 TLS,生产模式集群将无法启动。

传输层依靠相互 TLS 来进行加密和节点身份验证。正确应用 TLS 可以确保恶意节点无法加入集群并与其他节点交换数据。虽然在 HTTP 层实施用户名和密码验证对于保护本地集群非常有用,但节点之间通信的安全性需要 TLS。

在节点之间配置 TLS 是防止未经授权的节点访问您的集群的基本安全设置。

生成证书颁发机构

编辑

您可以在集群中添加任意数量的节点,但它们必须能够相互通信。集群中节点之间的通信由传输模块处理。为了保护您的集群,您必须确保节点间通信已加密并经过验证,这通过相互 TLS 实现。

在受保护的集群中,Elasticsearch 节点在与其他节点通信时使用证书来标识自己。

集群必须验证这些证书的真实性。 推荐的方法是信任特定的证书颁发机构 (CA)。 当节点添加到您的集群时,它们必须使用同一 CA 签名的证书。

对于传输层,我们建议使用单独的专用 CA,而不是现有的、可能共享的 CA,以便严格控制节点成员资格。使用 elasticsearch-certutil 工具为您的集群生成 CA。

  1. 在启动 Elasticsearch 之前,请在任何单个节点上使用 elasticsearch-certutil 工具为您的集群生成 CA。

    ./bin/elasticsearch-certutil ca
    1. 出现提示时,接受默认文件名,即 elastic-stack-ca.p12。 此文件包含您的 CA 的公钥证书和用于为每个节点签名证书的私钥。
    2. 输入您的 CA 的密码。 如果您不是部署到生产环境,则可以选择将密码留空。
  2. 在任何单个节点上,为集群中的节点生成证书和私钥。 您需要包含在上一步中生成的 elastic-stack-ca.p12 输出文件。

    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    --ca <ca_file>

    用于签署证书的 CA 文件名称。 elasticsearch-certutil 工具的默认文件名为 elastic-stack-ca.p12

    1. 输入您的 CA 的密码,或者如果您在上一步中未配置密码,请按Enter
    2. 为证书创建密码并接受默认文件名。

      输出文件是一个名为 elastic-certificates.p12 的密钥库。 此文件包含节点证书、节点密钥和 CA 证书。

  3. 在集群中的每个节点上,将 elastic-certificates.p12 文件复制到 $ES_PATH_CONF 目录。

使用 TLS 加密节点间通信

编辑

传输网络层用于集群中节点之间的内部通信。启用安全功能时,您必须使用 TLS 来确保节点之间的通信已加密。

现在您已经生成了证书颁发机构和证书,您将更新您的集群以使用这些文件。

Elasticsearch 监视所有文件,例如配置为 TLS 相关节点设置值的证书、密钥、密钥库或信任库。如果您更新任何这些文件,例如当您的主机名更改或您的证书即将过期时,Elasticsearch 会重新加载它们。文件会以全局 Elasticsearch resource.reload.interval.high 设置确定的频率轮询更改,该设置默认为 5 秒。

集群中的每个节点完成以下步骤。要加入同一集群,所有节点必须共享相同的 cluster.name 值。

  1. 打开 $ES_PATH_CONF/elasticsearch.yml 文件并进行以下更改

    1. 添加 cluster-name 设置,并输入集群的名称

      cluster.name: my-cluster
    2. 添加 node.name 设置,并输入节点的名称。 节点名称默认为 Elasticsearch 启动时的主机名。

      node.name: node-1
    3. 添加以下设置以启用节点间通信并提供对节点证书的访问。

      由于您在集群中的每个节点上都使用相同的 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 参数。

  2. 如果您在创建节点证书时输入了密码,请运行以下命令将密码存储在 Elasticsearch 密钥库中

    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
  3. 为集群中的每个节点完成之前的步骤。
  4. 在集群中的每个节点上,启动 Elasticsearch。启动停止 Elasticsearch 的方法因您的安装方式而异。

    例如,如果您使用存档分发(tar.gz.zip)安装了 Elasticsearch,则可以在命令行中输入 Ctrl+C 来停止 Elasticsearch。

    您必须执行完整的集群重启。配置为对传输使用 TLS 的节点无法与使用未加密传输连接的节点通信(反之亦然)。

下一步是什么?

编辑

恭喜!您已加密集群中节点之间的通信,并且可以通过TLS 引导检查

要添加另一层安全性,请为 Elastic Stack 设置基本安全性并保护 HTTPS 流量。除了在 Elasticsearch 集群的传输接口上配置 TLS 之外,您还可以在 Elasticsearch 和 Kibana 的 HTTP 接口上配置 TLS。