Elasticsearch安全性:配置TLS/SSL和PKI身份验证

Elastic Stack 6.8/7.1或更高版本用户的重要注意事项:弹性堆栈的默认分布现在包含了可以永久免费启用的安全特性。这包括TLS加密、用户身份验证和基于角色的访问控制。退房Elasticsearch安全入门执行细节

当为使用生产许可证运行的群集启用Elasticsearch安全性时,传输通信必须使用TLS/SSL,并且必须正确设置。此外,一旦启用了安全性,所有到Elasticsearch集群的通信都必须经过身份验证,包括来自Kibana和/或应用服务器的通信。

Kibana和/或应用服务器可以向Elasticsearch集群进行身份验证的最简单方法是在配置文件或源代码中嵌入用户名和密码。然而,在许多组织中,禁止在这些位置存储用户名和密码。在这种情况下,一种选择是使用公钥基础设施(PKI)(客户端证书)用于对Elasticsearch群集进行身份验证。

首先,将安全性与TLS/SSL和PKI一起配置可能会让人望而生畏,因此本博客将逐步指导如何:启用安全性;配置TLS/SSL;为内置用户设置密码;使用PKI进行身份验证;最后,如何使用PKI向Elasticsearch集群验证Kibana。

启用安全性

以下步骤在Elastic Stack 6.5版上进行了测试。安全功能可以是在默认发行版中启用免费从版本6.8/7.1开始。
为了启用安全性,有必要使用黄金或铂金认购,或通过启用的试用许可证Kibana或美国石油学会. 例如,以下命令将通过API启用试用许可证:

curl -X POST "localhost:9200/_xpack/license/start_trial?acknowledge=true"

在哪里?localhost必须替换为Elasticsearch集群中节点的名称。

启用许可证后,可以启用安全性。我们必须修改elasticsearch.yml在群集中每个节点上使用以下行的文件:

xpack .安全 .启用 :是的
对于在中运行的群集生产方式对于生产许可证,一旦启用了安全性,还必须启用传输TLS/SSL。另一方面,如果我们使用试用许可证运行,那么传输TLS/SSL就不是必须的。

如果使用生产许可证运行,并且在启用传输TLS/SSL之前尝试在启用安全性的情况下启动群集,则会看到以下错误消息:

Transport SSL must be enabled for setups with production licenses. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]

SSL/SSL配置将在以下章节中介绍。

TLS/SSL加密

Elasticsearch有两个级别的通信:传输通信和http通信。传输协议用于Elasticsearch节点之间的内部通信,http协议用于从客户端到Elasticsearch集群的通信。以下段落将讨论这些通信的安全问题。

传输TLS/SSL加密

传输协议用于Elasticsearch集群内节点之间的通信。因为Elasticsearch群集中的每个节点都是群集中其他节点的客户端和服务器,所以所有传输证书都必须同时是客户端证书和服务器证书。如果TLS/SSL证书没有Extended Key Usage定义了,那么它们已经是实际的客户机和服务器证书。如果运输证书扩展密钥使用第节,对于在公司环境中使用的CA签名证书,通常是这种情况,那么它们必须显式地同时启用这两个证书clientAuth和serverAuth .

Elasticsearch附带了一个名为elasticsearch证书可用于生成可用于内部通信的自签名的群集内部加密证书。

以下命令可用于生成可用于传输通信的证书,如上的本页所述在Elasticsearch中加密通信 :

bin/elasticsearch-certutil ca
ENTER ENTER
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
ENTER ENTER ENTER

一旦执行了上述命令,我们将拥有可用于加密通信的TLS/SSL证书。

新创建的证书应该复制到名为certs位于配置目录。然后将在elasticsearch.yml文件如下:

xpack .安全 .运输 .ssl .启用 :是的xpack .安全 .运输 .ssl .验证模式 :certificatexpack .安全 .运输 .ssl .密钥库 .路径 :certs /有弹力的 -证书 .p12xpack .安全 .运输 .ssl .truststore .路径 :certs /有弹力的 -证书 .第12页
现在重新启动Elasticsearch集群中的所有节点,以使上述更改生效。

定义内置用户密码

我们现在必须定义内置用户的密码,如中所述设置内置用户密码. 如果我们使用Gold或Platinum许可证运行,那么在集群启动之前,必须执行前面为传输通信启用TLS/SSL的步骤。此外,在为http通信启用TLS/SSL之前,应该完成定义内置用户的密码,因为设置密码的命令将通过不安全的http与集群通信。

