为 Elastic Stack 设置基本安全性和安全的 HTTPS 流量

编辑

为 Elastic Stack 设置基本安全性和安全的 HTTPS 流量编辑

在 HTTP 层启用 TLS 时,它提供了一层额外的安全保障,以确保与您的集群的所有通信都经过加密。

http 模式下运行 elasticsearch-certutil 工具时,该工具会询问有关您希望如何生成证书的几个问题。虽然有很多选项,但以下选择会生成适用于大多数环境的证书。

先决条件编辑

完成 为 Elastic Stack 设置基本安全 中的所有步骤。

加密 Elasticsearch 的 HTTP 客户端通信编辑

  1. 在集群中的 每个 节点上,如果 Elasticsearch 和 Kibana 正在运行,请停止它们。
  2. 在任何单个节点上,从安装 Elasticsearch 的目录中,运行 Elasticsearch HTTP 证书工具以生成证书签名请求 (CSR)。

    ./bin/elasticsearch-certutil http

    此命令会生成一个 .zip 文件,其中包含要与 Elasticsearch 和 Kibana 一起使用的证书和密钥。每个文件夹都包含一个 README.txt,解释如何使用这些文件。

    1. 当询问您是否要生成 CSR 时,请输入 n
    2. 当询问您是否要使用现有的 CA 时,请输入 y
    3. 输入 CA 的路径。这是您为集群生成的 elastic-stack-ca.p12 文件的绝对路径。
    4. 输入 CA 的密码。
    5. 输入证书的有效期。您可以以年、月或日为单位输入有效期。例如,输入 90D 表示 90 天。
    6. 当询问您是否要为每个节点生成一个证书时,请输入 y

      每个证书将有自己的私钥,并将为特定主机名或 IP 地址颁发。

    7. 当提示时,输入集群中第一个节点的名称。使用与 生成节点证书 时使用的相同节点名称。
    8. 输入用于连接到第一个节点的所有主机名。这些主机名将作为 DNS 名称添加到证书的主题备用名称 (SAN) 字段中。

      列出用于通过 HTTPS 连接到集群的每个主机名和变体。

    9. 输入客户端可以用来连接到节点的 IP 地址。
    10. 对集群中的每个其他节点重复这些步骤。
  3. 为每个节点生成证书后,当提示时,输入私钥的密码。
  4. 解压缩生成的 elasticsearch-ssl-http.zip 文件。此压缩文件包含一个用于 Elasticsearch 和 Kibana 的目录。

    /elasticsearch
    |_ README.txt
    |_ http.p12
    |_ sample-elasticsearch.yml
    /kibana
    |_ README.txt
    |_ elasticsearch-ca.pem
    |_ sample-kibana.yml
  5. 在集群中的 每个 节点上,完成以下步骤

    1. 将相关的 http.p12 证书复制到 $ES_PATH_CONF 目录。
    2. 编辑 elasticsearch.yml 文件以启用 HTTPS 安全并指定 http.p12 安全证书的位置。

      xpack.security.http.ssl.enabled: true
      xpack.security.http.ssl.keystore.path: http.p12
    3. 将私钥的密码添加到 Elasticsearch 中的安全设置。

      ./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
    4. 启动 Elasticsearch。

下一步: 加密 Kibana 的 HTTP 客户端通信

加密 Kibana 的 HTTP 客户端通信编辑

浏览器将流量发送到 Kibana,Kibana 将流量发送到 Elasticsearch。这些通信通道分别配置为使用 TLS。您加密 Kibana 和 Elasticsearch 之间的流量,然后加密浏览器和 Kibana 之间的流量。

加密 Kibana 和 Elasticsearch 之间的流量编辑

在使用 http 选项运行 elasticsearch-certutil 工具时,它创建了一个包含 elasticsearch-ca.pem 文件的 /kibana 目录。您使用此文件将 Kibana 配置为信任 Elasticsearch CA 的 HTTP 层。

  1. elasticsearch-ca.pem 文件复制到 Kibana 配置目录,如 $KBN_PATH_CONF 路径所定义。
  2. 打开 kibana.yml 并添加以下行以指定 HTTP 层的安全证书的位置。

    elasticsearch.ssl.certificateAuthorities: $KBN_PATH_CONF/elasticsearch-ca.pem
  3. 添加以下行以指定 Elasticsearch 集群的 HTTPS URL。

    elasticsearch.hosts: https://<your_elasticsearch_host>:9200
  4. 重新启动 Kibana。

