转 Shield Your Kibana Dashboards

简介:

You work with sensitive data in Elasticsearch indices that you do not want everyone to see in their Kibana dashboards. Like a hospital with patient names. You could give each department their own Elasticsearch cluster in order to prevent all departments to see the patient's names, for example.

But wouldn't it be great if there was only one Elasticsearch cluster and every departments could manage their own Kibana dashboards? And still have the security in place to prevent leaking of private data?

With Elasticsearch Shield, you can create a configurable layer of security on top of your Elasticsearch cluster.In this article, we will explore a small example setup with Shield and Kibana.

In this article, we'll use Elasticsearch 1.4.4, Shield 1.0.1 and Kibana 4.0.0. These are at the time of writing the most-recent  versions. Beginner knowledge of Elasticsearch is expected.

Suppose we want to keep our patient’s names private. An index of patients will be available only for one department. An index of cases will be available to all departments.

First, we'll add some test data to the cluster. Create a file hospital.json with the following content:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"index"  : {  "_index"  "cases" "_type"  "case" "_id"  "101"  } }
"admission"  "2015-01-03" "discharge"  "2015-01-04" "injury"  "broken arm"  }
"index"  : {  "_index"  "cases" "_type"  "case" "_id"  "102"  } }
"admission"  "2015-01-03" "discharge"  "2015-01-06" "injury"  "broken leg"  }
"index"  : {  "_index"  "cases" "_type"  "case" "_id"  "103"  } }
"admission"  "2015-01-06" "discharge"  "2015-01-07" "injury"  "broken nose"  }
"index"  : {  "_index"  "cases" "_type"  "case" "_id"  "104"  } }
"admission"  "2015-01-07" "discharge"  "2015-01-07" "injury"  "bruised arm"  }
"index"  : {  "_index"  "cases" "_type"  "case" "_id"  "105"  } }
"admission"  "2015-01-08" "discharge"  "2015-01-10" "injury"  "broken arm"  }
"index"  : {  "_index"  "patients" "_type"  "patient" "_id"  "101"  } }
"name"  "Adam" "age"  28  }
"index"  : {  "_index"  "patients" "_type"  "patient" "_id"  "102"  } }
"name"  "Bob" "age"  45  }
"index"  : {  "_index"  "patients" "_type"  "patient" "_id"  "103"  } }
"name"  "Carol" "age"  34  }
"index"  : {  "_index"  "patients" "_type"  "patient" "_id"  "104"  } }
"name"  "David" "age"  14  }
"index"  : {  "_index"  "patients" "_type"  "patient" "_id"  "105"  } }
"name"  "Eddie" "age"  72  }

Then bulk index these documents in the cluster:

?
1
$ curl -X POST  'http://localhost:9200/_bulk'  --data-binary @. /hospital .json

Without security, every user can access all documents. Let's install Shield to add security.

Directions on how to install Shield can be found at the Elasticsearch website . We will do this step by step.

Shield is a commercial product, so first we need to install the license manager:

?
1
2
3
4
5
$ elasticsearch /bin/plugin  -i elasticsearch /license/latest
-> Installing elasticsearch /license/latest ...
Trying http: //download .elasticsearch.org /elasticsearch/license/license-latest .zip...
Downloading .....................................DONE
Installed elasticsearch /license/latest  into  /home/patrick/blog/elasticsearch/plugins/license

Now install Shield itself in the same manner:

?
1
2
3
4
5
$ elasticsearch /bin/plugin  -i elasticsearch /shield/latest
-> Installing elasticsearch /shield/latest ...
Trying http: //download .elasticsearch.org /elasticsearch/shield/shield-latest .zip...
Downloading .....................................DONE
Installed elasticsearch /shield/latest  into  /home/patrick/blog/elasticsearch/plugins/shield

You will need to restart the nodes of your cluster to activate the plugins.

In the logs of Elasticsearch you'll see some messages from the new plugins:

?
1
2
3
4
5
6
7
8
9
[2015-02-12 08:18:01,347][INFO ][shield.license ] [node0] enabling license  for  [shield]
[2015-02-12 08:18:01,347][INFO ][license.plugin.core ] [node0] license  for  [shield] - valid
[2015-02-12 08:18:01,355][ERROR][shield.license ] [node0]
#
# Shield license will expire on [Saturday, March 14, 2015]. Cluster health, 
# cluster stats and indices stats operations are blocked on Shield license expiration.
# All data operations (read and write) continue to work. If you have a new license,
# please update it. Otherwise, please reach out to your support contact.
#

Notice that you will get a 30-day trial period to experiment with Shield. Now all our data is protected. See what happens when we try to get a document:

?
1
2
3
4
5
6
$ curl localhost:9200 /cases/case/101 ?pretty= true
{
     "error"  : "AuthenticationException[missing authentication token 
               for  REST request [ /cases/case/1 ]]",
     "status"  : 401
}

We need to add some roles and users to configure the role-based access control of Shield. First we define the roles and their privileges. The definition of these are found in the elasticsearch/config/shield/roles.yml file. Some roles, like admin and user are predefined:

