保护与 Elasticsearch 的连接

编辑

保护与 Elasticsearch 的连接编辑

Logstash Elasticsearch 输出输入过滤器插件,以及监控和集中管理,支持通过 HTTPS 进行身份验证和加密。

Elasticsearch 集群默认是安全的(从 8.0 开始)。您需要为 Logstash 配置身份验证凭据才能建立通信。如果身份验证失败,Logstash 会抛出异常并停止处理管道。

除了为 Logstash 配置身份验证凭据之外,您还需要授予授权用户访问 Logstash 索引的权限。

默认情况下,Elasticsearch 集群上的安全性处于启用状态(从 8.0 开始)。您必须在 Logstash 配置的 Elasticsearch 输出部分启用 TLS/SSL,以便允许 Logstash 与 Elasticsearch 集群通信。

默认启用 Elasticsearch 安全性编辑

Elasticsearch 在启动时会生成自己的默认自签名安全套接字层 (SSL) 证书。

Logstash 必须先建立安全套接字层 (SSL) 连接,然后才能将数据传输到受保护的 Elasticsearch 集群。Logstash 必须具有已签署 Elasticsearch 集群证书的证书颁发机构 (CA) 的副本。当一个新的 Elasticsearch 集群在*没有*专用证书的情况下启动时,它会在启动时生成自己的默认自签名证书颁发机构。有关更多信息,请参阅在启用安全性的情况下启动 Elastic Stack

Elasticsearch Service 使用由标准公共受信任证书颁发机构签署的证书,因此无需设置 cacert。

与 Elastic Cloud 无服务器的安全连接

无服务器上的 Elasticsearch 简化了 Logstash 和 Elasticsearch 之间的安全通信。

Logstash Elasticsearch 输出插件配置为使用 cloud_idapi_key,以在无服务器上的 Logstash 和 Elasticsearch 之间建立安全通信。无需额外的 SSL 配置步骤。

配置示例

  • output {elasticsearch { cloud_id => "<cloud id>" api_key => "<api key>" } }

有关更多详细信息,请查看使用 API 密钥授予访问权限

与托管 Elasticsearch Service 的安全连接

我们在 Elastic Cloud 上托管的 Elasticsearch Service 简化了 Logstash 和 Elasticsearch 之间的安全通信。当您将 Logstash Elasticsearch 输出插件配置为使用 cloud_id 以及 cloud_auth 选项api_key 选项时,无需额外的 SSL 配置步骤。我们托管的 Elasticsearch Service 在 AWS、GCP 和 Azure 上可用,您可以免费试用

配置示例

  • output {elasticsearch { cloud_id => "<cloud id>" cloud_auth => "<cloud auth>" } }
  • output {elasticsearch { cloud_id => "<cloud id>" api_key => "<api key>" } }

有关更多详细信息,请查看使用 API 密钥授予访问权限将数据发送到 Elastic Cloud(托管 Elasticsearch Service)

与本地 Elasticsearch 集群的安全通信编辑

如果您在自己的硬件上运行 Elasticsearch 并使用 Elasticsearch 集群的默认自签名证书,则需要完成更多步骤才能在 Logstash 和 Elasticsearch 之间建立安全通信。

您需要

  • 从 Elasticsearch 复制自签名 CA 证书并将其保存到 Logstash。
  • 将 elasticsearch-output 插件配置为使用该证书。

如果您的集群使用的是公共受信任证书,则无需执行这些步骤。

复制并保存证书编辑

默认情况下,本地 Elasticsearch 集群会在启动时生成自签名 CA 并创建自己的 SSL 证书。因此,Logstash 需要拥有 Elasticsearch 集群的自签名 CA 副本,以便 Logstash 验证 Elasticsearch 提供的证书。

从 Elasticsearch config/certs 目录复制自签名 CA 证书

将其保存到 Logstash 可以访问的位置,例如 Logstash 实例上的 config/certs