下一步: 加密浏览器和 Kibana 之间的流量

加密浏览器和 Kibana 之间的流量编辑

您为 Kibana 创建服务器证书和私钥。Kibana 在接收来自 Web 浏览器的连接时使用此服务器证书和相应的私钥。

获取服务器证书后,必须正确设置其主题备用名称 (SAN),以确保浏览器信任它。您可以将一个或多个 SAN 设置为 Kibana 服务器的完全限定域名 (FQDN)、主机名或 IP 地址。选择 SAN 时,请选择您将在浏览器中用来连接到 Kibana 的属性,这很可能是 FQDN。

以下说明为 Kibana 创建证书签名请求 (CSR)。CSR 包含 CA 用于生成和签名安全证书的信息。该证书可以是受信任的(由公共、受信任的 CA 签名)或不受信任的(由内部 CA 签名)。自签名或内部签名的证书适用于开发环境和构建概念验证,但不应在生产环境中使用。

在进入生产环境之前,请使用受信任的 CA(例如 Let’s Encrypt 或您组织的内部 CA)来签名证书。使用签名的证书可以为内部访问或公共互联网上的 Kibana 连接建立浏览器信任。

  1. 为 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
  2. 解压缩 csr-bundle.zip 文件以获取 kibana-server.csr 未签名的安全证书和 kibana-server.key 未加密的私钥。
  3. kibana-server.csr 证书签名请求发送到您的内部 CA 或受信任的 CA 以进行签名,以获取签名的证书。签名的文件可以采用不同的格式,例如 .crt 文件,如 kibana-server.crt
  4. 打开 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 配置文件的路径。如果您使用存档发行版(ziptar.gz)安装了 Kibana,则路径默认为 $KBN_HOME/config。如果您使用的是软件包发行版(Debian 或 RPM),则路径默认为 /etc/kibana

  5. kibana.yml 中添加以下行以启用入站连接的 TLS。

    server.ssl.enabled: true
  6. 启动 Kibana。

进行这些更改后,您必须始终通过 HTTPS 访问 Kibana。例如,https://<your_kibana_host>.com

下一步: 配置 Beats 安全性

配置 Beats 安全性编辑

Beats 是开源数据发送器,您可以在服务器上将其安装为代理,以将操作数据发送到 Elasticsearch。每个 Beat 都是一个单独可安装的产品。以下步骤介绍了如何为 Metricbeat 配置安全性。请按照这些步骤为要配置安全性的每个 其他 Beat 配置安全性。

先决条件编辑

使用您首选的方法 安装 Metricbeat

在完成以下步骤之前,您无法连接到 Elastic Stack 或为 Metricbeat 配置资产。

为 Metricbeat 创建角色编辑

通常,您需要创建以下单独的角色

  • 设置 角色用于设置索引模板和其他依赖项
  • 监控 角色用于发送监控信息
  • 写入器 角色用于发布 Metricbeat 收集的事件
  • 读取器 角色用于需要查看和创建访问 Metricbeat 数据的可视化的 Kibana 用户

这些说明假设您使用的是 Metricbeat 索引的默认名称。如果未列出指示的索引名称,或者您使用的是自定义名称,请在定义角色时手动输入它,并修改权限以匹配您的索引命名模式。

要从 Kibana 中的 Stack Management 创建用户和角色,请从侧边导航中选择 角色用户

下一步: 创建设置角色

创建设置角色和用户编辑

设置 Metricbeat 的管理员通常需要加载映射、仪表板和其他用于将数据索引到 Elasticsearch 并将其可视化到 Kibana 中的对象。