?
1
2
3
4
5
6
7
8
9
10
# All cluster rights
# All operations on all indices
admin:
   cluster: all
   indices:
     '*' : all
# Read-only operations on indices
user:
   indices:
     '*' : read

Let's edit this roles.yml file to describe our needs. We do not want for every user to access all indices, so we'll change user.indices . We'll add the two roles needed for our organization: doctor and nurse. A doctor has more privileges than a nurse. Doctors can access all indices. Nurses can only access the cases index:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Read-only operations on indices
#user:
#  indices:
#     '*' : read
 
# Doctors can access all indices
doctor:
   indices:
     '*' : read
 
# Nurses can only access the cases index
nurse:
   indices:
     'cases' : read

Now that the roles are defined, we can create users that have these roles. Shield provides three realms to store the users: an internal realm, LDAP or Active Directory. For now, we use the internal realm. The realm is configured in elasticsearch/config/elasticsearch.yml . If nothing is explicitly configured, the internal realm is used.

To add users the esusers command line tool can be used. Let's create two users (both with abc123 as password), one for each role:

?
1
2
$ elasticsearch /bin/shield/esusers  useradd  alice -r nurse
$ elasticsearch /bin/shield/esusers  useradd  bob -r doctor

Just to check if the security works:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ curl --user alice:abc123 localhost: 9200 /_count?pretty= true
{
   "count"  5 ,
   "_shards"  : {
     "total"  1 ,
     "successful"  1 ,
     "failed"  0
   }
}
 
$ curl --user bob:abc123 localhost: 9200 /_count?pretty= true
{
   "count"  10 ,
   "_shards"  : {
     "total"  2 ,
     "successful"  2 ,
     "failed"  0
   }
}

Alice can see the 5 cases in our cases index. Bob can see those 5 cases plus the 5 patients in the patients index.

Now it's time to add Kibana in the mix. Instructions to download and install Kibana 4 can be found on the Elasticsearch website.

When we start the Kibana server we notice that Kibana is not allowed access to the Elasticsearch cluster:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ kibana /bin/kibana
{
     "@timestamp" "2015-02-26T08:24:48.958Z" ,
     "level" "fatal" ,
     "message" "AuthenticationException[missing authentication token for REST request [/.kibana/config/_search]]" ,
     "node_env" "production" ,
     "error" : {
         "message" "AuthenticationException[missing authentication token for REST request [/.kibana/config/_search]]" ,
         "name" "Error" ,
         "stack" : "Error: AuthenticationException[missing authentication token  for  REST request [/.kibana /config/_search ]] 
                  at respond ( /home/patrick/kibana/src/node_modules/elasticsearch/src/lib/transport .js:235:15)
                  at checkRespForFailure ( /home/patrick/kibana/src/node_modules/elasticsearch/src/lib/transport .js:203:7)
                  at HttpConnector. ( /home/patrick/kibana/src/node_modules/elasticsearch/src/lib/connectors/http .js:156:7)
                  at IncomingMessage.bound ( /home/patrick/kibana/src/node_modules/elasticsearch/node_modules/lodash-node/modern/internals/baseBind .js:56:17)
                  at IncomingMessage.emit (events.js:117:20)
                  at _stream_readable.js:944:16
                  at process._tickCallback (node.js:442:13)"
     }
}

We need to tell Shield that Kibana is allowed to access our cluster. Extra information of how to let Kibana work with Shield can be found in the Elasticsearch guide .

Shield is shipped with a default configuration for Kibana 4. We find the following role definition in elasticsearch/config/shield/roles.yml.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# The required role for kibana 4 users
kibana4:
   cluster: cluster:monitor /nodes/info
   indices:
     '*' :
       - indices:admin /mappings/fields/get
       - indices:admin /validate/query
       - indices:data /read/search
       - indices:data /read/msearch
       - indices:admin /get
     '.kibana' :
       - indices:admin /exists
       - indices:admin /mapping/put
       - indices:admin /mappings/fields/get
       - indices:admin /refresh
       - indices:admin /validate/query
       - indices:data /read/get
       - indices:data /read/mget
       - indices:data /read/search
       - indices:data /write/delete
       - indices:data /write/index
       - indices:data /write/update

When the Kibana Server starts it needs to access the .kibana index. So we need to create a user in Shield for Kibana to connect with:

?
1
$ elasticsearch /bin/shield/esusers  useradd  kibana -r kibana4

This account must be configured in Kibana. Modify kibana/conf/kibana.yml :

?
1
2
3
4
5
6
7
8
9
10
11
12
# If your Elasticsearch is  protected  with basic auth,  this  is the user credentials
# used by the Kibana server to perform maintence on the kibana_index at statup. Your Kibana
# users will still need to authenticate with Elasticsearch (which is proxied thorugh
# the Kibana server)
kibana_elasticsearch_username: kibana
kibana_elasticsearch_password: abc123
 
