集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack

简介

X-Pack 已经作为 Elastic 公司单独的产品线,前身是 Shield, Watcher, Marvel, Graph, 和 reporting,先来说说这几个爸爸是做什么的吧:

  • Shield: 提供对数据的 Password-Protect,以及加密通信、基于角色的权限控制,IP 过滤,审计,可以有效地:
    • 防止未授权的访问:基于 Password-Protect,基于角色的权限控制,IP过滤;
    • 保证数据的完整性:基于消息认证和 TLS/SSL 加密;
    • 审计跟踪:可以知道谁在什么时候对数据做了什么;
  • Watcher: 提供对数据操作的变更的监控和报警。
  • Marvel: 基于 Kibana 的插件,主要用于监控 ES 集群。可以看到集群的健康状况、实时的性能指标,分析历史集群、索引、节点的指标等。
  • Graph: 用于分析数据间的关系。
  • Reporting: 用于快速生成 Kibana Visualization 和 Dashboard 的报表,可以对生成的时间定制计划,并且可以由某些特定条件触发。

再来看看我们的儿子 X-Pack 是做啥的,哦,他就是他们的儿子,一个大合集,便于安装、不用为版本兼容性犯愁,可以灵活 disable / enable 其中的各个组件。他还多干了一件事儿,可以监控 Logstash。

关于免费和收费版本,版本功能比较可以查看:https://www.elastic.co/subscriptions

免费版本注册地址:https://register.elastic.co/xpack_register

付费版本(分为黄金、白金级别)购买地址:https://www.elastic.co/subscriptions/xpack

默认的免费版本有一个月的 trial 试用期。免费版本试用期只包含 ES 集群监控、图分析和可视化,基于角色的 ES 权限控制和搜索用户信息的功能。不包含:

  • 安全组件 Shield:
    • TLS/SSL加密;
    • LDAP的整合;
    • 日志审计;
    • 第三方的认证域整合;
  • 报警组件 Watcher;
  • 报表组件 Reporting;

总的来说免费版本对于安全组件这块什么都不支持。

呵呵呵呵

安装

安装 X-Pack 前必须安装 ES 和 Kibana ,我们使用的是 5.2.1 版本 集中式日志分析平台 - ELK Stack - 部署篇。X-Pack 我们也使用 5.2.1,我们来讲讲如何离线安装吧。

Step1. 下载 X-Pack Zip 文件:https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-5.2.1.zip (sha1),尼玛有119MB那么大。

Step2. 上传 zip 文件至服务器 /tmp 目录;

Step3. 在 ES 安装目录运行 bin/elasticsearch-plugin install 命令 :

bin/elasticsearch-plugin install file:/tmp/x-pack-5.2.1.zip

以下输出表示安装成功:

-> Downloading file:/home/admin/x-pack-5.2.1.zip
[=================================================] 100% 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission accessClassInPackage.com.sun.activation.registries
* java.lang.RuntimePermission getClassLoader
* java.lang.RuntimePermission setContextClassLoader
* java.lang.RuntimePermission setFactory
* 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
* javax.net.ssl.SSLPermission setHostnameVerifier
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
-> Installed x-pack

Step4. 在 Kibana 安装目录运行 bin/kibana-plugin install 命令安装:

bin/kibana-plugin install file:/tmp/x-pack-5.2.1.zip

以下输出表示安装成功:

Attempting to transfer from file:/home/admin/x-pack-5.2.1.zip
Transferring 124956667 bytes....................
Transfer complete
Retrieving metadata from plugin archive
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

Step5. 在 Logstash 安装目录运行 bin/logstash-plugin install 命令安装:

bin/logstash-plugin install file:/tmp/x-pack-5.2.1.zip

以下输出表示安装成功:

Installing file: /home/admin/x-pack-5.2.1.zip
Install successful

功能开关

我们可以通过以下配置进行功能开关:

Setting Description
xpack.security.enabled 设置为 false 可以关闭 X-Pack security 功能。需要在 elasticsearch.ymlkibana.yml 同时配置。
xpack.monitoring.enabled 设置为 false 可以关闭 X-Pack monitoring 功能。 需要在elasticsearch.ymlkibana.yml 同时配置。
xpack.graph.enabled 设置为 false 可以关闭 X-Pack graph 功能。 需要在elasticsearch.ymlkibana.yml 同时配置。
xpack.watcher.enabled 设置为 false 可以关闭 Watcher 功能。 只需要在 elasticsearch.yml 配置。
xpack.reporting.enabled 设置为 false 可以关闭 reporting 功能。 只需要在 kibana.yml 配置。

