在使用 Kibana 连接 Elasticsearch 时,很多人会遇到下面这类报错:

[ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception

Root causes:

security_exception: missing authentication credentials for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]

同时日志里还可能看到一条类似信息:

[INFO ][plugins.screenshotting.chromium] Browser executable: /usr/share/kibana/node_modules/@kbn/screenshotting-plugin/chromium/headless_shell-linux_x64/headless_shell

很多人第一眼会以为是 Kibana 本身坏了,或者是浏览器组件有问题。其实都不是。

真正的问题只有一个:Kibana 访问 Elasticsearch 时,没有带认证信息。

一、这个报错到底是什么意思?

这条错误的核心是:

missing authentication credentials

它的意思不是“密码错了”,而是:

  • Kibana 能访问到 Elasticsearch
  • 但 Elasticsearch 开启了安全认证
  • Kibana 发请求时没有附带用户名和密码,或者认证配置根本没生效

也就是说,这通常不是网络不通,而是认证配置缺失

另外,chromium 那条日志只是普通信息,和这次故障无关,可以忽略。

二、最容易误解的一点:kibana_system 没有默认密码

很多人排查到这里,会继续追问一句:

kibana_system 的密码到底是什么?

答案是:没有通用默认密码。

kibana_system 是 Elasticsearch 内置用户之一,但它的密码不是一个固定值,不是“默认就知道”的那种账号。

需要注意这几点:

  • elastic 用户在首次初始化时,可能会设置或生成密码
  • kibana_system 的密码通常需要你自己设置,或者后续手动重置
  • 所以不能直接假设它有个统一默认值

这也是很多人配置了 ELASTICSEARCH_USERNAME=kibana_system 之后,仍然无法正常启动 Kibana 的原因。

三、先判断:是“没带认证”还是“密码错误”?

这两种情况日志表现不一样。

1)没带认证信息

如果报错是:

missing authentication credentials

说明请求里压根没有认证信息,通常是:

  • 没配置用户名密码
  • 环境变量没生效
  • 配置写了,但容器没重建
  • .env 变量为空

2)密码错误

如果是密码错了,常见报错更像:

unable to authenticate user [kibana_system]

这说明 Kibana 已经带上了用户名密码,但认证失败了。

所以,看到 missing authentication credentials 时,优先检查的是:Kibana 是否真的把认证配置传进去了,而不是先纠结密码对不对。

四、Kibana 应该怎么配置?

如果你使用的是 kibana.yml,配置通常类似这样:

elasticsearch.hosts: ["http://<es-host>:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "<你的密码>"

如果你使用 Docker / Docker Compose,则对应的环境变量是:

ELASTICSEARCH_HOSTS=http://<es-host>:9200
ELASTICSEARCH_USERNAME=kibana_system
ELASTICSEARCH_PASSWORD=<你的密码>

五、Docker Compose 场景下的正确处理方式

这是最常见的部署方式,也是最容易踩坑的地方。

1)一个最小可用的 docker-compose.yml

version: "3.8"

services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.13.4
    container_name: es01
    environment:
      discovery.type: single-node
      xpack.security.enabled: "true"
      xpack.security.http.ssl.enabled: "false"
      ELASTIC_PASSWORD: "Elastic123!"
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data

  kibana:
    image: docker.elastic.co/kibana/kibana:8.13.4
    container_name: kibana
    depends_on:
      - es01
    environment:
      ELASTICSEARCH_HOSTS: "http://es01:9200"
      ELASTICSEARCH_USERNAME: "kibana_system"
      ELASTICSEARCH_PASSWORD: "Kibana123!"
    ports:
      - "5601:5601"

volumes:
  esdata:

2)为什么这样写了还可能报错?

因为这里有一个关键细节:

  • ELASTIC_PASSWORD 可以在 Elasticsearch 启动时直接设置 elastic 用户密码
  • 但是 kibana_system 的密码不会自动等于 Kibana123!
  • 你必须在 Elasticsearch 启动后,手动把 kibana_system 的密码设置成这个值

也就是说,下面这段配置:

ELASTICSEARCH_USERNAME: "kibana_system"
ELASTICSEARCH_PASSWORD: "Kibana123!"

只有在你真的把 kibana_system 密码设置成 Kibana123! 之后才有效。

六、正确启动步骤

第一步:先启动 Elasticsearch

docker compose up -d es01

第二步:给 kibana_system 设置密码

手动输入密码:

docker compose exec es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -i

然后把密码设置成你在 docker-compose.yml 里写的那个,比如:

Kibana123!

如果你想让系统自动生成密码,也可以这样:

docker compose exec es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system -b

它会输出一个随机密码,你再把这个密码填回 ELASTICSEARCH_PASSWORD

第三步:启动 Kibana

docker compose up -d kibana

第四步:如果之前容器已经启动过,强制重建

这是很多人遗漏的一步。

docker compose up -d --force-recreate kibana

因为有时候你虽然改了 Compose 配置,但旧容器仍然在用旧环境变量。

七、怎么验证问题是不是解决了?

你可以先用 curl 检查 Elasticsearch 是否能正常认证。

例如:

curl -u kibana_system:Kibana123! http://localhost:9200

如果返回了 Elasticsearch 的信息,说明这个账号密码是可用的。

如果认证失败,就说明:

  • 密码不对
  • kibana_system 还没设置成功
  • 或者 ES 地址写错了

八、常见踩坑总结

排查这类问题时,最常见的坑有这几个:

1)误以为 kibana_system 有默认密码

没有。必须自己设置或重置。

2)把 elastic 的密码当成 kibana_system 的密码

这两个不是同一个用户,密码也不是自动相同的。

3)配置写了,但没生效

常见原因:

  • .env 里变量为空
  • Compose 配置改了,但容器没重建
  • 写错环境变量名
  • kibana.yml 和环境变量互相覆盖

4)看到 chromium 日志就怀疑截图插件

这条日志和 Elasticsearch 认证失败没有关系。

5)把“没带认证”误判成“密码错误”

missing authentication credentialsunable to authenticate user 不是一回事。

九、更推荐的方式:使用 Token

在 Elastic 8.x 里,官方也更推荐使用 enrollment tokenservice account token,而不是手动长期维护 kibana_system 密码。

不过如果你当前只是想快速解决问题,那么最直接的方法仍然是:

  • 启动 ES
  • 重置 kibana_system 密码
  • 把该密码配置给 Kibana
  • 重建并重启 Kibana

十、结论

当 Kibana 出现下面这个错误时:

security_exception: missing authentication credentials

基本可以按这个思路排查:

  1. 先确认 Elasticsearch 开启了安全认证
  2. 再确认 Kibana 是否真的配置了认证信息
  3. 明确 kibana_system 没有默认密码
  4. 在 Elasticsearch 容器里手动重置 kibana_system 密码
  5. 把新密码配置到 Kibana
  6. 强制重建并重启 Kibana 容器

一句话总结就是:

这类报错通常不是 Kibana 连不上 Elasticsearch,而是 Kibana 连上了,但没正确带上认证信息。

Q.E.D.


生命在于折腾