使用nginx lua对elasticsearch权限控制

想法:

呵呵,最近还真有些迷恋Elasticsearch DSL语法了,尤其他那设计起来很有道理的RESTful API !

虽然几年前也折腾elasticsearch,但更多的是应付事,当时找了一堆DSL语句来回的套用。 现在我这边正在开发一个应用监控系统,包含各种报表及业务各种趋势展现。随着监控系统的上线,从以前的mysql,慢慢转义到elasticsearch。其他项目现在越来越多的功能都依赖于elasticsearch。 话说很是喜欢他的aggs聚合计算,十分的方便统计出某个时间区间,某个时间间隔,经过query后的聚合结果。

但是对于elasticsearch做数据存储来说,我个人认为最大的遗憾就是权限的控制,更准确的来说是行为的控制。 

文章后续会有更新,但总是被没打招呼的转走,标注下nginx lua elasticsearch权限控制的原文地址, http://xiaorui.cc/2015/11/05/%E4%BD%BF%E7%94%A8nginx-lua%E5%AF%B9elasticsearch%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6/


今天做完数据核对后本打算把脏数据给删掉。结果用postman来操控elasticsearch的时候,忘了加索引id,本来就想根据条件来删掉几条数据,结果sb把doc-type都给干没了。还好是个测试的环境。  我以前写过一篇文章专门陈述了如何针对elasticsearch做权限控制。  这次专门说下如何利用nginx本身做一些es的权限控制, 另外我们用lua控制更细的控制。  nginx自带的一些变量和语法很是简陋,不支持嵌套if,不支持if  and  or,不支持运算。  所以最优的选择是利用nginx lua来控制, 可以进行基本的违规操作过滤,多用户的权限控制,细度可以到cookie token等等。 

这里先说下nginx 全局变量控制elasticsearch权限。

这是最粗暴的控制,不允许直接delete删除index或者type。如果你是 curl -XDELETE http://xiaorui.cc:9000/index_name/type_name ,nginx 会返回给你403 code。

# http://xiaorui.cc

if (request_method = DELETE ) {

        setflag "{flag}1";

}
if (request_uri !~ "_query" ) {

        set flag "{flag}2";

}
if ($flag = "12"){

         return 403;

}

注视下nginx的语法

nginx不支持if and和多层嵌套if

如果你想多层嵌套IF或者if elseif else。请使用nginx lua。

下面是nginx常用的内置变量,可以充分利用起来….  记得以前在腾讯打杂的时候,还总是天天折腾这些内置变量,用这些仅有的东西,来写不简单的逻辑判断。都是坑比的事情。 

$arg_PARAMETER 这个变量包含在查询字符串时GET请求PARAMETER的值。
$args 这个变量等于请求行中的参数。
$binary_remote_addr 二进制码形式的客户端地址。
$body_bytes_sent 传送页面的字节数
$content_length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$cookie_COOKIE cookie COOKIE的值。
$document_root 当前请求在root指令中指定的值。
$document_uri 与$uri相同。
$host 请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称。
$is_args 如果$args设置,值为"?",否则为""。
$limit_rate 这个变量可以限制连接速率。
$nginx_version 当前运行的nginx版本号。
$query_string 与$args相同。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。
$request_body 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。
$request_body_file 客户端请求主体信息的临时文件名。
$request_completion 未知。
$request_method 这个变量是客户端请求的动作,通常为GET或POST。包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。
$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。
$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$uri 请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。

写了半天才写到nginx lua防御elasticsearch…. 实在惭愧….  其实我本来想丰富下nginx lua的相关文档。 google了好几篇,感觉写的没深度,但是例子很丰富….  最后通过那粗狂的病句,才知道是我写的文章,只是被爬走了罢了。 有时间我会把以前的nginx lua文章都总结一下。 

location @client{
proxy_pass  http://www.xiaorui.cc;
}
location ~  / {
default_type  text/html;
content_by_lua 'ngx.say("this is  xiaorui.cc!")';
access_by_lua '
if ngx.var.request_method == "DELETE" then
	if ngx.re.match(ngx.var.request_uri, "_query")  then
		ngx.exec("@client")
	else
		ngx.exit(ngx.HTTP_FORBIDDEN)
	end
end

';
}



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

发表评论

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