无法从 Docker 设置 Elasticsearch/Kibana:Kibana“缺少 REST 请求的身份验证凭据”

W.P*_*ill 5 elasticsearch docker kibana docker-compose

我无法从 Docker 映像设置开发 Elasticsearch/Kibana 实例。我无法让 Kibana 服务连接到 Elasticsearch 服务。

我有以下docker-compose.yml文件。

services:

  elasticsearch:
    container_name: elasticsearch
    image: docker.elastic.co/elasticsearch/elasticsearch:8.4.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=true
    ports:
      - "9200:9200"

  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:8.4.0
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
      - xpack.security.enabled=true
    ports:
      - "5601:5601"
Run Code Online (Sandbox Code Playgroud)

我一开始没有创建和运行任何容器docker compose up根据自动启用安全性启动 Elastic Stack中的说明,我期望看到以下内容:

A password is generated for the elastic user and output to the terminal, plus an enrollment token for enrolling Kibana.
Run Code Online (Sandbox Code Playgroud)

不生成密码。当我查看日志时,我从 Kibana 容器中看到以下内容。

[ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception: [security_exception] Reason: missing authentication credentials for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]
2022-08-27T03:18:39.927296590Z 
Run Code Online (Sandbox Code Playgroud)

当我尝试通过连接到 Kiabana 时,http://localhost:5601我看到“Kibana 服务器尚未准备好”。永远不会消失的消息。

Elasticsearch 日志中没有错误。该服务似乎已正常启动。

在 Elasticsearch github 上,问题 #85047:新容器上未生成弹性用户密码也描述了密码未自动生成的情况。在这种情况下的解决方案docker compose up在没有开关的情况下运行-d,这就是我已经在做的事情。

Elastic 讨论板上报告了类似的错误,但已通过“错误是我的 kibana.yml 不在配置目录中”解决。我的情况并非如此。

据我所说,我正在做与这篇博文中相同的事情。

我尝试了对docker-compose.yml文件的各种修改(例如替换ELASTICSEARCH_URLELASTICSEARCH_HOSTELASTICSEARCH_HOSTS、添加elasticsearch.username=kibana_system到 Kibana 环境变量或指定ELASTIC_PASSWORD.)。我总是遇到同样的错误。(尽管如果我ELASTIC_PASSWORD=password在 Elasticsearch 容器中设置环境变量,我可以通过连接http://localhost:9200并验证 Elasticsearch 服务是否正在运行。)

在这失败之后,我尝试按照为Elasticsearch 设置最低安全性中的说明手动配置最低安全性,但遇到了同样的问题。

如果我elasticsearch-reset-password按照手册最低安全设置说明中的说明使用 to 设置密码kibana_systempassword则从我的主机 shell 执行以下curl 命令

curl --user kibana_system -X GET "http://localhost:9200/?pretty"
Run Code Online (Sandbox Code Playgroud)

从 Elasticsearch 返回有效响应。我也可以找回

curl --user kibana_system -X GET "http://localhost:9200/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip"
Run Code Online (Sandbox Code Playgroud)

Kibana 日志错误中提到的 URL。

显然,kibana_system用户是使用正确的密码创建的,但在 Kibana 启动期间没有正确使用该密码。


以下内容docker-compose.yml复制自此博客文章文件,有效。

services:

  elasticsearch:
    image: elasticsearch:2.4
    ports:
      - "9200:9200"
    environment:
      - discovery.type=single-node

  kibana:
    image: kibana:4.6
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
Run Code Online (Sandbox Code Playgroud)

我可以立即登录 Kibana,地址为http://localhost:5601

据推测,2.4/4.6 版本已经足够老了,导致问题的安全功能尚未实现。


如果我从使用 Docker 安装 Elasticsearch说明复制文件,则版本为 8.4.0 。

W.P*_*ill 8

我试图做的解决方案是在不启用安全性的情况下运行。

services:

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.4.0
    container_name: es-node01
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - xpack.security.enrollment.enabled=false
  kibana:
    image: docker.elastic.co/kibana/kibana:8.4.0
    container_name: kib-01
    ports:
      - "5601:5601"
Run Code Online (Sandbox Code Playgroud)

Elastic 讨论板上的这个帖子详细介绍了完整的答案。

总结一下,从8.0版本开始,Elastic默认开启安全性。在最简单的情况下,Elastic 还会为您设置安全配置,如使用 Docker 安装 Elasticsearch中所述。但是,如果您使用 Docker 撰写文件而不是直接运行命令,则此自动设置过程将不起作用docker run。原因很复杂,并在上面链接的线程中进行了讨论。

如果您想使用 Docker compose,您可以自己手动设置安全性或关闭安全性。

就我而言,我正在编写一次性概念证明,因此没有安全性也没关系。如果需要将某些东西投入生产,我将弄清楚如何手动设置安全性。

如果我知道将问题表述为“如何关闭 Elastic 8.0 及更高版本中的自动安全配置?” 答案很简单,但我必须找出答案才能意识到这才是要问的问题。