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 |
过期时间(毫秒时间戳) |
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 安全索引异常
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 最小权限原则
避免:
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 管控方案。