mcpField
E
elasticsearch-authn

elasticsearch-authn

github.com/elastic安全6023.0k 次安装今天更新
代码仓库

关于 elasticsearch-authn

为 Elasticsearch 集群认证提供操作指导,涵盖已配置的内置与外部 Realm,并说明 API key 的创建、轮换和失效。适合需要为用户、服务或自动化任务选择认证方式的团队,重点强调凭据安全与部署兼容性。

主要功能

  1. 01支持多种认证 Realm
  2. 02验证当前身份与认证方式
  3. 03创建、查询和失效 API key
  4. 04配置服务账户令牌与证书认证
  5. 05说明部署类型的功能差异
  6. 06通过环境变量保护凭据

适用场景

  1. 01验证集群当前使用的认证 Realm
  2. 02为自动化任务创建受限 API key
  3. 03为服务间通信配置证书认证
  4. 04选择企业身份系统对应的认证方式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/elastic/agent-skills --skill elasticsearch-authn

安装后在 Claude Code 中输入/elasticsearch-authn确认已加载。

附带文件references/api-reference.md

详细介绍

Elasticsearch 身份验证

使用已配置的任何受支持身份验证域向 Elasticsearch 集群进行身份验证。本技能涵盖所有内置域、凭据验证以及 API 密钥的完整生命周期。

有关角色、用户、角色分配和角色映射,请参阅 elasticsearch-authz 技能。

有关详细的 API 端点,请参阅 references/api-reference.md。

部署说明: 并非所有部署类型都支持所有域。有关自托管、ECH 和 Serverless 的详细信息,请参阅 部署兼容性。

关键原则

  • 绝不要在聊天中索要凭据。 不要让用户将密码、API 密钥、令牌或任何机密粘贴到对话中。机密不得出现在对话历史记录中。
  • 始终使用环境变量。 本技能中的所有代码示例都使用环境变量(例如 ELASTICSEARCH_PASSWORD、ELASTICSEARCH_API_KEY)。缺少必需变量时,请指导用户在项目根目录的 .env 文件中设置它,绝不要直接索要变量值。
  • 优先使用 .env,而非终端导出变量。 Agent 可能会在沙盒 shell 会话中运行命令,而该会话不会继承用户终端的环境。工作目录中的 .env 文件在所有执行环境中都可靠。只有在用户明确偏好时,才将 export 作为备用方案。

待完成任务

  • 使用用户名和密码向集群进行身份验证(native 域)
  • 使用 API 密钥(持有者令牌)进行连接
  • 验证当前身份验证用户(_authenticate)
  • 为部署选择合适的身份验证域
  • 创建具有指定权限范围的 API 密钥,用于自动化或服务访问
  • 轮换或使现有 API 密钥失效
  • 为 Elastic Stack 组件设置服务账号令牌
  • 在完成 PKI/TLS 设置后,使用 PKI / 双向 TLS 证书进行身份验证
  • 使用已配置的外部身份提供商(SAML、OIDC、LDAP、AD、Kerberos)进行身份验证
  • 代表其他用户授予 API 密钥

先决条件

