0x01 前言

最近elasticstack技术栈发布了6.0,目前最新版本是6.1.0。而我也在最近2周看了新版的文档,发现有好多东西都发生了变化。在最近的一周里,我将我家里的elasticstack从5.6升级到6.0.1。

在5.0的时候我试用过x-pack,功能非常强大,尤其是监控和告警的功能。可这个是收费的,而且费用非常昂贵,所以在这里我需要对一些文件进行修改。

在6.0的时代我也想尝试使用,最主要是想开发告警插件,接入微信。

0x02 安装

在安装x-pack之前要先安装好elasticsearch、kibana和logstash。简单的安装过程可以参考以下文章:

然后要安装x-pack,在这里要先为elasticsearch安装,然后是kibana,最后是logstash。

因为x-pack的安全要求,需要对各个组件间的传输数据使用TLS加密,同时需要为各个内置配置密码。在这里我不对这部分内容进行说明,在elasticsearch.yml文件中使用以下参数禁用x-pack的安全配置:

xpack.security.enabled: false

添加好以上参数后先不要重启服务,先安装x-pack。

x-pack的安装包是通用的,如果网络情况不理想的话,建议下载安装包进行安装,以下是下载地址:

https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.0.1.zip

下载好文件后使用以下命令为elasticsearch安装x-pack:

#使用以下命令安装
bin/elasticsearch-plugin intall file:///[your file path]

#例如我的:
[root@es6-t1 ~]# /usr/share/elasticsearch/bin/elasticsearch-plugin install file:///root/x-pack-6.0.1.zip 
-> Downloading file:///root/x-pack-6.0.1.zip
[=================================================] 100%   
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.io.FilePermission \\.\pipe\* read,write
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* java.net.SocketPermission * connect,accept,resolve
* java.security.SecurityPermission createPolicy.JavaPolicy
* java.security.SecurityPermission getPolicy
* java.security.SecurityPermission putProviderProperty.BC
* java.security.SecurityPermission setPolicy
* java.util.PropertyPermission * read,write
* java.util.PropertyPermission sun.nio.ch.bugLevel write
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]y
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@        WARNING: plugin forks a native controller        @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
This plugin launches a native controller that is not subject to the Java
security manager nor to system call filters.

Continue with installation? [y/N]y
-> Installed x-pack

如果不想下载安装包,还可以通过以下命令直接安装,其实还是会下载安装包,只不过不会保存到本地而已:

[root@es6-t1 ~]# /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack

安装过程需要点时间,完成后重启elasticsearch服务,然后需要使用以下命令设置各个内置账号的密码:

/usr/share/elasticsearch/bin/x-pack/setup-passwords interactive

这时候在kibana里是看不到任何变化的,因为还需要为kibana安装x-pack。用同样的安装包为kibana安装:

[root@es6-t1 ~]# /usr/share/kibana/bin/kibana-plugin install file://root/x-pack-6.0.1.zip

还可以直接安装:

[root@es6-t1 ~]# /usr/share/kibana/bin/kibana-plugin install x-pack

完成后重启kibana,然后登入kibana即可看到机器学习、图形工作台与监控按钮:

因为在一开始就禁用了x-pack的安全功能,所以用户控制的按钮被隐藏了。如果需要用户控制功能,请参考官方网站的文档完成安全配置之后再将以下配置从elasticsearch.yml移除即可:

xpack.security.enabled: false

0x03 激活

在继续之前需要提醒大家请不要将修改过的文件应用在生产环境,这可能会导致不可挽回的错误。同时请大家支持正版软件,以下是x-pack授权的购买地址:

从上面的地址可以看到授权分为开源版、基础版、黄金版、铂金版与企业版。企业版比铂金版多ELASTIC CLOUD的管理功能,可管理多个群集,因为我用不上,所以选择铂金版。

先通过以下地址申请一个基础版的授权:

提交申请后,稍等片刻即可收到官方发送的邮件,从邮件中的地址下载授权文件,文件中的内容如下:

[root@es6-node1 ~]# cat license.json 
{
  "license": {
    "expiry_date_in_millis": 2513296000000,
    "issue_date_in_millis": 1513296000000,
    "issued_to": "[your name and company name]",
    "issuer": "Web Form",
    "max_nodes": 1000,
    "signature": "[your signature key]",
    "start_date_in_millis": 1513296000000,
    "type": "platinum",
    "uid": "[your uid]"
  }
}

