通过 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 ),需要有特殊的操作,不妨到官方博文中了解。