保护您的 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 不是必需的。
Elasticsearch Serverless 简化了 Logstash 和 Elasticsearch 之间安全可靠的通信。
将Logstash Elasticsearch 输出插件配置为使用cloud_id和api_key来建立 Logstash 和 Elasticsearch Serverless 之间安全可靠的通信。无需额外的 SSL 配置步骤。
配置示例
output {elasticsearch { cloud_id => "" api_key => " " }}
有关更多详细信息,请参阅使用 API 密钥授予访问权限。
我们在 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 output的ssl_certificate_authorities 选项指向证书的位置。
示例
output {
elasticsearch {
hosts => ["https://...]
ssl_certificate_authorities => ['/etc/logstash/config/certs/ca.crt']
}
}
- 请注意,
hostsURL 必须以https开头。 - Logstash 副本的 Elasticsearch 证书路径
有关建立与 Elasticsearch 安全通信的更多信息,请参阅安全默认开启。
Logstash 需要能够管理索引模板、创建索引以及在其创建的索引中写入和删除文档。
设置 Logstash 的身份验证凭据
在 Kibana 中使用 **Management > Roles** UI 或
roleAPI 创建一个logstash_writer角色。对于**集群**权限,添加manage_index_templates和monitor。对于**索引**权限,添加write、create和create_index。如果您计划使用索引生命周期管理,请添加
manage_ilm(集群)和manage、manage_ilm(索引)。POST _security/role/logstash_writer { "cluster": ["manage_index_templates", "monitor", "manage_ilm"], "indices": [ { "names": [ "logstash-*" ], "privileges": ["write","create","create_index","manage","manage_ilm"] } ] }创建一个
logstash_internal用户,并将其分配logstash_writer角色。您可以从 Kibana 的 **Management > Users** UI 或通过userAPI 创建用户。POST _security/user/logstash_internal { "password" : "x-pack-test-password", "roles" : [ "logstash_writer"], "full_name" : "Internal Logstash User" }配置 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 创建的索引,用户需要 read 和 view_index_metadata 权限。
创建一个
logstash_reader角色,该角色对 Logstash 索引具有read和view_index_metadata权限。您可以从 Kibana 的 **Management > Roles** UI 或通过roleAPI 创建角色。POST _security/role/logstash_reader { "cluster": ["manage_logstash_pipelines"], "indices": [ { "names": [ "logstash-*" ], "privileges": ["read","view_index_metadata"] } ] }将您的 Logstash 用户分配
logstash_reader角色。如果 Logstash 用户将使用集中式管道管理,也请分配logstash_system角色。您可以从 Kibana 的 **Management > Users** UI 或通过userAPI 创建和管理用户。POST _security/user/logstash_user { "password" : "x-pack-test-password", "roles" : [ "logstash_reader", "logstash_system"], "full_name" : "Kibana User for Logstash" }logstash_system是一个内置角色,它提供检查 Elasticsearch 集群支持的功能可用性所需的权限。
如果在本地 Elasticsearch 集群上启用了 TLS 加密,则需要在 Logstash .conf 文件中配置 ssl 和 cacert 选项。
output {
elasticsearch {
...
ssl_enabled => true
ssl_certificate_authorities => '/path/to/cert.pem'
}
}
- 包含证书颁发机构证书的本地
.pem文件的路径。
托管 Elasticsearch 服务简化了安全性。对于 Elastic Cloud 上的托管 Elasticsearch 服务,此配置步骤不是必需的。我们的托管 Elasticsearch 服务在 AWS、GCP 和 Azure 上均可用,您可以在 https://cloud.elastic.co/registration 免费试用。
elasticsearch 输出支持 PKI 身份验证。要使用 X.509 客户端证书进行身份验证,请在 Logstash .conf 文件中配置 keystore 和 keystore_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
}
}
- 如果您使用单独的信任库,则还需要信任库路径和密码。
如果您想使用 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 密钥授予对 Elasticsearch 资源的访问权限,而不是使用用户名和密码。您可以设置 API 密钥在特定时间过期,并且可以明确地使其失效。任何拥有 manage_api_key 或 manage_own_api_key 集群权限的用户都可以创建 API 密钥。
创建 API 密钥的技巧
- API 密钥与其创建的集群相关联。如果您要将输出发送到不同的集群,请务必创建正确的 API 密钥类型。
- Logstash 可以将收集的数据和监控信息都发送到 Elasticsearch。如果您将两者发送到同一个集群,则可以使用相同的 API 密钥。对于不同的集群,您需要每个集群一个 API 密钥。
- 单个集群可以共享一个密钥用于数据摄取和监控目的。
- 生产集群和监控集群需要单独的密钥。
出于安全原因,我们建议为每个 Logstash 实例使用唯一的 API 密钥。您可以为每个用户创建任意数量的 API 密钥。
您可以使用创建 API 密钥 API或Kibana 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 密钥部分使用的示例为使用Elasticsearch 输出插件发布到 Elasticsearch 创建了一个 API 密钥。
以下是您在Elasticsearch 输出插件配置中使用该 API 密钥的示例。
output {
elasticsearch {
api_key => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA"
}
}
- 格式为
id:api_key(由 Create API key 返回)
创建用于从 Elasticsearch 读取数据的 API 密钥与前面描述的用于发布的 API 密钥的创建类似。您可以使用创建 API 密钥部分中的示例,授予适当的权限。
以下是您在Elasticsearch 输入插件配置中使用该 API 密钥的示例。
input {
elasticsearch {
"api_key" => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA"
}
}
- 格式为
id:api_key(由创建 API 密钥返回)
创建用于处理 Elasticsearch 数据的 API 密钥与前面描述的用于发布的 API 密钥的创建类似。您可以使用创建 API 密钥部分中的示例,授予适当的权限。
以下是您在Elasticsearch 过滤器插件配置中使用该 API 密钥的示例。
filter {
elasticsearch {
api_key => "TiNAGG4BaaMdaH1tRfuU:KnR6yE41RrSowb0kQ0HWoA"
}
}
- 格式为
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"]
}
]
}
}
}
- 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(由 Create API key 返回)
要创建用于中央管理的 API 密钥,请使用创建 API 密钥 API。例如:
POST /_security/api_key {
"name": "logstash_host001",
"role_descriptors": {
"logstash_monitoring": {
"cluster": ["monitor", "manage_logstash_pipelines"]
}
}
}
- 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(由 Create API key 返回)
有关更多信息,请参阅 Elasticsearch API 密钥文档。
有关通过 Kibana 管理 API 密钥的信息,请参阅API 密钥。