项目说明
Elasticsearch URL集群端点(例如 https://localhost:9200 或 Cloud 部署 URL)
凭据视域而定 — 请参阅以下方法
已配置的域身份验证域及其身份后端必须已配置(域链、IdP、LDAP/AD、Kerberos、PKI/TLS)

如果缺少任何必需值,请指导用户将其添加到项目根目录的 .env 文件中。在单独 shell 会话中运行的 Agent 可能无法访问终端导出的变量,因此 .env 文件是可靠的默认方案。绝不要让用户在聊天中粘贴凭据——机密不得出现在对话历史记录中。

身份验证域

Elasticsearch 按已配置的顺序评估各个域(即域链)。第一个能够验证请求的域将处理该请求。内部域由 Elasticsearch 管理;外部域则委托给企业身份系统。

内部域
Native(用户名和密码)

用户存储在专用的 Elasticsearch 索引中。最简单的交互式使用方式。通过 Kibana 或用户管理 API 管理(请参阅 elasticsearch-authz 技能)。

curl -u "${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD}" "${ELASTICSEARCH_URL}/_security/_authenticate"
File

用户定义在每个集群节点上的纯文本文件中(使用 elasticsearch-users CLI)。无论许可证状态如何,此域始终处于启用状态,因此付费域被禁用时可作为灾难恢复的备用方案。仅适用于自托管部署。

curl -u "${FILE_USER}:${FILE_PASSWORD}" "${ELASTICSEARCH_URL}/_security/_authenticate"
外部域
LDAP

使用用户名和密码通过外部 LDAP 目录进行身份验证。仅适用于自管理部署——ECH 和 Serverless 不提供此功能。通常与角色映射结合使用,将 LDAP 组转换为 Elasticsearch 角色。

curl -u "${LDAP_USER}:${LDAP_PASSWORD}" "${ELASTICSEARCH_URL}/_security/_authenticate"

该请求与原生身份验证完全相同——Elasticsearch 会通过领域链将其路由到 LDAP 领域。

Active Directory

通过 Active Directory 域进行身份验证。仅适用于自管理部署——ECH 和 Serverless 不提供此功能。与 LDAP 类似,但使用 AD 专属默认值(用户主体名称、sAMAccountName)。通常与角色映射结合使用,将 AD 组转换为角色。

curl -u "${AD_USER}:${AD_PASSWORD}" "${ELASTICSEARCH_URL}/_security/_authenticate"
PKI(TLS 客户端证书)

使用 TLS 握手期间提交的 X.509 客户端证书进行身份验证。需要 PKI 领域,并在 HTTP 层启用 TLS。在 ECH 上,PKI 支持有限——请检查部署设置。Serverless 不提供此功能。最适合用于 相互 TLS 环境中的服务间通信。

curl --cert "${CLIENT_CERT}" --key "${CLIENT_KEY}" --cacert "${CA_CERT}" \
  "${ELASTICSEARCH_URL}/_security/_authenticate"
SAML

启用 SAML 2.0 Web 浏览器单点登录(SSO),主要用于 Kibana 身份验证。在自管理部署中,通过 elasticsearch.yml 配置。在 ECH 上,通过 Cloud 部署设置界面配置。在 Serverless 上,SAML 在 组织级别处理,无法按项目配置。标准 REST 客户端无法使用此方式——基于浏览器的重定向流程由 Kibana 处理。除了 SAML,还要配置另一个领域(例如 native 或 API keys),以便通过程序访问 API。

OIDC(OpenID Connect)

启用 OpenID Connect 单点登录(SSO),主要用于 Kibana 身份验证。在自管理部署中,通过 elasticsearch.yml 配置。在 ECH 上,通过 Cloud 部署设置界面配置。Serverless 不提供此功能。与 SAML 一样,它依赖浏览器 重定向,不适合直接由 REST 客户端使用。若要在使用 OIDC 的同时通过程序访问,请使用 API keys 或 native 用户。

自定义应用可以通过 POST /_security/oidc/authenticate 将 OIDC 令牌换成 Elasticsearch 访问令牌, 但这需要实现完整的 OIDC 重定向流程。

JWT(JSON Web Token)

接受外部身份提供商签发的 JWT 作为持有者令牌。在自管理部署中,通过 elasticsearch.yml 配置。在 ECH 上,通过 Cloud 部署设置界面配置。Serverless 不提供此功能。支持 两种令牌类型:

  • id_token(默认)——用于代表用户执行操作流程的 OpenID Connect ID 令牌。
  • access_token——用于应用身份流程的 OAuth2 客户端凭据。
curl -H "Authorization: Bearer ${JWT_TOKEN}" "${ELASTICSEARCH_URL}/_security/_authenticate"

每个 JWT 领域仅处理一种令牌类型。如果两种类型都需要,请分别为 id_token 和 access_token 配置独立的领域。

Kerberos

通过 SPNEGO 机制使用 Kerberos 票据进行身份验证。仅适用于自管理部署——ECH 和 Serverless 不提供此功能。 需要正常运行的 KDC 基础设施、正确的 DNS 配置和时间同步。

kinit "${KERBEROS_PRINCIPAL}"
curl --negotiate -u : "${ELASTICSEARCH_URL}/_security/_authenticate"

--negotiate 标志会启用 SPNEGO。curl 要求提供 -u :,但会忽略用户名——实际使用的是 kinit 中的主体。需要支持 GSS-API/SPNEGO 的 curl 7.49+。

API keys

这不是领域,而是一种独立的身份验证机制。将 Base64 编码的 API key 放入 Authorization 请求头中。 这是程序化和自动化访问的首选方式。

curl -H "Authorization: ApiKey ${ELASTICSEARCH_API_KEY}" "${ELASTICSEARCH_URL}/_security/_authenticate"

创建密钥时返回的 ELASTICSEARCH_API_KEY 是 encoded 值(id:api_key 的 Base64 编码)。

验证身份验证

继续操作前,请始终验证凭据:

curl <auth_flags> "${ELASTICSEARCH_URL}/_security/_authenticate"

检查 username、roles 和 authentication_realm.type,以确认身份和身份验证方式:

authentication_realm.typeRealm
nativeNative
fileFile
ldapLDAP
active_directoryActive Directory
pkiPKI
samlSAML
oidcOpenID Connect
jwtJWT
kerberosKerberos

对于 API 密钥,authentication_type 为 "api_key"(而不是 realm 类型)。

管理 API 密钥

创建 API 密钥
curl -X POST "${ELASTICSEARCH_URL}/_security/api_key" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{
    "name": "'"${KEY_NAME}"'",
    "expiration": "30d",
    "role_descriptors": {
      "'"${ROLE_NAME}"'": {
        "cluster": [],
        "indices": [
          {
            "names": ["'"${INDEX_PATTERN}"'"],
            "privileges": ["read"]
          }
        ]
      }
    }
  }'

响应包含 id、api_key 和 encoded。请安全保存 encoded,之后无法再次获取。

省略 role_descriptors,即可继承已通过身份验证的用户当前权限的快照。

限制: API 密钥无法创建具有权限的其他 API 密钥。派生密钥创建后不具备任何 有效访问权限。请改用用户凭据调用 POST /_security/api_key/grant。

获取并使 API 密钥失效
curl "${ELASTICSEARCH_URL}/_security/api_key?name=${KEY_NAME}" <auth_flags>
curl -X DELETE "${ELASTICSEARCH_URL}/_security/api_key" \
  <auth_flags> \
  -H "Content-Type: application/json" \
  -d '{"name": "'"${KEY_NAME}"'"}'

示例

创建范围受限的 API 密钥

请求:“创建一个只能读取 metrics-* 的 API 密钥。”

POST /_security/api_key
{
  "name": "metrics-reader-key",
  "expiration": "90d",
  "role_descriptors": {
    "metrics-reader": {
      "indices": [
        {
          "names": ["metrics-*"],
          "privileges": ["read", "view_index_metadata"]
        }
      ]
    }
  }
}
验证用户通过哪个 realm 完成身份验证
GET /_security/_authenticate
{
  "username": "joe",
  "authentication_realm": { "name": "ldap1", "type": "ldap" },
  "authentication_type": "realm"
}
使用 JWT bearer token 进行身份验证
curl -H "Authorization: Bearer ${JWT_TOKEN}" "https://my-cluster:9200/_security/_authenticate"

确认响应中的 authentication_realm.type 显示为 "jwt"。

指南

选择身份验证方式
方式最适合的场景权衡
Native 用户交互式使用、简单配置必须存储密码或提示用户输入
File 用户灾难恢复、引导配置必须在每个节点上配置
API 密钥编程访问、CI/CD、范围受限的访问创建后无法再次获取
LDAP / AD企业目录集成需要访问目录服务的网络
PKI 证书服务间通信、双向 TLS 环境需要 PKI 基础设施和 PKI realm
SAML通过企业 IdP 实现 Kibana SSO仅限浏览器;不适用于 REST 客户端
OIDC通过 OpenID Connect 提供商实现 Kibana SSO仅限浏览器;不适用于 REST 客户端
JWT基于令牌的服务和用户身份验证需要外部令牌签发方和 realm 配置
KerberosWindows/企业 Kerberos 环境需要 KDC、DNS 和时间同步基础设施

自动化工作流优先使用 API 密钥,因为它支持精细的范围控制和独立的过期时间。对于 Kibana SSO,请使用 SAML 或 OIDC。对于企业目录集成,请使用 LDAP 或 AD,并配置角色映射(参见 elasticsearch-authz)。

避免使用超级用户凭据

切勿在日常操作、自动化或应用访问中使用内置的 elastic 超级用户或任何具有 superuser 角色的账户。请改为创建专用用户或 API 密钥,仅授予任务所需的权限。elastic 用户仅应保留用于初始集群设置和紧急恢复。

安全
  • API 密钥不能创建具有权限的其他 API 密钥。以编程方式创建密钥时,请使用用户凭据或 POST /_security/api_key/grant。
  • 始终为 API 密钥设置 expiration。生产环境中应避免使用永不过期的密钥。
  • 通过 role_descriptors 限定 API 密钥的权限范围。绝不要为自动化系统创建未限定权限范围的密钥。
  • 切勿在聊天中接收、复述或记录密码、API 密钥、令牌或任何凭据。应指导用户直接在终端、环境变量或文件中管理机密信息。
  • 切勿将机密信息存储在代码、脚本或版本控制中。请从环境变量中加载。
  • 执行管理操作前,使用 GET /_security/_authenticate 验证凭据。
  • 为原生用户生成密码时,至少使用 16 个字符,并混合大小写字母、数字和符号。绝不要使用 changeme 或 password123 这类占位值。
  • SAML 和 OIDC 仅用于基于浏览器的 SSO。除这些方式外,始终配置一个配套的领域(原生、文件或 API 密钥),以便通过 REST API 访问。

部署兼容性

并非所有部署类型都支持所有身份验证领域。自管理集群支持所有领域。Elastic Cloud Hosted (ECH) 由 Elastic 管理,无法访问节点。Serverless 是完全托管的 SaaS。

领域自管理ECHServerless
原生是是不可用
文件是不可用不可用
LDAP是不可用不可用
Active Directory是不可用不可用
PKI是有限不可用
SAML是是(部署配置)组织级别
OIDC是是(部署配置)不可用
JWT是是(部署配置)不可用
Kerberos是不可用不可用
API 密钥是是是

ECH 注意事项:

  • 无法访问节点,因此文件领域和 elasticsearch-users CLI 不可用。
  • 无法在 ECH 上配置 LDAP、Active Directory 和 Kerberos。
  • 可通过 Cloud 部署设置界面配置 SAML、OIDC 和 JWT。
  • elastic 超级用户可用,但日常使用仍应避免使用。

Serverless 注意事项:

  • API 密钥是主要的身份验证方式。
  • 不存在原生用户——用户在 Elastic Cloud 组织级别进行管理。
  • SAML SSO 在组织级别配置,而非按项目配置。

评论

支持 Markdown