#----------------------------------------------------------------------------
# In newly version of ElasticSearch  2.1 . 0 , you have to use the following way:
elasticsearch.username: kibana
elasticsearch.password: abc123
#----------------------------------------------------------------------------

The Kibana users must have the kibana4 role to be able to work with Kibana. They must be able to store their visualizations and dashboards in the .kibana index:

?
1
2
$ elasticsearch /bin/shield/esusers  roles alice -a kibana4
$ elasticsearch /bin/shield/esusers  roles bob -a kibana4

Since the default kibana4 role has read access on all indices, alice and bob will be granted all access on all indices. Therefore the role permissions must be modified:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Doctors can access all indices
doctor:
   indices:
     'cases,patients' :
       - indices:admin/mappings/fields/get
       - indices:admin/validate/query
       - indices:data/read/search
       - indices:data/read/msearch
       - indices:admin/get
       
# Nurses can only access the cases index
nurse:
   indices:
     'cases' :
       - indices:admin/mappings/fields/get
       - indices:admin/validate/query
       - indices:data/read/search
       - indices:data/read/msearch
       - indices:admin/get
       
# The required role  for  kibana  4  users
kibana4:
   cluster:
       - cluster:monitor/nodes/info
       - cluster:monitor/health
   indices:
     '.kibana' :
       - indices:admin/exists
       - indices:admin/mapping/put
       - indices:admin/mappings/fields/get
       - indices:admin/refresh
       - indices:admin/validate/query
       - indices:data/read/get
       - indices:data/read/mget
       - indices:data/read/search
       - indices:data/write/delete
       - indices:data/write/index
       - indices:data/write/update
       - indices:admin/create

With this configuration any user with the kibana4 role is able to use Kibana but only sees data that he or she has the proper clearance for.

We can now start the Kibana Server and see that it runs as it should:

?
1
2
3
4
5
6
7
$ kibana /bin/kibana
{
     "@timestamp" "2015-02-26T08:53:18.961Z" ,
     "level" "info" ,
     "message" "Listening on 0.0.0.0:5601" ,
     "node_env" "production"
}

We can open a browser and head to localhost:5601 to open the Kibana web interface. Log in as Alice:

After logging in, Kibana will ask for the index pattern. We'll keep it simple:

Then in the discover tab you can add fields to your view. Notice that Alice only sees cases:

When we log in as Bob our discover tab shows both cases and patients:

To summarize: we added security to Elasticsearch with Shield and configured some users and roles. There's nothing more to it!



原文地址:http://blog.trifork.com/2015/03/05/shield-your-kibana-dashboards/

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
目录
相关文章
|
Java API 网络架构
深入理解并实践响应式编程(Reactive Programming)
深入理解并实践响应式编程(Reactive Programming)
1252 83
|
机器学习/深度学习 存储 程序员
C语言编辑器
C语言编辑器
1068 0
|
Kubernetes 应用服务中间件 调度
kubernetes最小调度单元pod详解(一)
kubernetes最小调度单元pod详解(一)
459 0
|
Ubuntu Linux
Linux(Ubuntu)系统临时IP以及静态IP配置(关闭、启动网卡等操作)
请注意,以上步骤是在临时基础上进行配置的。如果要永久保存静态IP地址,通常还需要修改 `/etc/network/interfaces`文件,以便在系统重启后保持配置。同时,确保备份相关配置文件以防止出现问题。
2061 1
|
消息中间件 JSON NoSQL
Redis深度解析:核心数据类型之hash、list、set
Redis深度解析:核心数据类型之hash、list、set
【多线程面试题 三】、 run()和start()有什么区别?
run()方法定义线程执行的任务,而start()方法启动线程,使得run()在新的线程中异步执行;直接调用run()方法只会同步执行run()中的代码,不会创建新线程。
|
机器学习/深度学习 传感器 安全
2023 年高教社杯E题黄河水沙监测数据分析思路及代码(持续更新)
2023 年高教社杯E题黄河水沙监测数据分析思路及代码(持续更新)
|
存储 负载均衡 Java
Java开发中应对海量数据的分库分表方案探究
在实际的Java开发中,当面临海量数据存储和处理的情况时,单一数据库可能无法满足性能和扩展需求。这时,分库分表方案成为一种常用的解决方案。本文将介绍分库分表的基本概念,并探究其在Java开发中的具体应用和实践。
523 0
|
Web App开发 Java 程序员
全方位测评|M1 这款小小芯片真的全面领跑顶配 i9 Mac 嘛?你想知道的我都告诉你...
大家好,我是小羽。我一直觉得一个东西好不好用,并不是由自己说了算的,也不是别人说了算的,而应该是大多数人用了之后,觉得很不错,那它就是一件好东西。今天小羽除了介绍 M1 芯片的 Mac 的...
1571 0
|
存储 负载均衡 Cloud Native
Nacos注册中心概述、服务注册、分级存储模型及环境隔离
Nacos注册中心概述、服务注册、分级存储模型及环境隔离
608 0