加载中

保护您的 Elasticsearch 连接

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

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

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

Elasticsearch 集群默认启用安全(从 8.0 版本开始)。您必须在 Logstash 配置的 Elasticsearch 输出部分启用 TLS/SSL,才能允许 Logstash 与 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 => "" api_key => "" }}

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

托管 Elasticsearch 服务的安全性

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

配置示例

  • output {elasticsearch { cloud_id => "" cloud_auth => "" }}
  • output {elasticsearch { cloud_id => "" api_key => "" }}

有关更多详细信息,请参阅使用 API 密钥授予访问权限将数据发送到 Elastic Cloud(托管 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 outputssl_certificate_authorities 选项指向证书的位置。

示例

output {
  elasticsearch {
    hosts => ["https://...]
    ssl_certificate_authorities => ['/etc/logstash/config/certs/ca.crt']
  }
}
  1. 请注意,hosts URL 必须以 https 开头。
  2. Logstash 副本的 Elasticsearch 证书路径

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

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

设置 Logstash 的身份验证凭据

  1. 在 Kibana 中使用 **Management > Roles** 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"]
        }
      ]
    }
    
    1. 如果启用了索引生命周期管理,则集群需要 manage_ilm 权限。
    2. 如果您使用自定义 Logstash 索引模式,请指定您的自定义模式而不是默认的 logstash-* 模式。
    3. 如果启用了索引生命周期管理,则该角色需要 managemanage_ilm 权限来加载索引生命周期策略、创建滚动别名以及创建和管理滚动索引。
  2. 创建一个 logstash_internal 用户,并将其分配 logstash_writer 角色。您可以从 Kibana 的 **Management > Users** 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 创建的索引,用户需要 readview_index_metadata 权限。

  1. 创建一个 logstash_reader 角色,该角色对 Logstash 索引具有 readview_index_metadata 权限。您可以从 Kibana 的 **Management > Roles** UI 或通过 role API 创建角色。

    POST _security/role/logstash_reader
    {
      "cluster": ["manage_logstash_pipelines"],
      "indices": [
        {
          "names": [ "logstash-*" ],
          "privileges": ["read","view_index_metadata"]
        }
      ]
    }
    
  2. 将您的 Logstash 用户分配 logstash_reader 角色。如果 Logstash 用户将使用集中式管道管理,也请分配 logstash_system 角色。您可以从 Kibana 的 **Management > Users** UI 或通过 user API 创建和管理用户。

    POST _security/user/logstash_user
    {
      "password" : "x-pack-test-password",
      "roles" : [ "logstash_reader", "logstash_system"],
      "full_name" : "Kibana User for Logstash"
    }
    
    1. logstash_system 是一个内置角色,它提供检查 Elasticsearch 集群支持的功能可用性所需的权限。

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

output {
  elasticsearch {
    ...
    ssl_enabled => true
    ssl_certificate_authorities => '/path/to/cert.pem'
  }
}
  1. 包含证书颁发机构证书的本地 .pem 文件的路径。
注意

托管 Elasticsearch 服务简化了安全性。对于 Elastic Cloud 上的托管 Elasticsearch 服务,此配置步骤不是必需的。我们的托管 Elasticsearch 服务在 AWS、GCP 和 Azure 上均可用,您可以在 https://cloud.elastic.co/registration 免费试用。

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

output {
  elasticsearch {
    ...
    ssl_keystore_path => /path/to/keystore.jks
    ssl_keystore_password => realpassword
    ssl_truststore_path =>  /path/to/truststore.jks
    ssl_truststore_password =>  realpassword
  }
}
  1. 如果您使用单独的信任库,则还需要信任库路径和密码。

如果您想使用 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
  1. 此处指定的用户的内置角色必须是 logstash_admin,同时也要有您之前创建的 logstash_writer 角色。

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

创建 API 密钥的技巧

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

出于安全原因,我们建议为每个 Logstash 实例使用唯一的 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"]
        }
      ]
    }
  }
}
  1. API 密钥的名称
  2. 授予的权限

返回值应与此类似

{
  "id":"TiNAGG4BaaMdaH1tRfuU",
  "name":"logstash_host001",
  "api_key":"KnR6yE41RrSowb0kQ0HWoA"
}
  1. 此 API 密钥的唯一 ID
  2. 生成的 API 密钥

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

以下是您在Elasticsearch 输出插件配置中使用该 API 密钥的示例。

output {
  elasticsearch {
    api_key => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA"
  }
}
  1. 格式为 id:api_key(由 Create API key 返回)

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

以下是您在Elasticsearch 输入插件配置中使用该 API 密钥的示例。

input {
  elasticsearch {
    "api_key" => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA"
  }
}
  1. 格式为 id:api_key(由创建 API 密钥返回)

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

以下是您在Elasticsearch 过滤器插件配置中使用该 API 密钥的示例。

filter {
  elasticsearch {
    api_key => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA"
  }
}
  1. 格式为 id:api_key(由 Create API key 返回)

要创建用于将监控数据发送到 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"]
        }
      ]
    }
  }
}
  1. API 密钥的名称
  2. 授予的权限

返回值应与此类似

{
  "id":"TiNAGG4BaaMdaH1tRfuU",
  "name":"logstash_host001",
  "api_key":"KnR6yE41RrSowb0kQ0HWoA"
}
  1. 此 API 密钥的唯一 ID
  2. 生成的 API 密钥

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

xpack.monitoring.elasticsearch.api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA
  1. 格式为 id:api_key(由 Create API key 返回)

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

 POST /_security/api_key {
  "name": "logstash_host001",
  "role_descriptors": {
    "logstash_monitoring": {
      "cluster": ["monitor", "manage_logstash_pipelines"]
    }
  }
}
  1. API 密钥的名称
  2. 授予的权限

返回值应与此类似

{
  "id":"TiNAGG4BaaMdaH1tRfuU",
  "name":"logstash_host001",
  "api_key":"KnR6yE41RrSowb0kQ0HWoA"
}
  1. 此 API 密钥的唯一 ID
  2. 生成的 API 密钥

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

xpack.management.elasticsearch.api_key: TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA
  1. 格式为 id:api_key(由 Create API key 返回)

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

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

© . This site is unofficial and not affiliated with Elasticsearch BV.