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

相关推荐