为 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 工具时,它会创建一个 /kibana 目录,其中包含一个 elasticsearch-ca.pem 文件。您可以使用此文件来配置 Kibana,使其信任 HTTP 层的 Elasticsearch CA。

  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)对证书进行签名。使用签名证书可建立浏览器对内部访问或在公共 Internet 上连接到 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 进行签名,以获得签名的证书。 签名的文件可以采用不同的格式,例如像 kibana-server.crt 这样的 .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 创建角色

编辑

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

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

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

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

下一步创建安装角色

创建安装角色和用户
编辑

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

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

  1. 创建设置角色
  2. 输入 metricbeat_setup 作为角色名称。
  3. 选择 monitormanage_ilm 集群权限。
  4. metricbeat-\* 索引上,选择 managewrite 权限。

    如果 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 用户的密码重置为自动生成的值。

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

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

    ./bin/elasticsearch-reset-password -i -u beats_system
  2. 创建监控角色
  3. 输入 metricbeat_monitoring 作为角色名称。
  4. 选择 monitor 集群权限。
  5. .monitoring-beats-\* 索引上,选择 create_indexcreate_doc 权限。
  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. 选择 monitorread_ilm 集群权限。
  4. metricbeat-\* 索引上,选择 create_doccreate_indexview_index_metadata 权限。
  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-\* 索引上,选择 read 权限。
  4. Kibana 下,单击 添加 Kibana 权限

    • 空间 下,选择 默认
    • 为“发现”、“可视化”、“仪表板”和“指标”选择 读取全部
  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 集群正在运行的主机。
    protocol
    指示连接到 Elasticsearch 时要使用的协议。此值必须为 https
    username
    具有将事件发布到 Elasticsearch 所需权限的用户名。您创建的 metricbeat_writer 用户具有这些权限。
    password
    指示的 username 的密码。
    certificate_authorities
    指示包含您的 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
    username
    具有在 Kibana 中设置仪表板所需权限的用户名。您创建的 metricbeat_setup 用户具有这些权限。
    password
    指示的 username 的密码。
  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
    username
    具有收集指标数据权限的用户名。内置的 monitoring_user 用户具有这些权限。或者,您可以创建一个用户并为其分配 monitoring_user 角色。
    password
    指示的 username 的密码。
    certificate_authorities
    指示包含您的 CA 证书的本地 .pem 文件的路径。
  7. 如果要使用预定义的资产来解析、索引和可视化数据,请运行以下命令来加载这些资产

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

    ./metricbeat -e

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

  9. 登录 Kibana,打开主菜单,然后单击 Stack Monitoring

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