阅读 130

Elasticsearch:跨集群搜索 Cross-cluster search(CCS)及安全

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 安装于两个电脑上: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

————————————————

版权声明:本文为CSDN博主「Elastic 中国社区官方博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/UbuntuTouch/article/details/116569527


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