Elasticsearch:使用 API 密钥验证添加远程集群

news2024/11/24 10:53:44

API 密钥身份验证使本地集群能够通过跨集群 API 密钥(cross-cluster API key)向远程集群进行身份验证。API 密钥需要由远程集群的管理员创建。本地集群配置为在向远程集群发出每个请求时提供此 API 密钥。远程集群将根据 API 密钥的权限验证 API 密钥并授予访问权限。

来自本地集群的所有跨集群请求都受 API 密钥权限的约束,无论与请求关联的本地用户是谁。例如,如果 API 密钥仅允许对远程集群上的 my-index 进行读取访问,那么即使是本地集群的超级用户也会受到此约束的限制。此机制使远程集群的管理员能够完全控制谁可以通过跨集群搜索和/或跨集群复制访问哪些数据。远程集群的管理员可以确信,除了明确分配给 API 密钥的内容之外,不可能进行任何访问。

在本地集群方面,并非每个本地用户都需要访问 API 密钥允许的每一部分数据。本地集群的管理员可以进一步配置对本地用户的额外权限限制,以便每个用户只能访问必要的远程数据。请注意,只能进一步减少 API 密钥允许的单个本地用户的权限。无法增加超出 API 密钥允许的权限。

在此模型中,跨集群操作使用专用服务器端口(远程集群接口)进行集群间通信。远程集群必须启用此端口才能连接本地集群。为此端口配置传输层安全性 (TLS) 以最大限度地提高安全性(如与远程集群建立信任中所述)。

本地集群必须在远程集群接口上信任远程集群。这意味着本地集群信任签署远程集群接口使用的服务器证书的远程集群证书颁发机构 (CA)。建立连接时,参与跨集群通信的所有本地集群节点都会根据 TLS 信任配置验证来自另一侧节点的证书。

注意:为了使得两个不同的集群之间能够互相信任,除了本文章使用 API 秘钥的机制之外,我们还可以使用 TLS certificate authentication。我们可以详细地阅读文章 “Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信”。

使用 API 密钥验证添加远程集群

前提条件

  • 需要在两个集群的每个节点上启用 Elasticsearch 安全功能。默认情况下启用安全性。如果禁用,请在 elasticsearch.yml 中将 xpack.security.enabled 设置为 true。请参阅常规安全设置。
  • 本地和远程集群的节点必须为 8.10 或更高版本。
  • 本地和远程集群必须具有适当的许可证。有关更多信息,请参阅 https://www.elastic.co/cn/subscriptions。

安装

Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请按照如下的文章来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

针对我们今天的展示,我们讲使用最新的 Elastic Stack 14.3 来进行展示。我们的架构如下:

如上所示,我们在 macOS 安装一个远程集群,而在 Ubuntu 22.04 上安装一个本地的集群。通过配置后,我们可以在 Local 集群里访问 Remote 集群。为此,我们需要为两个集群做不同的配置。

在 Remote 集群上

1) 在远程集群的每个节点上启用远程集群服务器。在 elasticsearch.yml 中:

  • 将 remote_cluster_server.enabled 设置为 true。
  • 配置远程集群服务器流量的绑定和发布地址,例如使用 remote_cluster.host。如果不配置地址,远程集群流量可能会绑定到本地接口,而其他机器上运行的远程集群则无法连接。
  • (可选)使用 remote_cluster.port 配置远程服务器端口(默认为 9443)。

2) 接下来,生成证书颁发机构 (CA) 和服务器证书/密钥对。在远程集群的某个节点上,从已安装 Elasticsearch 的目录中:

  1. 如果你还没有 CA,请创建一个 CA:
./bin/elasticsearch-certutil ca --pem --out=cross-cluster-ca.zip --pass CA_PASSWORD

将 CA_PASSWORD 替换为你要使用的 CA 密码。如果你不部署到生产环境,则可以删除 --pass 选项及其参数。

针对我们的情况:

./bin/elasticsearch-certutil ca --pem --out=cross-cluster-ca.zip --pass 123456

