Elasticsearch:跨集群搜索 Cross-cluster search(CCS)及安全
Posted 中国社区官方博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:跨集群搜索 Cross-cluster search(CCS)及安全相关的知识,希望对你有一定的参考价值。
在我之前的文章 “跨集群搜索 Cross-cluster search (CCS)”,我已经详细描述了如何进行跨集群搜索。在那篇文章里,我的两个集群都是运行于本地的电脑,并且分布于不同的两个目录中。两个集群没有任何的安全设置。这个在实际的使用中是不现实的。前几天有个开发者在评论里问我:如果两个集群都设置有安全,那么该如何进行配置呢?怎么才能使得这两个集群之间进行跨集群搜索呢?在今天的文章中,我来详述如何实现这个。这里的配置也将适合跨集群复制(CCR)。
跨集群搜索启用跨多个集群的联合搜索。 将跨集群搜索与受保护集群一起使用时,所有集群都必须启用 Elasticsearch 安全功能。必须允许本地群集(用于启动跨群集搜索的群集)连接到远程群集,这意味着用于签署本地群集的 SSL/TLS 密钥的 CA 必须受到远程群集的信任。
用户身份验证是在本地群集上执行的,并且用户和用户的角色(role)将传递到远程群集。 远程集群会根据其本地角色定义检查用户的角色,以确定允许用户访问哪些索引。
警告:此功能是在 Elasticsearch v5.3 中作为 Beta 添加的,并在 5.4 和 5.5 中进行了进一步改进。 它要求符合网关要求的节点必须在 v5.5 或更高版本上。
要将跨集群搜索与安全集群一起使用:
- 在每个连接的集群中的每个节点上启用 Elasticsearch 安全功能。有关 xpack.security.enabled 设置的更多信息,请参阅 Elasticsearch 中的安全设置。
- 全局启用加密。要加密通信,必须在每个节点上启用启用 SSL/TLS。
- 在用于执行跨集群搜索的集群(本地集群)和所有远程集群之间启用信任关系。可以通过以下方式完成此操作:
- 使用相同的证书颁发机构为所有连接的群集生成证书,或者
- 从本地群集中将 CA 证书添加为每个远程群集中的受信任 CA(请参阅传输 TLS 设置)。如果你是两个不同证书的集群,你可以在 elasticsearch.yml 中的
xpack.security.transport.ssl.certificate_authorities 添加对方的证书而得到受信。
- 在本地群集上,确保将用户分配给(至少一个)远程群集上存在的一个角色。在远程群集上,使用该角色定义用户可以访问的索引。 (请参阅用户授权)。
- 如配置远程群集中所述,配置本地群集以连接到远程群集。
在上面的描述中,是不是觉得很复杂啊?在接下来的文章中,我将详述如何进行练习。在今天的练习中,我将使用如下的配置:
如上所示,我把 Elasticsearch 安装于两个电脑上:Ubuntu OS 及 Mac OS。我们可以按照文章 “Security:如何安装 Elastic SIEM 和 EDR” 来对两个电脑启动安全配置。在安装的过程中,我们一定要注意的是使用同样的 CA 证书(尽管针对不同的集群,我们可以使用不同的证书)。在生成 Elasticsearch 及 Kibana 证书时,我们需要修改 instances.yml 文件:
instances:
- name: "elasticsearch"
ip:
- "192.168.0.4"
- "192.168.0.3"
- name: "kibana"
ip:
- "192.168.0.4"
- "192.168.0.3"
...
我们需要把两个电脑的 IP 地址都添加进去。这样,我们生产的 Elasticsearch 及 Kibana 证书将同时使用于两台电脑:
从上面,我们可以看出来两台电脑的安全配置已经完成。在我们的练习中,我将把 Mac OS 电脑视为本地集群,而把 Ubuntu 电脑视为远程集群。
在远程集群上进行配置
我们打开 Ubuntu 电脑的 Kibana。我们在 Dev Tools 中输入如下的一个命令:
PUT twitter/_doc/1
{
"content": "This is so nice"
}
它将生成一个叫做 twitter 的索引。我们接着为它创建一个叫做 twitter* 的索引模式:
接着我们来为这个索引创建一个叫做 twitter-role 的角色:
为了方便,我把 Privileges 设置为 all。你至少需要设置 read_cross_cluster 这个 Privileges。设置完毕后,我们其实可以通过如下的命令在 console 获得:
GET _security/role/twitter_role
上面的命令显示:
{
"twitter_role" : {
"cluster" : [ ],
"indices" : [
{
"names" : [
"twitter*"
],
"privileges" : [
"all"
],
"field_security" : {
"grant" : [
"*"
],
"except" : [ ]
},
"allow_restricted_indices" : false
}
],
"applications" : [ ],
"run_as" : [ ],
"metadata" : { },
"transient_metadata" : {
"enabled" : true
}
}
}
当然,我们也可以直接使用如下的命令来进行设置(如果你不喜欢使用 UI 来创建这个 twitter_role):
POST _security/role/twitter_role
{
"cluster": [],
"indices": [
{
"names": [
"twitter*"
],
"privileges": [
"read",
"read_cross_cluster"
]
}
]
}
在上面,我们设置我们只需要的 Privileges:read 及 read_cross_cluster。
到此为止,我们就对远程集群配置完毕。
在本地集群中进行配置
我们切换到 MacOS 中集群。打开本地集群的 Kibana。首先,我们需要为配置一个连接:
在上面 ubuntu:9300 指的是 ubuntu 电脑的 IP 地址的 9300 端口地址。你可以在电脑的 /etc/hosts 进行配置:
/etc/hosts
192.168.0.4 ubuntu
点击上面的 Save 按钮:
上面显示连接状态是成功的。当然你也可以直接使用如下的命令来实现:
PUT _cluster/settings
{
"persistent": {
"cluster.remote.cluster_two.seeds": [ "192.168.0.4:9300" ]
}
}
请注意上面的 IP 地址 192.168.0.4 是 Ubuntu 电脑的 IP 地址。
接下来,我们可以创建一个叫做 twitter_role 的角色:
在上面,我们没有定义任何的 Privilieges。我们可以通过如下的命令来进行查看:
GET _security/role/twitter_role
{
"twitter_role" : {
"cluster" : [
"manage_security"
],
"indices" : [ ],
"applications" : [ ],
"run_as" : [ ],
"metadata" : { },
"transient_metadata" : {
"enabled" : true
}
}
}
当然,我们甚至可以使用如下的命令来进行配置:
POST /_security/role/twitter_role
{
"cluster": [
"manage_security"
]
}
这里的 manage_security 其实不是必须的。我设置它的目的是想在我接下来创建的用户 liuxg 中能进行一些关于 security 的管理。我们可以接下来创建一个叫做 liuxg 的用户,并把 twitter_role 赋予给它:
上面我们创建一个叫做 liuxg 的用户。我们实际上也可以使用如下的命令来创建这个用户:
POST /_security/user/liuxg
{
"password" : "password",
"roles" : [ "twitter_role", "kibana_admin" ],
"full_name" : "liuxg",
"email" : "liuxg@elastic.co",
"enabled": true
}
我们接着可以使用这个用户来登录 Kibana:
我们接下来打入如下的命令来对远程电脑中的 twitter 索引来进行搜索:
GET ubuntu:twitter/_search
请注意上面命令中的 ubuntu 是我们之前创建的 remote cluster 的连接的名称。从上面的结果中我们可以看到远程的索引 twitter 的搜索结果。
参考:
【1】 https://www.elastic.co/guide/en/elasticsearch/reference/current/cross-cluster-configuring.html
以上是关于Elasticsearch:跨集群搜索 Cross-cluster search(CCS)及安全的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:跨集群搜索 Cross-cluster search(CCS)及安全
Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信