保护您与 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 Serverless 的安全性

Elasticsearch Serverless 简化了 Logstash 和 Elasticsearch 之间安全可靠的通信。

配置Logstash Elasticsearch 输出插件以使用cloud_idapi_key来建立 Logstash 和 Elasticsearch Serverless 之间安全可靠的通信。无需额外的 SSL 配置步骤。

配置示例

  • output {elasticsearch { cloud_id => "<云 ID>" api_key => "<API 密钥>" } }

有关更多详细信息,请查看使用 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 => "<云 ID>" cloud_auth => "<云身份验证>" } }
  • output {elasticsearch { cloud_id => "<云 ID>" api_key => "<API 密钥>" } }

有关更多详细信息,请查看使用 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 开头

Logstash 复制的 Elasticsearch 证书的路径

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

配置 Logstash 以使用基本身份验证

编辑

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

为 Logstash 设置身份验证凭据

  1. 在 Kibana 中使用管理 > 角色 UI 或使用 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 中的管理 > 用户 UI 或通过 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_reader 角色,该角色对 Logstash 索引具有 readview_index_metadata 特权。您可以通过 Kibana 中的管理 > 角色 UI 或通过 role API 创建角色

    POST _security/role/logstash_reader
    {
      "cluster": ["manage_logstash_pipelines"]
    }
  2. 为您的 Logstash 用户分配 logstash_reader 角色。如果 Logstash 用户将使用集中式管道管理,还需要分配 logstash_admin 角色。您可以通过 Kibana 中的管理 > 用户 UI 或通过 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 简化了安全性。对于 Elastic Cloud 上的托管 Elasticsearch Service,此配置步骤不是必需的。我们的托管 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 密钥部分中使用的示例创建了一个 API 密钥,用于使用Elasticsearch 输出插件发布到 Elasticsearch。

这是一个在您的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 密钥