上面的命令将上传一个叫做 cross-cluster-ca.zip 的文件:

$ pwd
/Users/liuxg/elastic1/elasticsearch-8.14.3
$ ls
LICENSE.txt          bin                  cross-cluster-ca.zip lib                  plugins
NOTICE.txt           ca                   data                 logs
README.asciidoc      config               jdk.app              modules
  • 解压生成的 cross-cluster-ca.zip 文件。此压缩文件包含以下内容:
unzip cross-cluster-ca.zip
$ pwd
/Users/liuxg/elastic1/elasticsearch-8.14.3
$ ls
LICENSE.txt          bin                  data                 logs
NOTICE.txt           config               jdk.app              modules
README.asciidoc      cross-cluster-ca.zip lib                  plugins
$ unzip cross-cluster-ca.zip 
Archive:  cross-cluster-ca.zip
   creating: ca/
  inflating: ca/ca.crt               
  inflating: ca/ca.key               
  • 为远程集群中的节点生成证书和私钥对:
    ./bin/elasticsearch-certutil cert --out=cross-cluster.p12 --pass=CERT_PASSWORD --ca-cert=ca/ca.crt --ca-key=ca/ca.key --ca-pass=CA_PASSWORD --dns=example.com --ip=127.0.0.1
    • 将 CA_PASSWORD 替换为上一步中的 CA 密码。
    • 将 CERT_PASSWORD 替换为要用于生成的私钥的密码。
    • 使用 --dns 选项指定证书的相关 DNS 名称。你可以为多个 DNS 多次指定它。
    • 使用 --ip 选项指定证书的相关 IP 地址。你可以为多个 IP 地址多次指定它。

针对我们的情况:


./bin/elasticsearch-certutil cert --out=cross-cluster.p12 --pass=123456 --ca-cert=ca/ca.crt --ca-key=ca/ca.key --ca-pass=123456 --dns=mac --ip=192.168.0.3

上面的命令将生成一个叫做 cross-cluster.p12 的文件。

$ pwd
/Users/liuxg/elastic1/elasticsearch-8.14.3
$ ls
LICENSE.txt          bin                  cross-cluster-ca.zip jdk.app              modules
NOTICE.txt           ca                   cross-cluster.p12    lib                  plugins
README.asciidoc      config               data                 logs
  • 如果远程集群有多个节点,你可以:
    • 为所有节点创建单个通配符证书;
    • 或者,手动或使用 silent mode 批量为每个节点创建单独的证书。

3) 在远程集群的每个节点上:

  • 将上一步中的 cross-cluster.p12 文件复制到 config 目录。如果你没有创建通配符证书,请确保复制正确的特定于节点的 p12 文件。
$ pwd
/Users/liuxg/elastic1/elasticsearch-8.14.3
$ cp cross-cluster.p12 config/
$ pwd
/Users/liuxg/elastic1/elasticsearch-8.14.3
$ ls config/
certs                             elasticsearch.yml                 role_mapping.yml
cross-cluster.p12                 jvm.options                       roles.yml
elasticsearch-plugins.example.yml jvm.options.d                     users
elasticsearch.keystore            log4j2.properties                 users_roles
  • 在 elasticsearch.yml 中添加以下配置:
xpack.security.remote_cluster_server.ssl.enabled: true
xpack.security.remote_cluster_server.ssl.keystore.path: cross-cluster.p12

最终的 elasticsearch.yml 配置文件如下:

  • 将 SSL 密钥库密码添加到 Elasticsearch 密钥库:
./bin/elasticsearch-keystore add xpack.security.remote_cluster_server.ssl.keystore.secure_password

出现提示时,输入上一步中的 CERT_PASSWORD。针对我们的设计,我们输入 123456 作为密码。我们可以使用如下的命令来查看密码:

$ pwd
/Users/liuxg/elastic1/elasticsearch-8.14.3
$ ./bin/elasticsearch-keystore show xpack.security.remote_cluster_server.ssl.keystore.secure_password
123456

