错误信息显示,Elasticsearch 返回了 401 Unauthorized 状态,提示 "missing authentication credentials"。这表明你的请求没有提供认证信息,而 Elasticsearch 的安全功能(如 X-Pack 或 Elastic Security)已启用,要求进行认证。

问题原因

  1. 未提供认证信息:在 Elasticsearch 安全模式启用时,需要通过 HTTP 基本认证、Bearer Token 或 API Key 来访问。
  2. 未设置用户和密码:Elasticsearch 安装后没有正确配置用户和密码。
  3. 请求工具未正确配置认证头:例如,使用 curl 或客户端工具时,没有附带认证信息。

解决方法

1. 设置 Elasticsearch 用户和密码

如果 Elasticsearch 安装后没有初始化用户密码,需要设置内置用户的密码。

运行以下命令为 elastic 和其他内置用户设置密码:

bash
elasticsearch-setup-passwords interactive

按照提示输入新密码。完成后,记住设置的密码,尤其是 elastic 用户的密码。

2. 使用 elastic 用户认证

在发起请求时,使用 elastic 用户进行 HTTP 基本认证。

使用 curl 示例:
bash
curl -u elastic:your_password http://localhost:9200
返回示例:

如果认证成功,Elasticsearch 应返回类似以下内容:

json
{ "name" : "node-1", "cluster_name" : "elasticsearch", "cluster_uuid" : "xxxxxxxxxxxxxx", "version" : { "number" : "7.17.0", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "xxxxxxxxxxxxxx", "build_date" : "2023-01-01T00:00:00.000Z", "build_snapshot" : false, "lucene_version" : "8.11.0", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }

3. 在客户端配置认证

如果你使用的是 Kibana、Logstash 或其他 Elasticsearch 客户端工具,需要在它们的配置文件中添加用户和密码。

Kibana 配置:kibana.yml 文件中,设置 Elasticsearch 的认证信息:

yaml
elasticsearch.username: "elastic" elasticsearch.password: "your_password"

Logstash 配置: 在 Logstash 的管道文件中,设置 Elasticsearch 输出插件的认证信息:

yaml
output { elasticsearch { hosts => ["http://localhost:9200"] user => "elastic" password => "your_password" } }

4. 通过 API Key 认证

如果你希望使用 API Key,而不是用户名和密码,可以先创建一个 API Key。

创建 API Key:

使用 elastic 用户执行以下命令:

bash
curl -u elastic:your_password -X POST "http://localhost:9200/_security/api_key" -H "Content-Type: application/json" -d '{ "name": "my-api-key", "role_descriptors": { "role-name": { "cluster": ["monitor"], "index": [ { "names": ["*"], "privileges": ["read"] } ] } } }'

返回的 JSON 包括 idapi_key

json
{ "id" : "some-id", "name" : "my-api-key", "expiration" : null, "api_key" : "some-api-key" }
使用 API Key:

id:api_key 转换为 Base64 编码:

bash
echo -n "some-id:some-api-key" | base64

使用 curl 请求时在 Header 中添加 Authorization

bash
curl -H "Authorization: ApiKey your_base64_encoded_key" http://localhost:9200

5. 验证 Elasticsearch 配置

确保 Elasticsearch 的安全功能启用了适当的认证机制。查看 elasticsearch.yml 配置文件,确保以下设置已启用:

yaml
xpack.security.enabled: true xpack.security.http.ssl.enabled: false # 如果未启用 HTTPS

如果你修改了配置文件,请重启 Elasticsearch:

bash
docker-compose restart elasticsearch

总结

  1. 确保 Elasticsearch 安装时已正确初始化用户和密码。
  2. 使用 elastic 用户认证,或者配置 API Key 以通过认证。
  3. 确保客户端工具(如 Kibana、Logstash)正确配置认证信息。
  4. 如果仍然遇到问题,检查 Elasticsearch 日志以获取更多提示信息。

通过以上方法,应该可以解决 401 Unauthorized 的认证问题。

点赞(365) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部