设置 Metricbeat 是一项管理员级任务,需要额外的权限。作为最佳实践,仅向管理员授予设置角色,并使用更严格的角色进行事件发布。

  1. 创建设置角色
  2. 输入 metricbeat_setup 作为角色名称。
  3. 选择 监控管理 ILM 集群权限。
  4. metricbeat-* 索引上,选择 管理写入 权限。

    如果未列出 metricbeat-* 索引,请将该模式输入索引列表中。

  5. 创建设置用户
  6. 输入 metricbeat_setup 作为用户名。
  7. 输入用户名、密码和其他用户详细信息。
  8. 将以下角色分配给 metricbeat_setup 用户

    角色 目的

    metricbeat_setup

    设置 Metricbeat。

    kibana_admin

    加载依赖项(如果有),例如示例仪表板,到 Kibana 中

    ingest_admin

    设置索引模板,以及(如果有)摄取管道

下一步: 创建监控角色

创建监控角色和用户编辑

要安全地发送监控数据,请创建一个监控用户并授予其必要的权限。

如果您的环境中可用,您可以使用内置的 beats_system 用户。由于内置用户在 Elastic Cloud 中不可用,因此这些说明会创建一个明确用于监控 Metricbeat 的用户。

  1. 如果您使用的是内置的 beats_system 用户,请在集群中的任何节点上运行 elasticsearch-reset-password 实用程序来设置该用户的密码

    此命令将 beats_system 用户的密码重置为自动生成的 value。

    ./bin/elasticsearch-reset-password -u beats_system

    如果您要将密码设置为特定 value,请使用交互式 (-i) 参数运行该命令。

    ./bin/elasticsearch-reset-password -i -u beats_system
  2. 创建监控角色
  3. 输入 metricbeat_monitoring 作为角色名称。
  4. 选择 监控 集群权限。
  5. .monitoring-beats-* 索引上,选择 创建索引创建文档 权限。
  6. 创建监控用户
  7. 输入 metricbeat_monitoring 作为用户名。
  8. 输入用户名、密码和其他用户详细信息。
  9. 将以下角色分配给 metricbeat_monitoring 用户

    角色 目的

    metricbeat_monitoring

    监控 Metricbeat。

    kibana_admin

    使用 Kibana

    monitoring_user

    使用 Kibana 中的 Stack Monitoring 监控 Metricbeat

下一步: 创建写入器角色

创建写入器角色和用户编辑

将事件发布到 Elasticsearch 的用户需要创建 Metricbeat 索引并写入这些索引。为了最大程度地减少写入器角色所需的权限,请使用设置角色来预加载依赖项。本节假设您已 创建设置角色

  1. 创建写入器角色
  2. 输入 metricbeat_writer 作为角色名称。
  3. 选择 监控读取 ILM 集群权限。
  4. metricbeat-* 索引上,选择 创建文档创建索引查看索引元数据 权限。
  5. 创建写入器用户
  6. 输入 metricbeat_writer 作为用户名。
  7. 输入用户名、密码和其他用户详细信息。
  8. 将以下角色分配给 metricbeat_writer 用户

    角色 目的

    metricbeat_writer

    监控 Metricbeat

    remote_monitoring_collector

    从 Metricbeat 收集监控指标

    remote_monitoring_agent

    将监控数据发送到监控集群

下一步: 创建读取器角色

创建读取器角色和用户编辑

Kibana 用户通常需要查看包含 Metricbeat 数据的仪表板和可视化。这些用户可能还需要创建和编辑仪表板和可视化。创建读取器角色以将适当的权限分配给这些用户。

  1. 创建读取器角色
  2. 输入 metricbeat_reader 作为角色名称。
  3. metricbeat-* 索引上,选择 读取 权限。
  4. Kibana 下,单击 添加 Kibana 权限

    • 空间 下,选择 默认
    • 为 Discover、Visualize、Dashboard 和 Metrics 选择 读取全部
  5. 创建读取器用户
  6. 输入 metricbeat_reader 作为用户名。
  7. 输入用户名、密码和其他用户详细信息。
  8. 将以下角色分配给 metricbeat_reader 用户

    角色 目的

    metricbeat_reader

    读取 Metricbeat 数据。

    monitoring_user

    允许用户监控 Metricbeat 本身的运行状况。仅将此角色分配给管理 Metricbeat 的用户

    beats_admin

    在 Beats 中央管理中创建和管理配置。仅将此角色分配给需要使用 Beats 中央管理的用户。

下一步: 配置 Metricbeat 以使用 TLS