重启服务

我们需要重启三个服务:

./bin/logstash -f config/logstash.conf 2>&1 &
/home/admin/soft/elasticsearch-5.2.1/bin/elasticsearch &
./bin/kibana --verbose > kibana.log 2>&1 &

重启后发现日志数据无法上传到 ES,filebeat 报错:

2017-02-22T14:01:27+08:00 ERR Failed to publish events caused by: read tcp 172.16.134.3:56109->172.16.134.2:5044: i/o timeout

logstash 的 5044 端口可以访问,查看 logstash 日志:

[2017-02-22T14:02:21,705][WARN ][logstash.outputs.elasticsearch] UNEXPECTED POOL ERROR {:e=>#<LogStash::Outputs::ElasticSearch::HttpClient::Pool::NoConnectionAvailableError: No Available connections>}
[2017-02-22T14:02:21,705][ERROR][logstash.outputs.elasticsearch] Attempted to send a bulk request to elasticsearch, but no there are no living connections in the connection pool. Perhaps Elasticsearch is unreachable or down? {:error_message=>"No Available connections", :class=>"LogStash::Outputs::ElasticSearch::HttpClient::Pool::NoConnectionAvailableError", :will_retry_in_seconds=>64}

调用 ES 服务 curl http://172.16.134.2:9200

{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication token for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}

发现是出现了认证失败,笔者推算和 logstash 访问 ES 未以授权方式进行导致,修改 logstash.confoutput 段里添加:

user => 'elastic'
password => 'changeme'

修改 logstash.yml,添加:

xpack.monitoring.elasticsearch.url: "http://172.16.134.2:9200" 
xpack.monitoring.elasticsearch.username: "logstash_system" 
xpack.monitoring.elasticsearch.password: "changeme"

重启服务后OK。

功能使用

打开 Kibana 页面,笔者很尴尬,根本不知道用户名和密码是啥,OK 万能的谷歌告诉我们了:

username: elastic
password: changeme

Kibana 的界面多了如下几个功能跳转:Graph Monitoring elastic Logout

Graph

Graph 可以根据实时查询,对给定的 field 得到图视角的关联关系,笔者以一个快速发现集群中哪台 host 有明显 ERROR 为例讲解下如何使用。Index Pattern 我们选择 filebeat-*,我们添加 两个 filed:host log_level,然后在我们的搜索框添加 hour:14 AND minute: [20 TO 37] ,得到以下绘图:

Graph

可以直观的看到我们的两台被采集机器和日志级别的关系,v134003.yn1 INFO 日志较多,v134008.yn1 ERROR 日志较多。点击灰色的边,我们可以看到这个 Link 的概况:

Link Summary

有一个直观的包含交集图,还有3个数字,分别表示:

  • 1022 个文本中包含了 v134003.yn1 这个 term;
  • 986 个文本中同时包含了 v134003.yn1 和 INFO 这2个 term;
  • 2013 个文本中包含了 INFO 这个 term;

Monitoring(免费版本只支持单 ES 集群)

查看 ES 集群的 health:

ES Cluster Health
  • 集群级别:
    • Uptime : 集群运行时间;
  • 节点级别:
    • Disk Available:可用磁盘;
    • JVM Heap: JVM 使用情况;
  • 索引级别:
    • Indices:索引数量,相当于数据库数;
    • Documents:文档数量,相当于记录数;
    • Disk Usage:磁盘使用情况;
    • Primary Shards:分片数;
    • Replica Shards:冗余分片数;
Overview

相较于集群健康视图,这里的指标更多:

  • Serach Rate (/s):近1小时的查询速率,QPS;
  • Search Latency (ms):近1小时的查询延迟;
  • Index Rate (/s):近1小时的索引速率,IPS;
  • Index Latency (ms):近1小时的索引延迟;
  • Shard Activity:对于 Shard 的操作历史;
Indices

索引视角的监控视图,包含以下指标:

  • Document Count:文档数;
  • Data:数据量;
  • Index Rate:索引速率;
  • Search Rate:查询速率;
  • Unassigned Shards:未分配的分片数;

点击 Index Name 可以进入查看对于索引的详细基础监控:

  • Index Memory (KB):索引内存使用,分为 Lucene、Term、Points;
  • Index Size (MB):索引大小;
  • Search Rate (/s):查询速率;
  • Indexing Rate (/s):索引速率;
  • Segment Count:段数;
  • Document Count:文档数;
  • Shard Legend:分片状态图谱,分为 Primary, Replica,Relocating,Initializing,Unassigned Primary,Unassigned Replica 多个状态。

点击 Advanced 可以看到高级监控页面,请读者自己去感受下。

Nodes

节点监控,首先看到的是概述指标:

  • CPU Usage: CPU 使用率;
  • Load Average:CPU 平均负载;
  • JVM Memory:JVM 使用情况;
  • Disk Free Space:磁盘空闲空间;
  • Shards:分片数;

点击某个节点我们可以看到详细基础监控:

  • JVM Heap (GB):JVM 使用情况;
  • Index Memory (KB):索引占用内存;
  • CPU Utilization (%):CPU 使用率;
  • System Load:系统负载;
  • Latency (ms):延迟,分为索引和查询;
  • Segment Count:段数量;
  • Shard Legend:分片状态图谱, Primary, Replica,Relocating,Initializing多个状态。

基于角色的权限控制

该功能的入口在 Management -> Users/RolesUsers 可以方便的管理用户并且对其赋予角色,角色和权限挂钩。Roles 可以方便的管理角色,对其进行赋权。RolePermission 的集合,PermissionPrivilege 的集合,下面来说说权限:

  • 集群权限(Cluster Privilege);
  • Run As Privileges:可以使得新建角色拥有所选用户集的权限;
  • 索引权限(Index Privilege):
    • Indices:指定在哪些索引上赋权;
    • Privileges:指定赋予哪些权限;
    • Granted Documents Query(可选):指定在哪些 Query 上赋权;
    • Granted Fields(可选):指定在哪些 fields 上赋权;

其中,集群权限和索引权限的详细细分权限如下:

Cluster Privileges

权限类型 权限描述
all 所有群集管理操作,如快照,节点关闭/重新启动,设置更新,重新路由或管理用户和角色。
monitor 所有集群只读操作,如集群健康状态,热线程,节点信息,节点和集群统计信息,快照/恢复状态,挂起集群任务。
manage 构建在监视器上,并添加可更改集群中值的集群操作。这包括快照,已检查的设置和重新路由。此权限不包括管理安全性的能力。
manage_security 所有与安全性相关的操作,如对用户和角色的CRUD操作以及缓存清除。
manage_index_templates 对索引模板的所有操作。
manage_pipeline 对管道的所有操作。
transport_client 传输客户端连接所需的所有权限。

Indices Privileges

权限类型 权限描述
all 所有索引操作权限。
monitor 监控(恢复,细分信息,索引统计信息和状态)所需的所有操作。
manage 所有监视器权限和索引管理( aliases, analyze, cache clear, close, delete, exists, flush, mapping, open, force merge, refresh, settings, search shards, templates, validate
view_index_metadata 只读访问索引元数据(aliases, aliases exists, get index, exists, field mappings, mappings, search shards, type exists, validate, warmers, settings)。此权限主要供Kibana用户使用。
read 只读访问操作(count, explain, get, mget, get indexed scripts, more like this, multi percolate/search/termvector, percolate, scroll, clear_scroll, search, suggest, tv)。还授予对更新映射操作的访问权限。
index 索引和更新文档的权限。还授予对更新映射操作的访问权限。
create 索引文档的权限。还授予对更新映射操作的访问权限。
delete 删除文档的权限。
write 对文档执行所有写操作的权限,包括对文档进行索引,更新和删除以及执行批量操作的权限。还授予对更新映射操作的访问权限。
delete_index 删除索引的权限。
create_index 创建索引的权限。创建索引请求可能包含在创建后添加到索引的别名。在这种情况下,请求还要求在索引和别名名称上具有manage特权。

具体的 Privilege 可以参看:https://www.elastic.co/guide/en/x-pack/current/security-privileges.html

小结

本文主要介绍了安全解决方案 X-Pack 的概况、免费和收费版本的区别、部署步骤以及基本免费功能的使用。基于此,我们的结论是,对于企业级安全解决方案来说,免费版本的 X-Pack 的确力不从心,需要购买或者结合第三方免费插件进行安全方案升级。

Q&A

Q: 打开 Kibana 遇到 Login is disabled because your license has expired. Please extend your license or disable Security in Elasticsearch.
A: 说明体验的 x-pack 功能证书过期,需要 disable 之后才可以恢复使用,在 elasticsearch.yml 中添加:

xpack.security.enabled: false

推荐阅读更多精彩内容