使用tornado实现elasticsearch的权限控制

前言:

    公司的应用监控平台又要有所变动了,准备把opentsdb给剔除,改用elasticsearch后端存储。去掉opentsdb的原因很简单,因为在数据量大的时候,hbase rowkey的效率达不到快速返回的需求,尤其针对聚合计算效率低。Opentsdb不支持二级索引,只有一个基于hbase rowkey的主索引,可以按行的排序顺序scan。这使得Opentsdb的tag实现从检索效率上说会很慢。


关于elasticsearch权限的文章,原文地址是 http://xiaorui.cc/2015/10/19/%E4%BD%BF%E7%94%A8tornado%E5%AE%9E%E7%8E%B0elasticsearch%E7%9A%84%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6/


有些跑题了,咱们回到es的访问控制…

elasticsearch官方没有什么好的权限控制,倒是有个商业版的Shield Shield是Elastic公司为ElasticSearch开发的一个安全插件。在安装此插件后,Shield会拦截所有对ElasticSearch的请求,并加上认证与加密,保障ElasticSearch及相关系统的安全性。 Shield是商业插件,需ElasticSearch的商业许可。第一次安装许可的时候,会提供30天的免费试用权限。30天后,Shield将会屏蔽cluster health, cluster stats, index stats这几个API,其余功能不受影响。总觉得shield这东西不是很靠谱…

查了下相关的资料,为elasticsearch有这么几种方法。

第一种,在nginx层面做基本验证,优点是及其的简单,缺点是他的权限控制有点粗,不能针对更细致的权限进行操作。或者可以用nginx lua的方式做auth扩展。  

第二种,直接用python tornado来做http代理。 在代理层面可以很好的控制黑白名单,及index、type名单。

使用htpasswd工具来创建用户,创建密码。 

htpasswd -c -d pass_file user_name

下面是nginx针对elasticsearch负载的配置

upstream elasticsearch {
    server 127.0.0.1:9200;
    keepalive 1500;
  }

location / {
          auth_basic             "Restricted";
          auth_basic_user_file   /etc/nginx/htpasswd;
  		  proxy_pass http://elasticsearch;
          proxy_redirect         off;
          proxy_set_header       Authorization ""; #避免代理weblogic重复提示认证问题 
          proxy_set_header       Host host;
          proxy_set_header       X-Real-IPremote_addr;
          proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header       X-Forwarded-Ssl on; 
}

那么对于第二种开发代理服务的方式,我们可以使用python下最适合做api的框架tornado。话说 ” tornado async httpclient ” 客户端非常适合做高性能的http代理。 我这边以前写了个项目,原本是用来做爬虫http代理服务的,现在倒是觉得很适合做elasticsearch的权限控制 ,但是现在缺少一些规则的过滤,比如字段、bulk批量,delete删除的控制。

https://github.com/rfyiamcool/toproxy

如果你用的是python下的elasticsearch模块,那么需要在创建es连接对象的时候,加入http_auth参数。

from elasticsearch import Elasticsearch
es = Elasticsearch(['localhost'], http_auth=('xiaorui.cc', 'xiaorui.cc'), port=9090)

另外logstash在elasticsearch做了权限控制后,配置文件也需要加入密码。

output {
  elasticsearch {
    protocol => "http"
    host => "localhost"
    index => "xiaorui"
    document_type => "monitor"
    template => "xiaorui.json"
    template_name => "xiaorui"
    user => "root"
    password => "xiaorui.cc"
  }
}



大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

1 Response

  1. feifeiiiiiiiiiii 2016年5月14日 / 下午11:39

    写个出来啊 让我forkfork

发表评论

邮箱地址不会被公开。 必填项已用*标注