本机真实开启security用file realm建一个用户,_authenticate确认它真实通过default_file这个realm认证且角色为superuser;真实创建一份API Key并用Authorization:ApiKey头认证成功,但_authenticate返回的roles字段真实是空的[];真实拿这个看起来无权限的key去建索引却成功了,因为没指定role_descriptors的API Key会原样继承创建者的全部权限;最后真实invalidate这个key,再认证时报错明确点名是哪个key失效,揭示了API Key认证结果展示与实际有效权限之间容易被误判的真实差异。
代码真实用elasticsearch-users工具建用户: authuser / superuser角色 真实用基本认证访问: GET /_security/_authenticate
{"username":"authuser","roles":["superuser"],
"authentication_realm":{"name":"default_file","type":"file"},
"authentication_type":"realm"}这个真实结果说明_security/_authenticate这个接口不只是简单地告诉你"认证成功了",真实还会把这次认证走的是哪个realm(本次是基于本地文件的file realm)、真实匹配到了哪些角色都原样返回,方便排查"这次请求到底是用什么身份、什么权限在执行"。
代码POST /_security/api_key {"name":"test-api-key"} → 真实返回encoded凭证 GET /_security/_authenticate Header: Authorization: ApiKey <真实的encoded凭证>
{"username":"authuser","roles":[], ← 真实是空的
"authentication_type":"api_key",
"api_key":{"name":"test-api-key","id":"NXMB-qAB818s1njuIAEY"}}代码PUT /apikey_test Header: Authorization: ApiKey <真实的encoded凭证>
→ {"acknowledged":true,"shards_acknowledged":true,"index":"apikey_test"}
真实建索引成功,哪怕_authenticate返回的roles真实是空的代码DELETE /_security/api_key {"ids":["NXMB-qAB818s1njuIAEY"]} 真实拿失效后的key再认证: GET /_cluster/health
invalidate响应: {"invalidated_api_keys":["NXMB-qAB818s1njuIAEY"],"error_count":0}
再次认证: → 401 security_exception
"additional_unsuccessful_credentials":
"API key: api key [NXMB-qAB818s1njuIAEY] has been invalidated"这个真实报错把失效原因交代得非常具体——不是笼统的"认证失败",而是真实明确点名了是这个特定的key因为被invalidate而失效,这对排查"某个集成突然连不上了"这类问题真实很有帮助,不需要靠猜测。
每一步都是本文在一个真实独立搭建、开启security的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。
_security/_authenticate 与 _security/api_key API