4) 重新启动 remote 集群

启动完毕后,我们可以使用如下的命令来查看 remote server 的运行:

sudo lsof -i -P | grep LISTEN | grep 9443
$ sudo lsof -i -P | grep LISTEN | grep 9443
Password:
java      33531          liuxg  473u  IPv6 0x356b6aaee02cbca9      0t0    TCP mac:9443 (LISTEN)

从上面,我们可以看出来 9443 端口正被使用。

5)在远程集群上,生成跨集群 API 密钥,该密钥提供对要用于跨集群搜索或跨集群复制的索引的访问权限。你可以使用创建跨集群 API 密钥 API 或 Kibana。

在 Kibana 上,我们可以这么操作:

这样我们就创建了一个 cross cluster key。我们也可以直接使用 API 来进行生成:

POST /_security/cross_cluster/api_key
{
  "name": "my-cross-cluster-api-key",
  "expiration": "5d",   
  "access": {
    "search": [  
      {
        "names": ["twitter*"]
      }
    ],
    "replication": [  
      {
        "names": ["archive*"]
      }
    ]
  },
  "metadata": {
    "description": "phase one",
    "environment": {
       "level": 1,
       "trusted": true,
       "tags": ["dev", "staging"]
    }
  }
}

在上面,我们生成一个秘钥。这个密钥只可以提供针对 twitter* 索引的搜索,而且它的有效期只有5天的时间。我们可以针对 archive* 的文档进行跨级群复制。

6)将编码的密钥(在响应中编码)复制到安全位置。稍后你将需要它来连接到远程集群。

在 Local 集群上

1)在本地群集的每个节点上:

  • 将之前在远程集群上生成的 ca.crt 文件复制到 config 目录中,重命名文件 remote-cluster-ca.crt。
  • 在 elasticsearch.yml 中添加以下配置:
xpack.security.remote_cluster_client.ssl.enabled: true
xpack.security.remote_cluster_client.ssl.certificate_authorities: [ "remote-cluster-ca.crt" ]
  • 将之前在远程集群上创建的跨集群 API 密钥添加到密钥库:
./bin/elasticsearch-keystore add cluster.remote.ALIAS.credentials

将 ALIAS 替换为你稍后将用于创建远程集群条目的相同名称。出现提示时,输入之前在远程集群上创建的编码跨集群 API 密钥。特别值得指出的是这里的 ALIAS 其实就是在下面创建 remote 连接时所填入的名称。针对我们的情况:

./bin/elasticsearch-keystore add cluster.remote.mac.credentials

这里的 mac 就是我们稍后会填入的连接名称。

2)重新启动本地集群以加载对密钥库和设置的更改。

注意:如果你仅配置跨集群 API 密钥,则可以调用 Nodes reload secure settings API,而不必重新启动集群。配置 elasticsearch.yml 中的 remote_cluster_client 设置仍需要重新启动。

我们可以通过如下的 API 来确定我们的节点具有 remote cluster client node。详细的节点角色可以参考 “Elasticsearch:Node roles 介绍 - 7.9 之后版本”。

GET /_cat/nodes

上面的命令返回:

127.0.0.1 24 98 13 0.32 0.45 0.54 cdfhilmrstw * ubuntu2204

我们可以看到上面的 r,它代表 remote cluster client node。

连接到 remote 集群

注意:你必须具有 manage 集群权限才能连接远程集群。

本地集群使用远程集群接口与远程集群建立通信。本地集群中的协调节点与远程集群中的特定节点建立长寿命 TCP 连接。Elasticsearch 要求这些连接保持打开状态,即使连接长时间处于空闲状态。

要从 Kibana 中的 Stack Management 添加远程集群:

上面显示我们的远程连接是成功的。

另外,我们也可以使用 API 来完成这个动作。以下请求添加一个别名为 mac 的远程集群。此集群别名 mac 是一个唯一标识符,代表与远程集群的连接,用于区分本地索引和远程索引。

