ELK 专题:3. 非交互式修改 ElasticSearch 密码

教程基于 ELK 6.5.4 版本实现并测试通过,理论上支持 6.x 版本。

TL; DR

通过 Restful 接口来绕开交互式的命令行修改密码,达到批量自动化部署 ELK 目的。


简介

ElasticSearch 在 6.1 版本后,取消了通过 Docker-compose 的环境变量 ELASTIC_PASSWORD 来直接设置其密码,转而推荐使用命令行。

1
2
$ bin/x-pack/setup-passwords interactive # 要交互式手工输入账户的密码
$ bin/x-pack/setup-passwords auto # 程序自动为你生成账户的随机密码

如上面所属,要么是让程序为每一个 ElasticSearch 自动生成随机密码,那么对于整体的管控来说是不实际的。
那么如果安装了 X-Pack 但是不重置密码行不行呢? 答案是不行的,网上流传的 changeme 初始密码在 6.x 版本中启动了 X-Pack 后并不能通过安全认证。

那么剩下的方式就是 交互式 的手工输入账户密码,交互式即导致了我们不能写 Bash 来解决输入问题(除非额外安装插件去完成)。而本文要解决的问题是,在批量部署具有密码验证功能的 ELK 中遇到的密码修改无法通过脚本实现的问题。


解决方案

在官方的 Issue 答疑解惑中,发现仍然可以通过一个接口直接对 ElasticSearch 进行密码修改。
具体操作:

  • 创建一个超级权限的用户
  • 以超级权限用户的权限通过接口重置 elastic 的密码
  • 验证重置密码后的账户
  • 删除刚刚创建的超级权限用户(可选)

操作步骤

创建超级权限用户

通过命令行,创建一个账户名为 copriwolf,且密码为 sayHi2Elastic 的超级权限用户

1
$ {ES安装目录}/bin/elasticsearch-users useradd copriwolf -p sayHi2Elastic -r superuser

重置 elastic 账户的密码

重置账户密码的接口 URL 如下

1
{ES的访问地址}/_xpack/security/user/{被修改的账户名}/_password?pretty

所以我根据需求,通过 copriwolf 账户重置在 localhost:9200 这个端口的 ES 服务中的 elastic 账户的密码为 123456,发起了一个 CURL 如下

1
2
3
4
$ curl -u copriwolf:sayHi2Elastic \
-XPUT "http://localhost:9200/_xpack/security/user/elastic/_password?pretty" \
-H 'Content-Type: application/json' \
-d '{"password": "123456"}'

验证重置密码后的账户

修改后,我们需要验证是否真正有生效,可以通过如下 CURL 进行确认

1
$ curl -u elastic 'http://localhost:9200/_xpack/security/_authenticate?pretty'

删除刚刚创建的超级权限用户

已经完成了需求,这个时候可以删除为这个需求而特意创建的超级权限用户,对于最小权限原则,还是尽量删除权限过大但是用处不明的账户。
所以通过一下命令行可以完成用户 copriwolf 的删除。

1
$ {ES安装目录}/bin/elasticsearch-users userdel copriwolf

官方提到,如果在 elasticsearch.yml 中指定了验证域( authentication realms ),需要有特殊的操作,不妨到官方博文中了解。


了解更多 ELK 专题

  1. ELK on Docker with X-Pack [了解一下]
  2. 破解 X-Pack [了解一下]
  3. 非交互式修改 ElasticSearch 密码 [了解一下]
  4. Logstatsh 的索引与模版文件 (template) [了解一下]

致谢

  1. X-Pack Authentication issue