1 x-pack介绍
1.1 功能介绍
官网介绍:https://www.elastic.co/guide/en/kibana/6.2/setup-xpack-kb.html
x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中,可以轻松的启用或者关闭一些功能。默认我们的elk部署后,可以直接就进入web管理界面,这样会带来极大的安全隐患。
1.2 功能分类
x-pack的基本功能可列举如下:
1.21 用户管理
x-pack安装之后有一个超级用户elastic ,拥有对所有索引和数据的控制权,可以使用该用户创建和修改其他用户,当然这里可以通过kibana的web界面进行用户和用户组的管理。
如下:wyy这个用户就是通过elastic超级用户创建的,是个只读的。这里可以在web上修改
终端修改用户名和密码方式:
#修改elastic: curl -XPUT -u elastic:elastic123 'http://10.10.16.253:9200/_xpack/security/elastic/_password' -d {"password":"123456"} #修改kibana curl -XPUT -u elastic:elastic123 'http://10.10.16.253:9200/_xpack/security/kibana/_password' -d {"password":"123456"}
1.22 保护级别
如何提高Elasticsearch应用的安全性,是开发者面临的重要问题。Elasticsearch X-Pack中的安全组件提供了对应的安全解决方案,让IT和应用团队能够依赖 X-Pack 来区分和管理正常用户和恶意入侵者。
x-pack提供以下几个级别保护elastic集群:
● 用户登录身份验证:安装完x-pack,登录elasticsearch和kibana会让你输入密码
● 授权和基于角色的访问控制:允许哪些用户对哪些索引具有不同的操作权限
● 节点/客户端认证和信道加密:x-pack的elk之间的数据传递保护:logstash.yaml
● 审计:启动审核以跟踪与你的elasticsearch集群的尝试与成功的交互:xpack.security.audit.enabled: true
1.23 监控功能
使用xpack监控组件能够通过kibana轻松监控elasticsearch。还可以实时查看集群运行状况和性能,以及分析过去的集群,索引和节点指标。包括kibana本身的性能。
另外,我们可以配置监控的索引:通过elasticsearch.yml文件,如图:
可以在前面上+或-来显示包含或排除索引名称和模式。如:+ text *, - test3。
1.24 alert功能
#官网详细内容参考:https://www.elastic.co/guide/en/x-pack/current/xpack-alerting.html
当watch被触发的时候,数据将会被加载到执行的context中,watch支持以下四种输入:
Simple:加载静态的数据到execution context中
Search:加载搜索的结果到execution context中
Http:将Http请求的结果加载到execution context中
chain:使用一系列输入将数据加载到execution context中
每个watch必须有一个触发器触发watch的执行开始,watch旨在支持不同类型的的触发器,但只有基于时间戳的计划触发器目前可用,watch提供了以下几种类型的时间过滤器
Hourly
Daily
Weekly
Monthly
Yearly
Cron
Interval
1.25 graph功能
#官网详细介绍:https://www.elastic.co/guide/en/x-pack/current/graph-getting-started.html
X-Pack图的能力使你发现一个Elasticsearch索引项是如何相关联的。你可以探索索引条款之间的连接,看看哪些连接是最有意义的。从欺诈检测到推荐引擎,对各种应用中这都是有用的,例如,图的探索可以帮助你发现网站上黑客的目标的漏洞,所以你可以硬化你的网站。或者,您可以为您的电子商务客户提供基于图表的个性化推荐。X-pack提供简单,但功能强大的图形开发API,和Kibana交互式图形可视化工具。使用X-pack图有工作与开销与现有Elasticsearch指标你不需要任何额外的数据存储的特征。
1.3 功能使用
默认情况下,所有的x-pack功能都已开启,可以在elasticsearch.yml,kibana.yml,logstash.yml配置文件中启用或禁用特定的x-pack功能。
#设置 #描述
xpack.graph.enabled #设置为false以禁用X-Pack图形功能。
xpack.ml.enabled #设置为false以禁用X-Pack机器学习功能。
xpack.monitoring.enabled #设置为false以禁用X-Pack监视功能。
xpack.reporting.enabled #设置为false以禁用X-Pack报告功能。
xpack.security.enabled #设置为false以禁用X-Pack安全功能。
xpack.watcher.enabled #设置为false以禁用Watcher。
功能名称 | 文件配置格式 | 适用组件 |
图形展示 | xpack.graph.enabled | 只适用kibana组件 |
报表统计 | xpack.reporting.enabled | 只适用于kibana组件 |
报警通知 | xpack.watcher.enabled | 只适用于elasticsearch组件 |
安全认证 | xpack.security.enabled | 适用于elk的三个组件 |
监控跟踪 | xpack.monitoring.enabled | 适用于elk的三个组件 |
设备资源分配 | xpack.ml.enabled | 适用于elasticsearch和kibana |
2 x-pack安装
安装好x-pack时,默认会有30天的使用许可证,试用期结束后会无法访问,此时就需要到官网去申请一年的免费license。
2.1 x-pack破解
用破解的x-pack-6.5.4.jar替换/home/elasticsearch/plugins/x-pack/目录中原有的x-pack-6.5.4.jar包。新版默认安装好x-pack,这里我们需要单独把x-pack6.5.4.jar拿出来。
cd /home/soft/ cp /home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar ./ jar -xvf x-pack-core-6.5.4.jar #解压jar包 rm -f x-pack-core-6.5.4.jar #移除旧的jar
找到org/elasticsearch/license/LicenseVerifier.class,可使用Luyten反编译工具(https://github.com/deathmarine/Luyten/releases )打开,并拷贝内容到新建的文件LicenseVerifier.java中,文件内容如下:
package org.elasticsearch.license; import java.nio.*; import org.elasticsearch.common.bytes.*; import java.util.*; import java.security.*; import org.elasticsearch.common.xcontent.*; import org.apache.lucene.util.*; import org.elasticsearch.core.internal.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; } }
找到org/elasticsearch/xpack/core/XPackBuild.class,可使用Luyten反编译工具打开,并拷贝内容到新建的文件XPackBuild.java中,文件内容如下:
package org.elasticsearch.xpack.core; import org.elasticsearch.common.io.*; import java.net.*; import org.elasticsearch.common.*; import java.nio.file.*; import java.io.*; import java.util.jar.*; public class XPackBuild { public static final XPackBuild CURRENT; private String shortHash; private String date; @SuppressForbidden(reason = "looks up path of xpack.jar directly") static Path getElasticsearchCodebase() { final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation(); try { return PathUtils.get(url.toURI()); } catch (URISyntaxException bogus) { throw new RuntimeException(bogus); } } XPackBuild(final String shortHash, final String date) { this.shortHash = shortHash; this.date = date; } public String shortHash() { return this.shortHash; } public String date() { return this.date; } static { final Path path = getElasticsearchCodebase(); String shortHash = null; String date = null; Label_0157: { shortHash = "Unknown"; date = "Unknown"; } CURRENT = new XPackBuild(shortHash, date); } }
编译修好后的Java文件
javac -cp "/home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar:/home/elasticsearch/lib/*" LicenseVerifier.java javac -cp "/home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar:/home/elasticsearch/lib/*" XPackBuild.java
重新打jar包:
jar -cvf x-pack-core-6.5.4.jar ./*
覆盖原来的x-pack的jar,建议将之前备份
mv x-pack-core-6.5.4.jar /home/elasticsearch/modules/x-pack-core/x-pack-core-6.5.4.jar
修改/home/elasticsearch/config/elasticsearch.yml,开启x-apck认证
cluster.name: ELK-Cluster #ELK的集群名称,名称相同即属于是同一个集群 node.name: elk-node1 #本机在集群内的节点名称 path.data: /home/elasticsearch/data #数据保存目录 path.logs: /home/elasticsearch/logs #日志保存目 network.host: 0.0.0.0 #监听IP http.port: 9200 node.data: true #是否是数据节点 node.ingest: true #关闭即可 node.master: true #是否是主节点,不定义的话先启动的是主节点 node.max_local_storage_nodes: 1 #最大存储节点 bootstrap.memory_lock: false #服务启动的时候锁定足够的内存,防止数据写入swap bootstrap.system_call_filter: false ###head插件相关### http.cors.enabled: true http.cors.allow-origin: "*" #http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type ####head插件相关#### #节点ip,节点之间要允许ping和9300端口通信 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["10.10.16.213", "10.10.16.214"] xpack.security.enabled: false #建议上传证书之前改为false xpack.security.transport.ssl.enabled: false #建议上传证书之前改为false
#重启elasticsearch,建议先关闭kibana和logstash,先启动node2,注意切换普通用户。
2.2 更新许可证
去官网申请免费的license,会发邮件给你提供下载地址,将下载下来的文件重命名为license.json。https://license.elastic.co/registration #官网申请basic授权文件
我这里将下载下来的json文件放到/tmp目录下
授权文件修改:
首先将wyy-wyy-d7c273a8-699d-4db2-8406-6ae8f8abbe65-v5.json给改为license.json
时间戳时间转换:https://tool.lu/timestamp
{ "license":{ "uid":"d7c273a8-699d-4db2-8406-6ae8f8abbe65", "type":"platinum", //修改为白金版 "issue_date_in_millis":1547078400000, "expiry_date_in_millis":2855980923000, //修改到期时间为2060-07-02 "max_nodes":100, //修改最大节点数 "issued_to":"wyy wyy (pharmacodia)", "issuer":"Web Form", "signature":"AAAAAwAAAA1Q7pVrfhlxhVwk+PjKAAABmC9ZN0hjZDBGYnVyRXpCOW5Bb3FjZDAxOWpSbTVoMVZwUzRxVk1PSmkxaktJRVl5MUYvUWh3bHZVUTllbXNPbzBUemtnbWpBbmlWRmRZb25KNFlBR2x0TXc2K2p1Y1VtMG1UQU9TRGZVSGRwaEJGUjE3bXd3LzRqZ05iLzRteWFNekdxRGpIYlFwYkJiNUs0U1hTVlJKNVlXekMrSlVUdFIvV0FNeWdOYnlESDc3MWhlY3hSQmdKSjJ2ZTcvYlBFOHhPQlV3ZHdDQ0tHcG5uOElCaDJ4K1hob29xSG85N0kvTWV3THhlQk9NL01VMFRjNDZpZEVXeUtUMXIyMlIveFpJUkk2WUdveEZaME9XWitGUi9WNTZVQW1FMG1DenhZU0ZmeXlZakVEMjZFT2NvOWxpZGlqVmlHNC8rWVVUYzMwRGVySHpIdURzKzFiRDl4TmM1TUp2VTBOUlJZUlAyV0ZVL2kvVk10L0NsbXNFYVZwT3NSU082dFNNa2prQ0ZsclZ4NTltbU1CVE5lR09Bck93V2J1Y3c9PQAAAQB1Qa/KQHbjfBkfIh4FlOXsOOZIxcBkw8PPX9u7SrSOwL/LpKxuAlM9/oulDW4WZGzH5psGK7f/RDBatAQ8kiQrFQZ2B97PJmfvxoUrptXT4kzYpdkd+iAlTAyy2gkyI19QVAI5c/seVp0ERq3Rhv/l8Qx6HnMcafXTlheEoRceh3Oz88Qv3kaYwvb+R8d0WreFoaxxaqJuVAN6JFNfQr7h9Ra2ViB8yOzF0PXmmCvT5yER1UH1tDGAvfAIV7E7oGV0srf/uCEv5bD7FMUdun+aF4VApEtRoK10XLKW48qyo5+dhhEbKr2IGwAWXUM6l3FJCtZGFbKw3YX83zXz2hDi", "start_date_in_millis":1547078400000 } }
2.3 导入授权文件
通过API接口上传:如果提前设置好了用户名密码需要加上-u参数:-u elastic:elastic123
curl -XPUT 'http://10.10.16.213:9200/_xpack/license' -H "Content-Type: application/json" -d @/tmp/license.json #注意标点符号为英文 {"acknowledged":true,"license_status":"valid"} #返回valid,表示已生效
http://10.10.16.213:9200/_xpack/license
Head访问方式:http://localhost:9100/?base_uri=http://localhost:9200&auth_user=elastic&auth_password=elastic123
#如下图,但是这样容易暴露用户名和密码,后面再探索可行方案
2.4 elasticsearch添加认证
设置验证密码:进入elasticsearch/bin/x-pack,建议停掉所有节点的es服务和kibana
修改elasticsearch.yml,将xpack.security打开
./setup-passwords interactive #手动,也可选择auto
#也可进入/home/elasticsearch/bin,./elasticsearch-setup-passwords interactive #两种方式一样
会对elasticsearch、logstash、kibana分别设置登录密码(默认es用户名为elastic,logstash用户名为logstash_system,kibana用户名为kibana)
2.5 kibana添加认证
修改kibana.yml
重启kibana,登录:http://10.10.16.213:5601
使用之前设置好的用户名个密码登录:elastic elastic123,登录之后可以发现kibana界面多了很多功能,如图:
3 x-pack操作手册
这里我们主要了解一下x-pack提供的user和roles权限控制,如图展示的是security-roles:
现总结如下: ingest_admin:授予访问权限以管理所有索引模板和所有摄取管道配置。这个角色不能提供创建索引的能力; 这些特权必须在一个单独的角色中定义。 kibana_dashboard_only_user:授予对Kibana仪表板的访问权限以及对.kibana索引的只读权限。 这个角色无法访问Kibana中的编辑工具。 kibana_system:授予Kibana系统用户读取和写入Kibana索引所需的访问权限,管理索引模板并检查Elasticsearch集群的可用性。 此角色授予对.monitoring- 索引的读取访问权限以及对.reporting- 索引的读取和写入访问权限。 kibana_user:授予Kibana用户所需的最低权限。 此角色授予访问集群的Kibana索引和授予监视权限 kibana_admin:授予访问用于管理配置的.logstash *索引的权限。 logstash_system:授予Logstash系统用户所需的访问权限,以将系统级别的数据(如监视)发送给Elasticsearch。不应将此角色分配给用户,因为授予的权限可能会在不同版本之间发生变化。此角色不提供对logstash索引的访问权限,不适合在Logstash管道中使用。 machine_learning_admin:授予manage_ml群集权限并读取.ml- *索引的访问权限。 monitoring_user:授予除使用Kibana所需的X-Pack监视用户以外的任何用户所需的最低权限。 这个角色允许访问监控指标。 监控用户也应该分配kibana_user角色 remote_monitoring_agent:授予远程监视代理程序将数据写入此群集所需的最低权限 reporting_user:授予使用Kibana所需的X-Pack报告用户所需的特定权限。 transport_client:通过Java传输客户端授予访问集群所需的权限。 watcher_admin:授予对.watches索引的写入权限,读取对监视历史记录的访问权限和触发的监视索引,并允许执行所有监视器操作 watcher_user:授予读取.watches索引,获取观看动作和观察者统计信息的权限
cluster权限,即可以分配给roles的权限
all:所有集群管理操作,如快照,节点关闭/重新启动,设置更新,重新路由或管理用户和角色 monitor:所有集群只读操作,如集群运行状况,热线程,节点信息,节点和集群统计信息,快照/恢复状态,等待集群任务 monitor_ml: 所有只读机器学习操作,例如获取有关数据传输,作业,模型快照或结果的信息 monitor_watcher: 所有只读操作,例如获取watch和watcher统计信息 manage:构建monitor并添加更改集群中值的集群操作。这包括快照,更新设置和重新路由。此特权不包括管理安全性的能力 manage_index_templates:索引模板上的所有操作 manage_ml:所有机器学习操作,例如创建和删除数据传输,作业和模型快照。数据处理以具有提升特权的系统用户身份运行,包括读取所有索引的权限 manage_security:所有与安全相关的操作,例如对用户和角色的CRUD操作以及缓存清除 manage_watcher:所有观察者操作,例如放置watches,执行,激活或确认。Watches作为具有提升特权的系统用户运行,包括读取和写入所有索引的权限。Watches作为具有提升特权的系统用户运行,包括读取和写入所有索引的权限
indices权限:
all 索引上的任何操作
monitor 监控所需的所有操作(恢复,细分信息,索引统计信息和状态)
manage 所有monitor特权加索引管理(别名,分析,缓存清除,关闭,删除,存在,刷新,映射,打开,强制合并,刷新,设置,搜索分片,模板,验证)
view_index_metadata 对索引元数据(别名,别名存在,获取索引,存在,字段映射,映射,搜索分片,类型存在,验证,warmers,设置)进行只读访问。此特权主要供Kibana用户使用
read 只读操作(计数,解释,获取,mget,获取索引脚本,更多像这样,多渗透/搜索/ termvector,渗透,滚动,clear_scroll,搜索,建议,tv)
read_cross_cluster 只读访问来自远程集群的搜索操作
index 索引和更新文件。还授予对更新映射操作的访问权限
create 索引文件。还授予对更新映射操作的访问权限
delete 删除文件
write 对文档执行所有写入操作的权限,包括索引,更新和删除文档以及执行批量操作的权限。还授予对更新映射操作的访问权限
delete_index 删除索引
create_index 创建索引。创建索引请求可能包含在创建索引时添加到索引的别名。在这种情况下,该请求最好有manage权限,同时设置索引和别名
3.1 基于角色的权限控制
进入到web,找到Management/Security/ Roles,点击Create role
可以使这个roles关联给多个用户使用:
以上是创建了一个role权限只对索引data141拥有只读权限,下面创建普通用户wyy
可以对这个用户关联多个roles。至此创建了一个wyy的用户,只拥有一个read-only的权限,下面验证是否生效
3.2 登录验证
发现其他的模块,还有索引都不能查看