PUT /_cluster/settings
{
  "persistent" : {
    "cluster" : {
      "remote" : {
        "mac" : {    
          "seeds" : [
            "192.168.0.3:9443" 
          ]
        }
      }
    }
  }
}

我们可以通过如下的 API 来进行检查结果:

GET /_remote/info

检查 CCS

我们在远程集群,也就是 macOS 的集群上创建一个索引 twitter:

PUT twitter/_doc/1
{
  "content": "This is Xiaoguo from Elastic"
}

我们在 Local 集群里进行如下的搜索:

GET mac:twitter/_search

很显然我们的搜索是成功的。

静态配置远程集群

如果你在 elasticsearch.yml 中指定设置,则只有具有这些设置的节点才能连接到远程集群并处理远程集群请求。

注意:使用cluster update settings API 指定的远程集群设置优先于你在 elasticsearch.yml 中为各个节点指定的设置。

在以下示例中,cluster_one、cluster_two 和 cluster_three 是任意集群别名,表示与每个集群的连接。这些名称随后用于区分本地索引和远程索引。

cluster:
    remote:
        cluster_one:
            seeds: 127.0.0.1:9443
        cluster_two:
            mode: sniff
            seeds: 127.0.0.1:9444
            transport.compress: true    # 1  
            skip_unavailable: true      # 2  
        cluster_three:
            mode: proxy
            proxy_address: 127.0.0.1:9445 # 3
  • 已明确启用对 cluster_two 的请求的压缩。
  • 对于 cluster_two,断开连接的远程集群是可选的。
  • 用于连接到 cluster_three 的代理端点的地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1972735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM—CMS收集器

参考资料:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明 CMS收集器(Concurrent Mark Sweep)是一种以获取最短回收停顿时间为目标的收集器。低并发收集、低停顿。 CMS收集器是基于标记—清除算法实…

数据库相关概念大全!

一、什么是数据库? 1.数据库 数据库是一种更易于访问、更高效且更有条理的长期存储和处理信息的方式。 2. 优点,作用 数据库存储数据的规范性和系统性以及其检索数据的便捷性使其成为基于 Web 的应用程序中重要的部分。 数据库几乎可以用于所有应用程…

谷粒商城实战笔记-110~114-全文检索-ElasticSearch-查询

文章目录 一,110-全文检索-ElasticSearch-进阶-两种查询方式二,111-全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all三,112-全文检索-ElasticSearch-进阶-match全文检索四,113-全文检索-ElasticSearch-进阶-match_ph…

HarmonyOS 用List组件实现组合列表项

界面分析: 由于整体UX设计图符合从上至下的布局,所以可以采用Column组件作为外层容器 简介: 最上方的标题可以使用Text组件进行加载渲染中间的Banner图和简介分别可以使用Image组件和Text组件进行加载最后一部分可以看作是一个列表&#xf…

在PAI-DSW中连接Neo4J,并批量创建知识图谱

我在 阿里云DSW实例中安装并运行Neo4J 中提到过,由于PAI-DSW的专有网络配置不能确保百分之百成功,因而很难实现通过本地的浏览器登录在PAI-DSW中启动的Neo4J图数据库。 我当时想出的一个解决办法是使用./cypher-shell语句在命令行登录neo4j,…

工业5G路由器赋能户外组网远程监控及预警

随着物联网、大数据、云计算等技术的快速发展,工业领域对于远程监控、实时预警和数据传输的需求日益增长。特别是在户外复杂环境下,传统的有线网络组网方式面临着布线难度大、成本高、维护困难等问题。 工业5G路由器在户外组网远程监控预警应用基于高速…

Golang 并发控制模型

文章目录 Golang 并发控制模型一、使用 channel 通知实现并发控制1、无缓冲通道2、有缓冲通道 二、使用 sync 包中的 WaitGroup 实现并发控制1、sync.WaitGroup2、sync.Once 三、使用 Context 上下文实现并发控制1、简介2、context 包3、继承 context4、context 例子5、context…

基于springMVC的图书管理系统