可以使用以下命令设置内置用户密码:

bin/elasticsearch-setup-passwords interactive

一定要记住我们为每个内置用户分配的密码。我们将利用elastic超级用户以帮助配置本博客稍后的PKI身份验证。

Http TLS/SSL加密

对于http通信,Elasticsearch节点将仅充当服务器,因此可以使用服务器证书-即http TLS/SSL证书不需要启用客户端身份验证。

在许多情况下,http通信的证书将由公司CA签名。值得注意的是,用于加密http通信的证书可以完全独立于用于传输通信的证书。

为了减少此博客中的步骤数,我们将使用与传输通信相同的证书进行http通信。这些在elasticsearch.yml文件如下:

xpack .安全 .http协议 .ssl .启用 :是的xpack .安全 .http协议 .ssl .密钥库 .路径 :certs /有弹力的 -证书 .p12xpack .安全 .http协议 .ssl .truststore .路径 :certs /有弹力的 -证书 .p12xpack .安全 .http协议 .ssl .身份验证客户端 :可选择的
启用PKI身份验证
如中所述配置PKI领域,必须将以下内容添加到elasticsearch.yml允许PKI身份验证的文件。

xpack .安全 .authc .领域 .公钥基础设施1 .类型 :公钥基础设施
对elasticsearch.yml的合并更改
一旦遵循了上述步骤,我们应该在elasticsearch.yml配置:

xpack .安全 .启用 :是的xpack .安全 .运输 .ssl .启用 :是的xpack .安全 .运输 .ssl .验证模式 :certificatexpack .安全 .运输 .ssl .密钥库 .路径 :certs /有弹力的 -证书 .p12xpack .安全 .运输 .ssl .truststore .路径 :certs /有弹力的 -证书 .p12xpack .安全 .http协议 .ssl .启用 :是的xpack .安全 .http协议 .ssl .密钥库 .路径 :certs /有弹力的 -证书 .p12xpack .安全 .http协议 .ssl .truststore .路径 :certs /有弹力的 -证书 .p12xpack .安全 .http协议 .ssl .身份验证客户端 :optionalxpack .安全 .authc .领域 .公钥基础设施1 .类型 :公钥基础设施
阅读更少
一旦对我们的elasticsearch.yml文件,我们必须重新启动集群中的所有Elasticsearch节点,才能使更改生效。

创建客户端证书

将用于PKI身份验证的证书必须由与用于加密http通信的证书相同的CA签名。通常,这些都是由一个组织内的官方CA签署的。但是,因为我们已经使用了一个自签名的CA,所以我们还使用之前保存为的同一个自签名CA对http客户端证书进行签名elastic-stack-ca.p12. 我们可以为客户端身份验证创建证书,如下所示:

箱子 /弹性搜索 -certutil cert --ca\配置 /certs /有弹力的 -堆栈 -加利福尼亚州 .第12页\ -名称"CN=something,OU=Consulting Team,DC=mydomain,DC=com"ENTERclient .p12 ENTERENTER
上面将创建一个名为client.p12,其中包含对我们的Elasticsearch群集进行PKI身份验证所需的所有信息。但是,为了使用此证书,将其分为私钥、公共证书和CA证书是很有帮助的。这可以通过以下命令完成:

私钥
openssl pkcs12 -in client.p12 -nocerts -nodes > client.key
公共证书
openssl pkcs12 -in client.p12 -clcerts -nokeys  > client.cer
CA证书
openssl pkcs12 -in client.p12 -cacerts -nokeys -chain > client-ca.cer

应生成三个文件:

client.key-私钥
client.cer-公共证书
client-ca.cer-签署公共证书的CA
创建一个名为certs在基班纳配置目录,并将所有客户端证书移到那里。

配置Kibana以验证elasticsearch
既然我们已经在Elasticsearch集群上启用了安全性,那么到集群的通信必须经过身份验证。因此,如果我们计划使用Kibana与集群交互,那么我们必须启用安全性并配置Kibana作为kibanahttps上的用户。由于我们尚未完全设置从Kibana到Elasticsearch集群的PKI身份验证,身份验证最初必须使用kibana用户和密码。这可以通过kibana.yml文件:

elasticsearch.url:"https://localhost:9200"
#ensure https not http
xpack.security.enabled:true
elasticsearch.username:"kibana"
elasticsearch.password:"your kibana password goes here"
elasticsearch.ssl.certificateAuthorities:config/certs/client-ca
cerelasticsearch.ssl.verificationMode:certificate

确保我们改变localhost到我们的一个Elasticsearch节点的名称,并且证书在配置/证书Kibana文件夹中的目录。

注意kibana用户就像一个服务帐户,它在后台工作,以向Elasticsearch集群验证Kibana应用程序。我们通常不会以kibana用户

重新启动Kibana,以便它作为kibana用户。我们现在应该能够通过Kibana用户界面作为有弹力的内置超级用户

PKI身份验证
我们可以使用三个新的客户端证书文件来测试对集群的PKI身份验证curl. 打开新终端并光盘to Kibana’sconfig/certs目录和使用卷曲打电话给验证API如下所示

curl https://localhost:9200/_xpack/security/_authenticate?pretty
–key client.key --cert client.cer --cacert client-ca.cer -k -v
一定要更换localhost在我们的集群中不要使用https的名称。还要注意-k选项是必需的,因为我们没有使用指定的主机名创建证书,因此必须关闭主机名验证。

上述命令的响应应类似于以下内容:

{
  "username" : "something",
  "roles" : [ ],
  "full_name" : null,
  "email" : null,
  "metadata" : {
    "pki_dn" : "CN=something, OU=Consulting Team, DC=mydomain, DC=com"
  },
  "enabled" : true
}

注意到roles虽然我们目前没有授权执行任何ElasticValue搜索,但这意味着我们没有被授权执行的任何操作。允许身份验证,因为我们发送到集群的客户端证书是由与Elasticsearch节点使用的http TLS/SSL证书相同的CA签名的。现在我们已经通过身份验证,我们需要授权这个用户来执行某些操作。

这个pki_dn将用于配置将从该API返回的角色的值。

打开Kibana用户界面,如果尚未打开,请以elastic用户。作为有弹力的用户具有超级用户权限,此用户可以为证书分配角色。从Kibana中的Dev Tools执行以下命令,确保先前返回的pki_dn值被复制到公称通径字段如下:

PUT _xpack/security/role_mapping/kibana_certificate_authorization
{
  "roles" : [ "kibana_system" ],
  "rules" : { "field" : { "dn" : "CN=something, OU=Consulting Team, DC=mydomain, DC=com" } },
  "enabled": true
}

既然我们已经指定kibana_system角色,请使用另一个对authenticate API的调用验证此设置是否正确:

curl https://localhost:9200/_xpack/security/_authenticate?pretty \--key client.key--cert client.cer--cacert client-ca.cer-k-v

我们应该看到下面的响应,这表明我们现在已经为这个证书分配了“kibana_system”角色。

{
  "username" : "something",
  "roles" : [
    "kibana_system"
  ],
  "full_name" : null,
  "email" : null,
  "metadata" : {
    "pki_dn" : "CN=something, OU=Consulting Team, DC=mydomain, DC=com"
  },
  "enabled" : true
}

使用PKI向Elasticsearch集群认证Kibana
现在我们已经测试了客户端证书,并为证书分配了“kibana_system”角色,我们可以使用此证书而不是用户名和密码来验证kibana到Elasticsearch的身份。

从我们的kibana.yml文件:

弹性搜索 .用户名 :"kibana"弹性搜索 .密码 :“XXXXXX”
确保将所有相关证书复印至Kibanaconfig/certs目录,并将以下行添加到kibana.yml文件:

elasticsearch.url: "https://localhost:9200" #ensure https 
xpack.security.enabled: true
elasticsearch.ssl.certificate: config/certs/client.cer
elasticsearch.ssl.key: config/certs/client.key
elasticsearch.ssl.certificateAuthorities: config/certs/client-ca.cer
elasticsearch.ssl.verificationMode: certificate

我们现在可以重新启动Kibana,它应该可以通过Elasticsearch集群的身份验证,而不需要嵌入用户名和密码!

结论
在这篇博文中,我演示了如何启用安全性;配置TLS/SSL;为内置用户设置密码;使用PKI进行身份验证;最后,如何使用PKI向Elasticsearch集群验证Kibana。

如果您对使用Elasticsearch进行PKI身份验证或任何其他Elasticsearch相关主题有任何疑问,请查看我们的讨论论坛提供有价值的讨论、见解和信息。

你可能感兴趣的:(elasticsearch)