访问自管理环境中的集群
ECE 自管理
本节介绍如何配置部署以远程连接到自管理集群。
在开始之前,请考虑您希望用于验证集群之间远程连接的安全模型,并按照相应的步骤操作。
- API 密钥
- 对于基于 Elastic Stack 8.14 或更高版本的部署,您可以使用 API 密钥来验证和授权与远程集群的跨集群操作。此模型为本地和远程部署的管理员提供细粒度的访问控制。
- TLS 证书(在 Elastic Stack 9.0.0 中已弃用)
- 此模型使用相互 TLS 身份验证进行跨集群操作。用户身份验证在本地集群上执行,用户的角色名称将传递到远程集群。本地部署上的超级用户可以完全读取远程部署,因此仅适用于位于同一安全域中的部署。
API 密钥身份验证使本地集群能够通过跨集群 API 密钥与远程集群进行身份验证。 API 密钥需要由远程集群的管理员创建。本地集群配置为在每次向远程集群发出请求时提供此 API 密钥。远程集群验证 API 密钥并根据 API 密钥的权限授予访问权限。
来自本地集群的所有跨集群请求都受到 API 密钥权限的约束,而与与请求关联的本地用户无关。例如,如果 API 密钥仅允许对远程集群上的 my-index
进行读取访问,即使本地集群的超级用户也会受到此约束的限制。此机制使远程集群的管理员能够完全控制谁可以通过跨集群搜索和/或跨集群复制访问哪些数据。远程集群的管理员可以确信,除了明确分配给 API 密钥的权限之外,不可能进行任何访问。
在本地集群端,并非每个本地用户都需要访问 API 密钥允许的每一部分数据。本地集群的管理员可以进一步配置对本地用户的其他权限约束,以便每个用户只能访问必要的远程数据。请注意,只能进一步减少 API 密钥允许的单个本地用户的权限。无法增加权限以超出 API 密钥允许的范围。
如果您遇到任何问题,请参阅问题排查。
- 本地和远程部署必须在 Elastic Stack 8.14 或更高版本上。
- 在您将用作远程部署的部署上,使用Elasticsearch API或Kibana来创建跨集群 API 密钥。将其配置为具有对您要用于跨集群搜索或跨集群复制的索引的访问权限。
- 将编码密钥(响应中的
encoded
)复制到安全位置。您将在下一步中需要它。
先前创建的 API 密钥将由本地部署使用,以便使用相应的权限集向远程部署进行身份验证。为此,您需要将 API 密钥添加到本地部署的密钥库中。
要遵循的步骤取决于远程环境的 Elasticsearch HTTPS 服务器、代理或负载平衡基础设施的证书颁发机构 (CA) 是公共的还是私有的。
CA 是公开的
在部署页面上,选择您的部署。
按名称、ID 缩小列表范围,或从其他几个过滤器中进行选择。要进一步定义列表,请组合使用过滤器。
从部署菜单中,选择安全性。
找到远程连接并选择添加 API 密钥。
添加设置
- 对于设置名称,输入您选择的别名。稍后您将使用此别名连接到远程集群。它必须是小写,并且仅包含字母、数字、破折号和下划线。
- 对于密钥,粘贴编码的跨集群 API 密钥。
单击添加以将 API 密钥保存到密钥库。
重新启动本地部署以使用其新设置重新加载密钥库。为此,请转到部署的主页(以您的部署名称命名),找到操作菜单,然后选择重新启动 Elasticsearch。
注意如果本地部署在 8.14 或更高版本上运行,则您不再需要执行此步骤,因为密钥库会自动重新加载新的 API 密钥。
如果您以后需要使用不同的权限更新远程连接,您可以按照更新依赖于跨集群 API 密钥的远程集群连接的访问级别中的详细信息替换 API 密钥。
CA 是私有的
在部署页面上,选择您的部署。
按名称、ID 缩小列表范围,或从其他几个过滤器中进行选择。要进一步定义列表,请组合使用过滤器。
访问部署的安全性页面。
选择远程连接 > 添加受信任环境,然后选择自管理。然后单击下一步。
选择 API 密钥 作为身份验证机制,然后单击 下一步。
添加 API 密钥
填写所有字段。
- 对于设置名称,输入您选择的别名。稍后您将使用此别名连接到远程集群。它必须是小写,并且仅包含字母、数字、破折号和下划线。
- 对于密钥,粘贴编码的跨集群 API 密钥。
单击添加以将 API 密钥保存到密钥库。
为您要添加的每个 API 密钥重复这些步骤。例如,如果您想将远程环境的多个集群用于 CCR 或 CCS。
添加远程自管理环境的 CA 证书。
为受信任的环境提供名称。该名称将显示在部署的安全性页面的信任摘要中。
选择创建信任以完成配置。
重新启动本地部署以使用其新设置重新加载密钥库。为此,请转到部署的主页(以您的部署名称命名),找到操作菜单,然后选择重新启动 Elasticsearch。
注意如果本地部署在 8.14 或更高版本上运行,则您不再需要执行此步骤,因为密钥库会自动重新加载新的 API 密钥。
如果您以后需要使用不同的权限更新远程连接,您可以按照更新依赖于跨集群 API 密钥的远程集群连接的访问级别中的详细信息替换 API 密钥。
可以配置部署以信任任何环境中的所有或特定部署
从安全性菜单中,选择远程连接 > 添加受信任环境,然后选择自管理,然后单击下一步。
选择证书作为身份验证机制,然后单击下一步。
上传自管理环境的证书颁发机构的公共证书(用于签署所有集群证书的证书)。证书需要采用 PEM 格式,并且不应包含私钥。如果您只有 p12 格式的密钥,则可以像这样创建必要的文件:
openssl pkcs12 -in elastic-stack-ca.p12 -out newfile.crt.pem -clcerts -nokeys
选择要信任的集群。这里有两种选择,具体取决于自管理集群中节点提供的证书的主题名称
遵循 Elastic Cloud 模式。在 Elastic Cloud 中,所有 Elasticsearch 节点的证书都遵循以下约定:
CN = {{node_id}}.node.{{cluster_id}}.cluster.{{scope_id}}
。如果您在自管理环境中遵循相同的约定,则选择此选项,您将能够选择要信任的所有或特定集群。如果您的集群不遵循上述节点证书主题名称的约定,您仍然可以指定应由该部署信任的每个节点的节点名称。(请记住,遵循此约定将简化此集群的管理,否则每次自管理集群的拓扑发生变化时,以及信任限制文件都需要更新此配置。因此,建议迁移您的集群证书以遵循先前的约定)。
注意在没有指定
otherName
值的集群中,信任管理将无法正常工作,就像开箱即用的Elasticsearch 安装中的默认情况一样。要让 Elasticsearch certutil 生成具有otherName
属性的新证书,请使用带有cn
属性的文件输入,如下例所示。
为受信任的环境提供名称。该名称将显示在部署的安全性页面的信任摘要中。
选择创建信任以完成配置。
配置自管理集群以信任此部署,以便两个部署都配置为相互信任
- 下载用于签署您的部署节点证书的证书颁发机构(可以在您的部署的安全性页面中找到)
- 信任此 CA,可以使用 设置
xpack.security.transport.ssl.certificate_authorities
在elasticsearch.yml
中进行配置,或者 将其添加到信任存储。
使用 Elasticsearch certutil 生成带有
otherName
属性的证书。创建一个名为instances.yaml
的文件,其中包含本地集群中所有节点的详细信息,如下所示。dns
和ip
设置是可选的,但cn
对于下一步中使用trust_restrictions
路径设置是必需的。接下来,运行./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 -in instances.yaml
以一次性为所有节点创建新证书。然后,您可以将生成的文件复制到每个节点。instances: - name: "node1" dns: ["node1.mydomain.com"] ip: ["192.168.1.1"] cn: ["node1.node.1234567abcd.cluster.myscope.account"] - name: "node2" dns: ["node2.mydomain.com"] ip: ["192.168.1.2"] cn: ["node2.node.1234567abcd.cluster.myscope.account"]
限制受信任集群,仅允许您的自管理集群应信任的集群。
- 您的 Elastic Cloud Enterprise 环境中的所有集群都由同一证书颁发机构签名。 因此,添加此 CA 将使自管理集群信任您的 ECE 环境中的所有集群。 应使用
elasticsearch.yml
中的xpack.security.transport.ssl.trust_restrictions.path
设置对此进行限制,该设置指向一个文件,该文件根据其otherName
属性限制要信任的证书。 - 例如,以下文件将信任
trust.subject_name: - *.node.aaaabbbbaaaabbbb.cluster.1053523734.account - *.node.xxxxyyyyxxxxyyyy.cluster.1053523734.account - *.node.*.cluster.83988631.account - node*.example.com
- 在 ECE 环境中,具有集群 ID
aaaabbbbaaaabbbb
和xxxxyyyyxxxxyyyy
的两个特定集群,环境 ID 为1053523734
- 来自环境 ID 为
83988631
的 ECE 环境的任何集群 - 来自其自身集群的节点(其证书遵循不同的约定:
CN = node1.example.com
、CN = node2.example.com
和CN = node3.example.com
)
- 您的 Elastic Cloud Enterprise 环境中的所有集群都由同一证书颁发机构签名。 因此,添加此 CA 将使自管理集群信任您的 ECE 环境中的所有集群。 应使用
使用 certutil 的文件输入模式为整个集群生成新的节点证书。
使用 API
您可以使用 Elasticsearch payload 的适当信任设置来更新部署。
为了信任一个集群,该集群的节点呈现具有以下主题名称的证书:“CN = node1.example.com”、“CN = node2.example.com”和“CN = node3.example.com”,在自管理环境中,您可以像这样使用额外的直接信任关系来更新信任设置
{
"trust":{
"accounts":[
{
"account_id":"ec38dd0aa45f4a69909ca5c81c27138a",
"trust_all":true
}
],
"direct": [
{
"type" : "generic",
"name" : "My Self-managed environment",
"additional_node_names" : ["node1.example.com", "node2.example.com", "node3.example.com",],
"certificates" : [
{
"pem" : "-----BEGIN CERTIFICATE-----\nMIIDTzCCA...H0=\n-----END CERTIFICATE-----"
}
],
"trust_all":false
}
]
}
}
现在,您可以远程连接到受信任的集群。
在本地集群上,使用 Kibana 或 Elasticsearch API 添加远程集群。
打开 Kibana 主菜单,然后选择 Stack Management > Data > Remote Clusters > Add a remote cluster。
启用 Manually enter proxy address and server name。
填写以下字段
Name: 此集群别名是一个唯一的标识符,表示与远程集群的连接,用于区分本地索引和远程索引。
Proxy address: 此值可在您要用作远程的 Elastic Cloud Enterprise 部署的 Security 页面上找到。
提示如果您使用 API 密钥作为安全模型,请将端口更改为
9443
。Server name: 此值可在您要用作远程的 Elastic Cloud Enterprise 部署的 Security 页面上找到。
注意如果您在建立连接时遇到问题,并且远程集群是具有专用证书的 Elastic Cloud Enterprise 环境的一部分,请确保代理地址和服务器名称与证书信息匹配。 有关更多信息,请参阅 在 Elastic Cloud Enterprise 中管理端点。
单击 Next。
单击 Add remote cluster(您已在上一步中建立了信任)。
远程集群的此配置使用 代理模式,并且它要求分配器可以通过 http 与代理通信。
要将部署配置为远程集群,请使用 集群更新设置 API。 配置以下字段
mode
:proxy
proxy_address
: 此值可在您要用作远程的 Elastic Cloud Enterprise 部署的 Security 页面上找到。 此外,使用 API,可以使用分号连接字段metadata.endpoint
和端口9300
,从 Elasticsearch 资源信息中获取此值。提示如果您使用 API 密钥作为安全模型,请将端口更改为
9443
。server_name
: 此值可在您要用作远程的 Elastic Cloud Enterprise 部署的 Security 页面上找到。 此外,使用 API,可以从 Elasticsearch 资源信息字段metadata.endpoint
获取此值。
这是调用 _cluster/settings
的 API 示例
PUT /_cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"alias-for-my-remote-cluster": {
"mode":"proxy",
"proxy_address": "a542184a7a7d45b88b83f95392f450ab.192.168.44.10.ip.es.io:9300",
"server_name": "a542184a7a7d45b88b83f95392f450ab.192.168.44.10.ip.es.io"
}
}
}
}
}
仅当您使用 TLS 证书作为跨集群安全模型并且两个集群都属于同一 ECE 环境时,本节才适用。对于其他情况,应使用 Elasticsearch API 代替。
curl -k -H 'Content-Type: application/json' -X PUT -H "Authorization: ApiKey $ECE_API_KEY" https://COORDINATOR_HOST:12443/api/v1/deployments/$DEPLOYMENT_ID/elasticsearch/$REF_ID/remote-clusters -d '
{
"resources" : [
{
"deployment_id": "$DEPLOYMENT_ID_REMOTE",
"elasticsearch_ref_id": "$REF_ID_REMOTE",
"alias": "alias-your-remote",
"skip_unavailable" : true
}
]
}'
DEPLOYMENT_ID_REMOTE
- 您的远程部署的 ID,如 Cloud UI 中所示或通过 API 获取。
REF_ID_REMOTE
- 远程部署中 Elasticsearch 资源的唯一 ID(您可以通过 API 获取这些值)。
使用 Elastic Cloud Enterprise RESTful API 时,请注意以下事项
- 集群别名必须仅包含字母、数字、短划线 (-) 或下划线 (_)。
- 要了解有关跳过断开连接的集群的信息,请参阅 Elasticsearch 文档。
- 当已为部署配置了远程集群时,
PUT
请求会将现有配置替换为传递的新配置。 传递一个空资源数组将删除所有远程集群。
以下 API 请求检索远程集群配置
curl -k -X GET -H "Authorization: ApiKey $ECE_API_KEY" https://COORDINATOR_HOST:12443/api/v1/deployments/$DEPLOYMENT_ID/elasticsearch/$REF_ID/remote-clusters
响应仅包括来自同一 ECE 环境的远程集群。 为了获得完整的远程集群列表,请直接使用 Kibana 或 Elasticsearch API。