进度终于来到了springMVC,下次估计就是springboot了,感觉每次开始新框架,环境都是大问题,项目一共敲四天,环境卡三天。总结一下这次碰到的问题和解决方法吧。 问题和解决方法 1、controller中return无法跳转到界面&a…

【安装】Linux Centos 或 Debian 离线安装指定版本MariaDB

【安装】Linux Centos 或 Debian 离线安装指定版本MariaDB 下载地址 https://mariadb.com/downloads/community/community-server/https://mirrors.aliyun.com/mariadb/yum/https://mariadb.com/downloads/community/community-server/ Download MariaDB Server - MariaDB.or…

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新,其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式,让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…

数据库原理之多表查询——使用Mysql进行内连接和外连接

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:Idea 目录 1.内连接 1.1隐式内连接 1.1.1定义 1.1.2举例 1.1.3优缺点 1.2显式内连接 1.2.1定义 1.2.2举例 1.2.3优缺点 2.外连接 2.1左外连接 2.1.1定义 2.1.2举例 2.…

Creomagic 推出认知通信功能以应对电子战 (EW) 威胁

新时代的软件定义无线电 (SDR) 技术可以在电子战和竞争频谱环境中自主维护可靠的网络。 最近的全球冲突凸显了现代战场上战术通信面临的严峻挑战。随着自主部队的日益普及,战场感知变得比以往任何时候都更加先进,需要大量信息传输和同步。在战场上传输关…

【OpenCV C++20 学习笔记】腐蚀和膨胀

腐蚀和膨胀 形态学原理膨胀腐蚀 代码实现膨胀函数腐蚀函数运行结果 形态学原理 腐蚀和膨胀通常有以下用途: 去除噪音分离或合并图像中的元素找出图片上的强度的极大值区域和极小值区域 以下图作为原始图片: 膨胀 用核 B B B来扫描图像 A A A&#xff…

Python数值计算(12)——线性插值

1. 概述 插值是根据已知的数据序列(可以理解为你坐标中一系列离散的点),找到其中的规律,然后根据找到的这个规律,来对其中尚未有数据记录的点进行数值估计的方法。最简单直观的一种插值方式是线性插值,它是…

MuseTalk - 数字人唇部同步

文章目录 一、关于 MuseTalk概览新闻模型案例待办事项:第三方集成 二、安装构建环境mmlab 软件包下载 ffmpeg-static下载权重 三、快速入门推理使用 bbox_shift 以获得可调整的结果结合 MuseV 和 MuseTalk🆕实时推理实时推理注意事项 四、其它致谢限制引…

Taro学习记录

一、安装taro-cli 二、项目文件 三、项目搭建 1、Eslint配置 在项目生成的 .eslintrc 中进行配置 {"extends": ["taro/react"], //一个配置文件,可以被基础配置中的已启用的规则继承"parser": "babel/eslint-parser…

1688中国站获得工厂档案信息 API

公共参数 名称类型必须描述keyString是免费申请调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…

【动态规划-最大子段和】力扣1191. K 次串联后最大子数组之和

给定一个整数数组 arr 和一个整数 k ,通过重复 k 次来修改数组。 例如,如果 arr [1, 2] , k 3 ,那么修改后的数组将是 [1, 2, 1, 2, 1, 2] 。 返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0&…

Delphi5实现多窗体

效果图 新建窗体 窗体的显现 procedure TForm2.btn2Click(Sender: TObject); beginForm1.Show;Form2.Hide; end;第一个窗体完整代码 注意引用第二个窗体 unit Unit1;interfaceusesSysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,Dialogs, Forms,Form…

《中国数据库前世今生》观影——2000年代/数据库分型及国产数据库开端

引出 《中国数据库前世今生》观影——2000年代/数据库分型及国产数据库开端 第3集:2000年代/数据库分型及国产数据库开端 y2k问题 千年虫,又叫做“计算机2000年问题”“电脑千禧年千年虫问题”或“千年危机”。缩写为“Y2K]”。是指在某些使用了计算机…