ELKB(Elasticsearch、Logstash、Kibana、Beat的组合)是一套开源的分布式日志管理方案。凭借其检索性能高效、集群线性扩展、处理方式灵活、配置简单易上手等特点,ELKB在最近几年迅速崛起,成为实时日志处理领域的首要选择。Elasticsearch作为其中重要的一环, 主要提供分布式、可扩展且实时的数据储存分析与搜索功能。随着Elasticsearch的广泛使用,为了做好数据共享、访问隔离,防止用户误操作、数据泄露等,权限控制方面的需求愈来愈多。
Elastic官方提供了安全插件X-Pack来解决Elasticsearch的权限管理问题,不足之处在于插件是收费的,且较为笨重。因此我们为Elasticsearch设计了一套权限系统。
我们基于Elasticsearch扩展能力开发Plugin,在REST层(用户访问接口) 和Transport层(内部访问接口)间进行权限校验。 在设计权限系统的接口和实现时,我们参考Elastic官方权限系统和MySQL权限系统设计,支持进行用户、机器白名单、权限管理等操作,风格和官方接口保持一致。权限元数据作为Elasticsearch元数据的一部分,由Elasticsearch托管。
Elasticsearch权限系统总体设计脑图如下:
GET \_auth/hosts
举个例子,在linux下使用curl 在root用户调用该接口(Elasticsearch端口为 localhost:9200):
curl -u root -XGET localhost:9200/\_auth/hosts?pretty
POST \_auth/host/{ip}
增加免密码访问的机器白名单
DELETE \_auth/host/{ip}
GET \_auth/users
返回当前已经存在的所有账户
POST \_auth/user/{user} -d '{
"password": "123456"
}'
创建一个空账号
DELETE \_auth/user/{user}
删除该用户以及其下面的所有规则
PUT \_auth/password/{user} -d '{
"password": "123456"
}'
特别说明:如果请求认证已经提供用户名,那么 _auth/password/{user}可以省略为 _auth/password
GET \_auth/grant/{user}
特别说明:如果请求认证已经提供用户名,那么 _auth/grant/{user}可以省略为 _auth/grant
POST \_auth/grant/{user} -d '{
"index": "logstash\_\*", // 针对的index名,支持通配符\*,一次仅允许填写一个,非空
"privileges": "read,write", // 对该index可行使的权限,非空
"kibana": "monitor" // kibana访问该index时相关的权限,可选
}'
privileges 填写说明:
kibana填写说明:
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层的用户访问接口,赋予用户的权限也比较简单。丰富这一块是后续计划之一。后续我们也将根据用户的需求和反馈对权限系统做进一步的优化。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。