如何获取elasticsearch apikey

Elasticsearch 从 7.x 开始提供 API Key 认证机制,用于替代 Basic Auth / Token,适用于服务间调用(尤其是 Agent / 微服务 / 自动化场景)。


2. 前置条件

2.1 开启安全功能

你当前配置中已有:

1
xpack.security.enabled=true

确保:

  • 已设置 elastic 用户密码
  • HTTP 接口可访问(9200)

3. 获取 API Key(核心 curl)

3.1 基础方式(最常用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
curl -u elastic:your_password \
-X POST "http://localhost:9200/_security/api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "my-api-key",
"expiration": "1d",
"role_descriptors": {
"my-role": {
"cluster": ["monitor"],
"index": [
{
"names": ["*"],
"privileges": ["read"]
}
]
}
}
}'

4. 返回结果解析

典型返回:

1
2
3
4
5
6
{
"id": "VuaCfGcBCdbkQm-e5aOx",
"name": "my-api-key",
"expiration": 1714212345678,
"api_key": "tXH3..."
}

关键字段:

字段 含义
id API Key ID
api_key 真正的密钥
expiration 过期时间(毫秒时间戳)

5. 构造 Authorization Header(关键)

Elasticsearch 要求:

Authorization: ApiKey base64(id:api_key)

5.1 生成 base64

1
echo -n "id:api_key" | base64

示例:

1
echo -n "VuaCfGcBCdbkQm-e5aOx:tXH3..." | base64

5.2 使用 API Key 访问

1
2
curl -X GET "http://localhost:9200/_cluster/health" \
-H "Authorization: ApiKey <base64值>"

6. 无权限简化版本(全权限测试)

如果只是测试,可以直接:

1
2
3
4
5
6
curl -u elastic:your_password \
-X POST "http://localhost:9200/_security/api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "full-access-key"
}'

默认继承当前用户权限(elastic = superuser)


7. 常见问题(结合你当前报错)

你之前报:

failed to retrieve password hash for reserved user [elastic]

可能原因:

7.1 ES 安全索引异常

1
GET /.security/_search

7.2 密码未初始化

1
bin/elasticsearch-reset-password -u elastic

7.3 Docker 环境变量不生效

你当前:

1
ELASTIC_PASSWORD=${ELASTIC_PASSWORD:-changeme123}

⚠️ 但:

  • 仅首次启动有效
  • 数据目录已存在 → 不会重新设置密码

7.4 修复方案(推荐)

1
2
docker-compose down -v   # 删除数据卷
docker-compose up -d

或手动 reset password


8. API Key 生命周期管理

8.1 查询 API Keys

1
2
curl -u elastic:password \
-X GET "http://localhost:9200/_security/api_key"

8.2 删除 API Key

1
2
3
4
5
6
curl -u elastic:password \
-X DELETE "http://localhost:9200/_security/api_key" \
-H "Content-Type: application/json" \
-d '{
"ids": ["api_key_id"]
}'

9. SRE 视角建议(重点)

9.1 使用 API Key 替代密码

适用于:

  • CI/CD
  • Agent(Mastra / OpenClaw)
  • Sidecar

9.2 Key 分级

类型 权限
read-only 查询
ingest 写入
admin 管理

9.3 最小权限原则

1
"privileges": ["read"]

避免:

1
"privileges": ["all"]

10. 自动化流程(推荐架构)

flowchart LR
    A[CI/CD] --> B[调用 ES API]
    B --> C[使用 API Key]
    C --> D[访问 Elasticsearch]

    E[Key 管理服务] -->|生成| C
    E -->|回收| C

11. 一条命令版(极简)

1
curl -u elastic:password -X POST localhost:9200/_security/api_key -H 'Content-Type: application/json' -d '{"name":"test"}'

如果你要把这个接入 Mastra / AI Agent / OpenClaw skill,可以继续往下做:

  • API Key 动态轮换
  • Vault 集成
  • 多租户隔离策略

需要的话我可以给你一套完整 SRE 级 Key 管控方案。