相关字段如下:

  • issue_date_in_millis:授权启用时间,无需修改
  • expiry_date_in_millis:授权到期时间,将时间戳的第一位加1即可
  • type:授权级别,platinum为铂金

其余内容请勿修改,保存名为license.json的文件即可。

然后在系统中新建以下文件:

[root@es6-node1 ~]# cat codex/LicenseVerifier.java 
package org.elasticsearch.license;

import java.nio.*;
import java.util.*;
import java.security.*;
import org.elasticsearch.common.xcontent.*;
import org.apache.lucene.util.*;
import org.elasticsearch.common.io.*;
import java.io.*;

public class LicenseVerifier
{
    public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) {
        return true;
    }

    public static boolean verifyLicense(final License license) {
        return true;
    }
}

然后使用openjdk进行编译,如果你也是用官方的安装包,那么以下文件的路径应该和我一致,为了安全起见,请再次确认。然后使用以下命令进行编译:

[root@es6-t1 ~]# javac -cp "/root/codex/elasticsearch-6.1.0/lib/elasticsearch-6.1.0.jar:/root/codex/elasticsearch-6.1.0/lib/lucene-core-7.1.0.jar:/usr/share/elasticsearch/plugins/x-pack/x-pack-6.0.1.jar"  LicenseVerifier.java

如果提示找不到javac的命令,请使用以下命令安装:

[root@es6-t1 ~]# yum install java-1.8.0-openjdk-devel

编译过程非常快,但不会输出内容,完成后会在当前目录生成一个LicenseVerifier.class的二进制文件。

这个LicenseVerifier.class文件是判断授权是否有效的文件,若有效则返还true。因此需要手动将其判断逻辑删除,直接返还true。

然后需要将编译好的文件替换到x-pack的jar包中:

#进入相关文件夹
[root@es6-t1 ~]# cd /usr/share/elasticsearch/plugins/x-pack/

#新建临时文件夹
[root@es6-t1 x-pack]# mkdir temp

#将jar文件复制到临时文件夹中
[root@es6-t1 x-pack]# cp x-pack-6.0.1.jar temp/

#进入临时文件夹
[root@es6-t1 x-pack]# cd temp/

#解压jar包
[root@es6-t1 temp]# jar xvf x-pack-6.0.1.jar

#替换文件
[root@es6-t1 temp]# cp /root/LicenseVerifier.class ./org/elasticsearch/license/

#重新打包
[root@es6-t1 temp]# jar cvf x-pack-6.0.1.jar .

#将打包好的jar包复制到原来的位置并覆盖原来的文件
[root@es6-t1 temp]# cp x-pack-6.0.1.jar ../

完成后重启elasticsearch服务,然后将修改好的授权文件使用以下命令导入到elasticsearch中:

[root@es6-node1 ~]# curl -XPUT -u elastic 'http://127.0.0.1:9200/_xpack/license?acknowledge=true' -H "Content-Type: application/json" -d @license.json

在此过程中需要输入elastic的密码,改密码就是安装完x-pack后手动设置的那个。

最终回到kibana的monitoring窗口即可看到授权有效期:

点击进入可以看到更详细的信息:

0x04 其他

因为x-pack的授权信息是保存在elasticsearch,授权内容则是根据授权级别的不同来确定的,因此只需要导入一次即可。

不过需要将每一个组件的x-pack的jar包进行替换,如果不升级是一直有效的。

如果各个组件都安装在不同服务器中,则需要指定elasticsearch的服务器地址,如:

xpack.monitoring.elasticsearch.url: ["http://es6-node1.t.com:9200", "http://es6-node2.t.com:9200", "http://es6-node3.t.com:9200"]

将以上配置文件添加到组件的yml配置文件中即可。

最后,x-pack的监控功能确实比elasticsearch-head要棒!毕竟是是收费的软件。

0x05 结语

最后还是要提醒大家请不要将修改过的文件应用在生产环境,这可能会导致不可挽回的错误。同时请大家支持正版软件,以下是x-pack授权的购买地址: