Current state of affairs

  • SSL support was added in version 4.2 (SolrCloud v4.7).

  • Protection of Zookeeper content through ACLs was added in version 5.0
  • Authentication and Authorization plugin support was added in 5.2 (SolrCloud only)

  • Basic Auth & Kerberos plugins and Rule-based Authorization plugin was added in 5.3

There is (as of 5.3) no role-based restrictions on the Admin UI, so be aware that anyone with access to Admin UI will be able to do anything with your system.

Need for firewall

Even though you add SSL or Authentication plugins, it is still strongly recommended that the application server containing Solr be firewalled such the only clients with access to Solr are your own. A default/example installation of Solr allows any client with access to it to add, update, and delete documents (and of course search/read too), including access to the Solr configuration and schema files and the administrative user interface.

If there is a need to provide query access to a Solr server from the open internet, it is highly recommended to use a proxy, such as one of these.

Cross-Site Scripting (XSS)

Solr has no known cross-site scripting vulnerabilities.

Quick XSS tip:

Problem: What if you want the browser to highlight text, but you also want to protect yourself from XSS and escape the HTML output? Solution: One solution is to escape the HTML output and then reapply the em tags. Now the rest of the snippet is safe and the browser will recognize the highlighted text.

For example, with groovy/grails you could have the following in your controller:

snippet = snippet.encodeAsHTML()
snippet = snippet.replaceAll('&lt;em&gt;', '<em>')
snippet = snippet.replaceAll('&lt;/em&gt;', </em>)

Cross-Site Request Forgery (CSRF)

Even if a Solr instance is protected by good firewalls so that "bad guys" have no direct access, that instance may be at risk to potential "Cross-Site Request Forgery" based attacks if the following are all true:

  1. Some number of "good guys" have direct access to that Solr instance from their web browsers.
  2. A "bad guy" knows/guesses the host:port/path of the Solr instance (even though they can not access it directly)
  3. The bad guy can trick one of the good guy into clicking a maliciously crafted URL, or loading a webpage that contains malicious javascript.

This is because Solr's most basic behavior is to receive updates and deletes via HTTP. If you have a firewall or other security measure restricting Solr's /update handler so it only accepts connections from approved hosts/clients, but you are approved then you could inadvertently be tricked into loading a web page that initiates an HTTP Connection to Solr on your behalf.

It's important to keep this in mind when thinking about what it means to "secure" an instance of Solr (if you have not already).

A basic technique that can be used to mitigate the risk of a possible CSRF attack like this is to configure your Servlet Container so that access to paths which can modify the index (ie: /update, /update/csv, etc...) are restricted either to specific client IPs, or using HTTP Authentication.

Document Level Security

Manifold CF (Connector Framework)

One way to add document level security to your search is through Apache ManifoldCF. ManifoldCF "defines a security model for target repositories that permits them to enforce source-repository security policies".

It works by adding security tokens from the source repositories as metadata on the indexed documents. Then, at query time, a Search Component adds a filter to all queries, matching only documents the logged-in user is allowed to see. ManifoldCF supports AD security out of the box.

Write Your Own RequestHandler or SearchComponent

*Stub - this is incomplete*

If ManifoldCF does not solve your need, first consider writing a ManifoldCF plugin. Or roll your own.

If you need permission based authentication -- where user A can update document 1 and 2, but not 3 -- you will need to augment the request with user information. Either you can add parameters to the query string (?u=XXX&p=YYY) or use a custom dispatcher filter that augments the context:

public class CustomDispatchFilter extends SolrDispatchFilter
{
@Override
protected void execute( HttpServletRequest req, SolrRequestHandler handler, SolrQueryRequest sreq, SolrQueryResponse rsp)
{
// perhaps the whole request
sreq.getContext().put( "HttpServletRequest", req ); // or maybe just the user
sreq.getContext().put( "user", req.getRemoteUser()); core.execute( handler, sreq, rsp );
}
} public class AuthenticatingHandler extends RequestHandlerBase
{
@Override
public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { HttpServletRequest httpreq = (HttpServletRequest)
req.getContext().get( "HttpServletRequest" ); if( httpreq.isUserInRole( "editor" ) ) {
...
} String user = (String)req.getContext().get( "user" );
...
}
...
}

Streaming Consideration

If streaming is enabled, you need to make sure Solr is as secure as it needs to be. When streaming is enabled, the parameters "stream.url" will go to a remote site and download the content. Likewise, "stream.file" will read a file on disk.

Streaming is disabled by default and is configured from solrconfig.xml

 <requestParsers enableRemoteStreaming="false" ... />

在Tomcat6增加 Solr的访问权限方法如下:

编辑tomcat6/Catalina/localhost/solr.xml

<Context docBase="/var/solr/solr.war" debug="" privileged="true" allowLinking="true" crossContext="true">

<Environment name="solr/home" type="java.lang.String" value="/var/solr" override="true"/>

<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.1.100,localhost,192.168.1.103,127.0.0.1"/>

<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="192.168.1.105"/>

</Context>

可参考Tomcat配置文档:http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html#Remote_Address_Filter

要使上面的配置生效,还需要重新开启tomcat的安全机制

编辑sudo vi /etc/default/tomcat6

注释掉最后一句TOMCAT6_SECURITY=no

参考:

http://www.cnblogs.com/ibook360/archive/2011/11/07/2239247.html

http://wiki.apache.org/solr/SolrSecurity

最新文章

  1. django-- Models
  2. 关于SpeedButton中使用下划线快捷键不响应的问题
  3. 一、PBNI环境搭建及初步使用
  4. CentOS Git的还原和操作
  5. Linux的启动过程
  6. 用类求圆面积c++
  7. POJ 3744 【矩阵快速幂优化 概率DP】
  8. evaluateScript--evaluatePopoverScript--区别
  9. java学习面向对象之抽象类
  10. Google Map API 学习2-界面展示
  11. 设置IE兼容模式
  12. 04-UIKit(UINavigationController、NSAttributeString、UIImageView)
  13. jquery-easyui界面皮肤设计
  14. K60 启动过程分析
  15. [翻译]用Dart塑造Android未来
  16. sed awk 小例
  17. 函数之return
  18. 6、投资的一些思考 - CEO之公司管理经验谈
  19. BZOJ3033太鼓达人——哈密顿回路/欧拉回路
  20. Python--Virtualenv简明教程(转载https://www.jianshu.com/p/08c657bd34f1)

热门文章

  1. C#编程总结 字符转码
  2. eval 与 Function
  3. 【iCore3 双核心板】例程十:RTC实时时钟实验——显示日期和时间
  4. Java - Collection 高效的找出两个List中的不同元素
  5. alloc
  6. JavaScript 代码 优化笔记
  7. 微信公众平台开发(26) ACCESS TOKEN
  8. 使用CMD命令设置IP
  9. Java基础之扩展GUI——使用字体对话框(Sketcher 5 displaying a font dialog)
  10. 湖大OJ-实验C----NFA转换为DFA