教程基于
ELK 6.5.4
版本实现并测试通过,理论上支持 6.x 版本。
TL; DR
通过 Restful 接口来绕开交互式的命令行修改密码,达到批量自动化部署 ELK 目的。
简介
ElasticSearch 在 6.1 版本后,取消了通过 Docker-compose 的环境变量 ELASTIC_PASSWORD
来直接设置其密码,转而推荐使用命令行。
1 | $ bin/x-pack/setup-passwords interactive # 要交互式手工输入账户的密码 |
如上面所属,要么是让程序为每一个 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 | $ curl -u copriwolf:sayHi2Elastic \ |
验证重置密码后的账户
修改后,我们需要验证是否真正有生效,可以通过如下 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 专题
- ELK on Docker with X-Pack [了解一下]
- 破解 X-Pack [了解一下]
- 非交互式修改 ElasticSearch 密码 [了解一下]
- Logstatsh 的索引与模版文件 (template) [了解一下]