Elasticsearch最佳实践之自研权限系统

一、背景

     ELKB(Elasticsearch、Logstash、Kibana、Beat的组合)是一套开源的分布式日志管理方案。凭借其检索性能高效、集群线性扩展、处理方式灵活、配置简单易上手等特点,ELKB在最近几年迅速崛起,成为实时日志处理领域的首要选择。Elasticsearch作为其中重要的一环, 主要提供分布式、可扩展且实时的数据储存分析与搜索功能。随着Elasticsearch的广泛使用,为了做好数据共享、访问隔离,防止用户误操作、数据泄露等,权限控制方面的需求愈来愈多。

     Elastic官方提供了安全插件X-Pack来解决Elasticsearch的权限管理问题,不足之处在于插件是收费的,且较为笨重。因此我们为Elasticsearch设计了一套权限系统。

二、权限系统总体设计

     我们基于Elasticsearch扩展能力开发Plugin,在REST层(用户访问接口) 和Transport层(内部访问接口)间进行权限校验。 在设计权限系统的接口和实现时,我们参考Elastic官方权限系统和MySQL权限系统设计,支持进行用户、机器白名单、权限管理等操作,风格和官方接口保持一致。权限元数据作为Elasticsearch元数据的一部分,由Elasticsearch托管。

    Elasticsearch权限系统总体设计脑图如下:

添加描述

三、权限接口用法介绍

1 . 查看机器白名单

GET \_auth/hosts

举个例子,在linux下使用curl 在root用户调用该接口(Elasticsearch端口为 localhost:9200):

curl -u root -XGET localhost:9200/\_auth/hosts?pretty

2. 增加机器白名单

POST \_auth/host/{ip}

增加免密码访问的机器白名单

3. 删除机器白名单

DELETE \_auth/host/{ip}

4. 查看用户列表

GET \_auth/users

返回当前已经存在的所有账户

5. 创建用户

POST \_auth/user/{user} -d '{

 "password": "123456"

}'

创建一个空账号

6. 删除用户

DELETE \_auth/user/{user}

删除该用户以及其下面的所有规则

7. 修改用户密码

PUT \_auth/password/{user} -d '{

 "password": "123456"

}'

特别说明:如果请求认证已经提供用户名,那么 _auth/password/{user}可以省略为 _auth/password

8.查看某个用户权限

GET \_auth/grant/{user}

特别说明:如果请求认证已经提供用户名,那么 _auth/grant/{user}可以省略为 _auth/grant

9.赋予某个用户权限

POST \_auth/grant/{user}  -d '{

 "index": "logstash\_\*",               // 针对的index名,支持通配符\*,一次仅允许填写一个,非空

 "privileges": "read,write",     // 对该index可行使的权限,非空

 "kibana": "monitor"    // kibana访问该index时相关的权限,可选

}'

privileges 填写说明:

  • read:只读权限;
  • wrirte:只写权限;
  • manage:读写index并对index进行管理的权限,例如创建和删除;
  • admin: root用户权限,可对所有index进行管理,要求index必须为*

kibana填写说明:

  • monitor:kibana访问时的只读权限;
  • admin:kibana访问时的读写权限

10.撤销某个用户权限

DELETE \_auth/grant/{user}  -d '{

 "index": "index1",

 "privileges": "read",

 "kibana": "monitor/admin"

}'

特别说明:撤销权限必须针对已存的权限进行撤销,不可撤销某个权限的子权限,如果某个index的privileges为空,那么这个index的规则就会被删除

四、性能测试

     为了保证权限的正常使用,我们针对以上每个权限接口设计了大量单元测试和集成测试,并对系统的性能也做了测试,在Elasticsearch 5.0.0版本下安装权限系统前后 运行100次测试然后取平均结果对比如下:

平均写入速度(条/秒)

平均查询并发数(次/秒)

未安装权限系统

224636

28100

安装权限系统

220759

27950

权限系统的性能影响约为1%左右,符合预期。

五、后续计划

     目前我们的权限系统只提供了REST层的用户访问接口,赋予用户的权限也比较简单。丰富这一块是后续计划之一。后续我们也将根据用户的需求和反馈对权限系统做进一步的优化。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小工匠技术圈

【Java小工匠】JavaNIO-基础概念

阻塞与非阻塞主要是程序等待消息通知时的状态角度来说的。阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。

8330
来自专栏IMWeb前端团队

wamp修改空密码以及设置虚拟站点

近来重装了一下wamp,索性记录一下,wamp安装完后,我的常用配置。首先,肯定要修改默认的空密码;其次,便要配置虚拟站点,因为当项目多的时候,每个项目分配成一...

207100
来自专栏java工会

java网站页面静态化方案

在大型网站中,如京东和当当商品详情界面,看到的页面基本上是静态页面。为什么都要把页面静态化呢?把页面静态化,好处有很多。例如:访问速度快,更有利于搜索引擎收录等...

20340
来自专栏腾讯移动品质中心TMQ的专栏

手机管家PiTest插件辅助测试方法分享

背景 你是否遇到过这样的测试场景: 垃圾需要达到2G! Wifi必要有有风险! CPU占用率达到70%以上! 日流量使用占用套餐的一半! 你的QQ必须要有风险...

21360
来自专栏木头编程 - moTzxx

小程序 报错 errcode: 40029, errmsg: "invalid code, hints: [ req_id: HQd79a0747th31 ]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

2.7K40
来自专栏编程微刊

本地运行github上的vue2.0仿饿了么webapp项目

在vue刚刚开始流行的时候,大多数人学习大概都见到过这样的一个项目吧,可以作为学习此框架的一个模板了

49130
来自专栏张善友的专栏

系统进程管理工具Process Explorer

系统进程往往是不少读者操作的“禁区”,其实借助一些功能强大的工具即可消除对该禁区的恐惧。Process Explorer就是一款系统进程管理工具,它不仅能方便地...

26270
来自专栏架构师之路

群消息这么复杂,怎么能做到不丢不重?

【需求缘起】 之前的文章更多的聊了单对单的消息投递: 《微信为什么不丢消息?》 《http如何像tcp一样实时的收消息?》 群聊是多人社交的基本诉求,不管是Q...

44570
来自专栏腾讯云数据库团队的专栏

Elasticsearch 自研权限系统介绍

     ELKB(Elasticsearch、Logstash、Kibana、Beat的组合)是一套开源的分布式日志管理方案。凭借其检索性能高效、集群线性...

42200
来自专栏腾讯云服务器团队的专栏

腾讯云 CVM 标签实践分享

腾讯云主机 CVM 目前也已经接入标签的功能,且相应的 CAM 能力也已经支持。本文将模拟实际用户场景来做一个实践分享。

11.4K340

扫码关注云+社区

领取腾讯云代金券