配置 Metricbeat 以使用 TLS编辑

在启动 Metricbeat 之前,您需要配置与 Elasticsearch 和 Kibana 的连接。您可以配置身份验证以使用基本身份验证、API 密钥身份验证或公钥基础设施 (PKI) 证书将数据发送到安全集群。

以下说明使用您创建的 metricbeat_writermetricbeat_setup 用户的凭据。如果您需要更高的安全性,建议使用 PKI 证书。

配置与 Elasticsearch 和 Kibana 的连接后,您将启用 elasticsearch-xpack 模块,并配置该模块以使用 HTTPS。

在生产环境中,我们强烈建议使用单独的集群(称为监控集群)来存储您的数据。使用单独的监控集群可以防止生产集群中断影响您访问监控数据的能力。它还可以防止监控活动影响生产集群的性能。

  1. 在您 为 HTTP 层生成证书 的节点上,导航到 /kibana 目录。
  2. elasticsearch-ca.pem 证书复制到您安装 Metricbeat 的目录。
  3. 打开 metricbeat.yml 配置文件并配置与 Elasticsearch 的连接。

    output.elasticsearch 下,指定以下字段

    output.elasticsearch:
     hosts: ["<your_elasticsearch_host>:9200"]
     protocol: "https"
     username: "metricbeat_writer"
     password: "<password>"
     ssl:
       certificate_authorities: ["elasticsearch-ca.pem"]
       verification_mode: "certificate"
    hosts
    指定运行 Elasticsearch 集群的主机。
    协议
    指示连接到 Elasticsearch 时使用的协议。此值必须为 https
    用户名
    具有将事件发布到 Elasticsearch 所需权限的用户的名称。您创建的 metricbeat_writer 用户具有这些权限。
    密码
    指示的 用户名 的密码。
    证书颁发机构
    指示包含您 CA 证书的本地 .pem 文件的路径。
  4. 配置与 Kibana 的连接。

    setup.kibana 下,指定以下字段

    setup.kibana
     host: "https://<your_elasticsearch_host>:5601"
     ssl.enabled: true
     username: "metricbeat_setup"
     password: "p@ssw0rd"
    hosts
    用于所有查询的 Elasticsearch 实例的 URL。确保在 URL 中包含 https
    用户名
    具有在 Kibana 中设置仪表板所需权限的用户的名称。您创建的 metricbeat_setup 用户具有这些权限。
    密码
    指示的 用户名 的密码。
  5. 启用 elasticsearch-xpack 模块。

    ./metricbeat modules enable elasticsearch-xpack
  6. 修改 elasticsearch-xpack 模块以使用 HTTPS。此模块收集有关 Elasticsearch 的指标。

    打开 /modules.d/elasticsearch-xpack.yml 并指定以下字段

    - module: elasticsearch
     xpack.enabled: true
     period: 10s
     hosts: ["https://<your_elasticsearch_host>:9200"]
     username: "remote_monitoring_user"
     password: "<password>"
     ssl:     
       enabled: true
       certificate_authorities: ["elasticsearch-ca.pem"]
       verification_mode: "certificate"

    监控具有加密流量的节点时,需要配置 SSL。请参阅 为 Metricbeat 配置 SSL

    hosts
    指定您的 Elasticsearch 集群运行的主机。确保在 URL 中包含 https
    用户名
    具有收集指标数据权限的用户的名称。内置的 monitoring_user 用户具有这些权限。或者,您可以创建一个用户并为其分配 monitoring_user 角色。
    密码
    指示的 用户名 的密码。
    证书颁发机构
    指示包含您 CA 证书的本地 .pem 文件的路径。
  7. 如果您想使用预定义的资产来解析、索引和可视化您的数据,请运行以下命令来加载这些资产

    ./metricbeat setup -e
  8. 启动 Elasticsearch,然后启动 Metricbeat。

    ./metricbeat -e

    -e 是可选的,它将输出发送到标准错误而不是配置的日志输出。

  9. 登录 Kibana,打开主菜单,然后单击 堆栈监控

    您将看到需要您注意的集群警报以及 Elasticsearch 可用监控指标的摘要。单击任何可用卡片上的标题链接以查看更多信息。