配置 elasticsearch 输出编辑

使用 elasticsearch 输出cacert 选项指向证书的位置。

示例

output {
  elasticsearch {
    hosts => ["https://...] 
    cacert => '/etc/logstash/config/certs/ca.crt' 
  }
}

请注意,hosts url 必须以 https 开头

Elasticsearch 证书的 Logstash 副本的路径

有关与 Elasticsearch 建立安全通信的更多信息,请参阅默认启用安全性

将 Logstash 配置为使用基本身份验证编辑

Logstash 需要能够管理索引模板、创建索引以及在其创建的索引中写入和删除文档。

为 Logstash 设置身份验证凭据

  1. 使用 Kibana 中的管理 > 角色用户界面或 role API 创建 logstash_writer 角色。对于集群权限,添加 manage_index_templatesmonitor。对于索引权限,添加 writecreatecreate_index

    如果您计划使用索引生命周期管理,请为集群添加 manage_ilm,为索引添加 managemanage_ilm

    POST _security/role/logstash_writer
    {
      "cluster": ["manage_index_templates", "monitor", "manage_ilm"], 
      "indices": [
        {
          "names": [ "logstash-*" ], 
          "privileges": ["write","create","create_index","manage","manage_ilm"]  
        }
      ]
    }

    如果启用了索引生命周期管理,则集群需要 manage_ilm 权限。

    如果您使用自定义 Logstash 索引模式,请指定您的自定义模式,而不是默认的 logstash-* 模式。

    如果启用了索引生命周期管理,则该角色需要 managemanage_ilm 权限才能加载索引生命周期策略、创建滚动别名以及创建和管理滚动索引。

  2. 创建一个 logstash_internal 用户并为其分配 logstash_writer 角色。您可以从 Kibana 中的管理 > 用户用户界面或通过 user API 创建用户

    POST _security/user/logstash_internal
    {
      "password" : "x-pack-test-password",
      "roles" : [ "logstash_writer"],
      "full_name" : "Internal Logstash User"
    }
  3. 将 Logstash 配置为以您刚创建的 logstash_internal 用户身份进行身份验证。您需要在 Logstash .conf 文件中为每个 Elasticsearch 插件分别配置凭据。例如

    input {
      elasticsearch {
        ...
        user => logstash_internal
        password => x-pack-test-password
      }
    }
    filter {
      elasticsearch {
        ...
        user => logstash_internal
        password => x-pack-test-password
      }
    }
    output {
      elasticsearch {
        ...
        user => logstash_internal
        password => x-pack-test-password
      }
    }

授予对 Logstash 索引的访问权限编辑

要访问 Logstash 创建的索引,用户需要 readview_index_metadata 权限

  1. 创建一个对 Logstash 索引具有 readview_index_metadata 权限的 logstash_reader 角色。您可以从 Kibana 中的管理 > 角色用户界面或通过 role API 创建角色

    POST _security/role/logstash_reader
    {
      "cluster": ["manage_logstash_pipelines"]
    }
  2. 为您的 Logstash 用户分配 logstash_reader 角色。如果 Logstash 用户将使用集中式管道管理,还要分配 logstash_admin 角色。您可以从 Kibana 中的管理 > 用户用户界面或通过 user API 创建和管理用户

    POST _security/user/logstash_user
    {
      "password" : "x-pack-test-password",
      "roles" : [ "logstash_reader", "logstash_admin"], 
      "full_name" : "Kibana User for Logstash"
    }

    logstash_admin 是一个内置角色,提供对用于管理配置的系统索引的访问权限。

将 Logstash 配置为使用 TLS/SSL 加密编辑

如果在本地 Elasticsearch 集群上启用了 TLS 加密,则需要在 Logstash .conf 文件中配置 sslcacert 选项

output {
  elasticsearch {
    ...
    ssl => true
    cacert => '/path/to/cert.pem' 
  }
}

包含证书颁发机构证书的本地 .pem 文件的路径。

托管 Elasticsearch Service 简化了安全性。托管 Elasticsearch Service on Elastic Cloud 不需要此配置步骤。我们托管的 Elasticsearch Service 在 AWS、GCP 和 Azure 上可用,您可以免费试用

将 Elasticsearch 输出配置为使用 PKI 身份验证编辑

elasticsearch 输出支持 PKI 身份验证。要使用 X.509 客户端证书进行身份验证,您需要在 Logstash .conf 文件中配置 keystorekeystore_password 选项

output {
  elasticsearch {
    ...
    keystore => /path/to/keystore.jks
    keystore_password => realpassword
    truststore =>  /path/to/truststore.jks 
    truststore_password =>  realpassword
  }
}

如果您使用单独的信任库,则还需要提供信任库路径和密码。

为 Logstash 监控配置凭据编辑

如果您想使用 Elastic Stack 监控功能监控 Logstash 实例,并将监控数据存储在安全的 Elasticsearch 集群中,则必须使用具有适当权限的用户的用户名和密码配置 Logstash。

安全功能预先配置了一个为此目的而设的logstash_system 内置用户。此用户具有监控功能所需的最低权限,并且*不应*用于任何其他目的 - 它*并非*用于 Logstash 管道。

默认情况下,logstash_system 用户没有密码。在您设置密码之前,该用户将无法启用。请参阅设置内置用户密码

然后在 logstash.yml 配置文件中配置用户名和密码

xpack.monitoring.elasticsearch.username: logstash_system
xpack.monitoring.elasticsearch.password: t0p.s3cr3t

如果您最初安装了旧版本的 X-Pack 然后进行了升级,则出于安全原因,logstash_system 用户可能默认设置为disabled。您可以通过 user API 启用该用户

PUT _security/user/logstash_system/_enable

为集中式管道管理配置凭据编辑

如果您打算使用 Logstash 集中式管道管理,则需要配置 Logstash 用于管理配置的用户名和密码。

您可以在 logstash.yml 配置文件中配置用户名和密码

xpack.management.elasticsearch.username: logstash_admin_user 
xpack.management.elasticsearch.password: t0p.s3cr3t

您在此处指定的 用户必须具有内置的 logstash_admin 角色以及您之前创建的 logstash_writer 角色。

使用 API 密钥授予访问权限编辑

您可以使用 API 密钥来授予对 Elasticsearch 资源的访问权限,而不是使用用户名和密码。您可以将 API 密钥设置为在特定时间过期,并且可以显式地使其失效。任何具有 manage_api_keymanage_own_api_key 集群权限的用户都可以创建 API 密钥。

创建 API 密钥的技巧

  • API 密钥与其创建所在的集群绑定。如果您要将输出发送到不同的集群,请确保创建正确类型的 API 密钥。
  • Logstash 可以将收集的数据和监控信息发送到 Elasticsearch。如果您要将两者都发送到同一个集群,则可以使用同一个 API 密钥。对于不同的集群,您需要为每个集群使用一个 API 密钥。
  • 单个集群可以共享用于摄取和监控目的的密钥。
  • 生产集群和监控集群需要单独的密钥。

出于安全原因,我们建议为每个 Logstash 实例使用唯一的 API 密钥。您可以根据需要为每个用户创建任意数量的 API 密钥。

创建 API 密钥编辑

您可以使用创建 API 密钥 APIKibana UI 创建 API 密钥。本节将指导您使用创建 API 密钥 API 创建 API 密钥。两种方法所需的权限相同。

以下示例展示了如何使用Elasticsearch 输出插件 创建用于发布到 Elasticsearch 的 API 密钥。

POST /_security/api_key
{
  "name": "logstash_host001", 
  "role_descriptors": {
    "logstash_writer": { 
      "cluster": ["monitor", "manage_ilm", "read_ilm"],
      "index": [
        {
          "names": ["logstash-*"],
          "privileges": ["view_index_metadata", "create_doc"]
        }
      ]
    }
  }
}

API 密钥的名称

授予的权限

返回值应类似于以下内容

{
  "id":"TiNAGG4BaaMdaH1tRfuU", 
  "name":"logstash_host001",
  "api_key":"KnR6yE41RrSowb0kQ0HWoA" 
}

此 API 密钥的唯一 ID

生成的 API 密钥

创建用于发布的 API 密钥编辑

您很幸运!我们在创建 API 密钥部分中使用的示例使用Elasticsearch 输出插件 创建了一个用于发布到 Elasticsearch 的 API 密钥。

以下示例展示了如何在您的Elasticsearch 输出插件 配置中使用 API 密钥。

output {
  elasticsearch {
    api_key => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA" 
  }
}

格式为 id:api_key(由创建 API 密钥 返回)

创建用于读取的 API 密钥编辑

创建用于从 Elasticsearch 读取数据的 API 密钥与创建用于发布的 API 密钥类似,如前所述。您可以使用创建 API 密钥部分中的示例,并授予适当的权限。

以下示例展示了如何在您的Elasticsearch 输入插件 配置中使用 API 密钥。

input {
  elasticsearch {
    "api_key" => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA" 
  }
}

格式为 id:api_key(由创建 API 密钥 返回)

创建用于过滤的 API 密钥编辑

创建用于处理来自 Elasticsearch 的数据的 API 密钥与创建用于发布的 API 密钥类似,如前所述。您可以使用创建 API 密钥部分中的示例,并授予适当的权限。

以下示例展示了如何在您的Elasticsearch 过滤器插件 配置中使用 API 密钥。

filter {
  elasticsearch {
    api_key => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA" 
  }
}

格式为 id:api_key(由创建 API 密钥 返回)

创建用于监控的 API 密钥编辑

要创建用于将监控数据发送到 Elasticsearch 的 API 密钥,请使用创建 API 密钥 API。例如

POST /_security/api_key
{
  "name": "logstash_host001", 
  "role_descriptors": {
    "logstash_monitoring": { 
      "cluster": ["monitor"],
      "index": [
        {
          "names": [".monitoring-ls-*"],
          "privileges": ["create_index", "create"]
        }
      ]
    }
  }
}

API 密钥的名称

授予的权限

返回值应类似于以下内容

{
  "id":"TiNAGG4BaaMdaH1tRfuU", 
  "name":"logstash_host001",
  "api_key":"KnR6yE41RrSowb0kQ0HWoA" 
}

此 API 密钥的唯一 ID

生成的 API 密钥

现在,您可以在您的 logstash.yml 配置文件中使用此 API 密钥

xpack.monitoring.elasticsearch.api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA 

格式为 id:api_key(由创建 API 密钥 返回)

创建用于集中管理的 API 密钥编辑

要创建用于集中管理的 API 密钥,请使用创建 API 密钥 API。例如

POST /_security/api_key
{
  "name": "logstash_host001", 
  "role_descriptors": {
    "logstash_monitoring": { 
      "cluster": ["monitor"],
      "index": ["read"]
    }
  }
}

API 密钥的名称

授予的权限

返回值应类似于以下内容

{
  "id":"TiNAGG4BaaMdaH1tRfuU", 
  "name":"logstash_host001",
  "api_key":"KnR6yE41RrSowb0kQ0HWoA" 
}

此 API 密钥的唯一 ID

生成的 API 密钥

现在,您可以在您的 logstash.yml 配置文件中使用此 API 密钥

xpack.management.elasticsearch.api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA 

格式为 id:api_key(由创建 API 密钥 返回)

了解有关 API 密钥的更多信息编辑

有关更多信息,请参阅 Elasticsearch API 密钥文档

有关通过 Kibana 管理 API 密钥的信息,请参阅API 密钥