我正在设置 Apache Solr 4.1,它将用于为 Web 应用程序索引数据。只有 Web 应用程序才有权访问 Solr。用户和其他客户端不会直接与 Solr 通信。
有哪些最佳实践可以保证此类 Solr 设置的安全?
(我们使用 Jetty 来运行 Solr)
答案1
我知道您正在使用 Jetty,但我有一种使用 Tomcat 的方法,该方法可行,下面将进行解释。
基本上,我已经放弃尝试去理解我认为 Java Web 应用程序在 Jetty 和 Tomcat 中保护自己的过于晦涩难懂的方式。所以我更愿意让 Apache 承担起第一道防线的重任。Apache 坚固可靠。如果你觉得需要额外的安全保护,你可以随时安装类似ModSecurity使其更加安全。
关键是在 Apache 中创建一个反向代理设置,如下所示。将代码放入将运行 Solr 的主机的 Apache 配置中。我喜欢让它在子目录中运行,因此此示例使用和设置/solr
作为示例。首先,这里是向 URL 添加尾部斜杠的设置,以便调用被转换为ProxyPass
ProxyPassReverse
http://my.server.is.great/solr
http://my.server.is.great/solr/
# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/(solr)$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
现在,下面介绍mod_proxy
将 Tomcat Web 应用程序路由到 Apache 前端的神奇方法。
# Settings for Solr in Apache
<IfModule mod_proxy.c>
# Proxy specific settings
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
</Proxy>
ProxyPass /solr http://localhost:8080/solr/
ProxyPassReverse /solr http://localhost:8080/solr/
</IfModule>
此时,我将重新启动 Apache 并查看是否有效。如果有效,那就太好了!现在最后一步是进入 Tomcat XML 文件并通过添加到连接器来限制 Solr 仅响应localhost
/127.0.0.1
请求。address="127.0.0.1"
<Connector port="8080" protocol="HTTP/1.1"
address="127.0.0.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
现在最后一部分?也许这就是您所需要的。也许您只是希望address="127.0.0.1"
将其改为需要访问的那台机器的机器 IP。但是您使用的是 Jetty,所以也许有一种等效的方法可以在 Jetty 中限制为一个 IP?或者您甚至可以在 Apache 配置中通过 IP 进行限制。无论哪种方式效果最好。