`
brandNewUser
  • 浏览: 456088 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Solr Web增加Basic安全性验证

阅读更多
 
Solr在5.0版本后,不再提供war包部署的方式,取而代之的是内置了jetty服务,
 
但是我们发现其中并没有内置任何安全性相关检查,任何人如果知道了我们的外网地址就能直接访问并修改其中的索引。经过查找可以使用jetty的方式来限制web访问。
 
solr/server/solr-webapp/WEB-INF/web.xml中增加以下字段:
 
 
<security-constraint>
    <web-resource-collection>
      <web-resource-name>solr</web-resource-name>
      <url-pattern>/</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>solr_admin</role-name>
      <role-name>admin</role-name>
    </auth-constraint>
 
    <login-config>
      <auth-method>BASIC</auth-method>
      <realm-name>Solr Admin</realm-name>
    </login-config>
  </security-constraint>
 
 
配置验证方式BASIC(用户名密码的方式)。
 
solr/server/etc/jetty.xml中增加Call标签:
 
<Call name="addBean">
      <Arg>
        <New class="org.eclipse.jetty.security.HashLoginService">
          <Set name="name">Solr Admin</Set>
          <Set name="config">
            /Users/mazhiqiang/develop/tools/solr-5.5.0/server/etc/realm.properties
          </Set>
          <Set name="refreshInterval">0</Set>
        </New>
      </Arg>
    </Call>
 
 
config中指定密码文件的路径,可以在其中使用<SystemProperty>来共同组合路径,例如配置了环境变量的情况下,可以使用下面的方式:
 
 
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
  
而指定的realm.properties就是相关密码文件了:
 
admin:xxxx,solr_admin
 
 
设置完成,重新启动solr即可,如果不输入用户名和密码,无法登陆成功:
 
 

 
 
注意该方法同样会影响HttpSolr连接以及SolrCloud连接,报出下面的错误:
 
 
{"code":500,"codeMsg":"Error from server at http://xxx:8983/solr/brand: Expected mime type application/octet-stream but got text/html. <html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n<title>Error 401 Unauthorized</title>\n</head>\n<body><h2>HTTP ERROR 401</h2>\n<p>Problem accessing /solr/brand/select. Reason:\n<pre>    Unauthorized</pre></p><hr><i><small>Powered by Jetty://</small></i><hr/>\n\n</body>\n</html>\n"}
 
 
我们可以使用简单验证的方式来测试一下:
 
 
URL url = new URL("http://xxxx:8983/solr/");
String encoding = Base64.encode("admin:xxxx".getBytes());
 
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setRequestProperty  ("Authorization", "Basic " + encoding);
InputStream content = (InputStream)connection.getInputStream();
BufferedReader in  =
        new BufferedReader (new InputStreamReader(content));
String line;
while ((line = in.readLine()) != null) {
    System.out.println(line);
}
  
如果加上credentials,是可以成功地将结果html打印出来,否则提示401(Unauthorized)错误。
 
此时使用SolrCloud的情况下,就不能用CloudSolrClient中内置的httpClient,而只能在外部声明并传入,顺带建立CredentialsProvider,用于Basic权限验证:
 
 
String zkHost = PropertiesUtil.getProperty("zkhost", PROPERTY_FILE_NAME);
String collection = PropertiesUtil.getProperty(collectionName.getConfigName(), PROPERTY_FILE_NAME);
int zkClientTimeout = StringUtils
      .parseInt(PropertiesUtil.getProperty("zkClientTimeout", PROPERTY_FILE_NAME));
int zkConnectTimeout = StringUtils
      .parseInt(PropertiesUtil.getProperty("zkConnectTimeout", PROPERTY_FILE_NAME));
 
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
        // 连接池最大连接数
        connManager.setMaxTotal(50);
        // 每个路由最大连接数
        connManager.setDefaultMaxPerRoute(20);
 
        // http请求配置信息
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(2000).setSocketTimeout(2000)
                .setConnectionRequestTimeout(500).setCookieSpec(CookieSpecs.STANDARD)
                .build();
 
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(new AuthScope(PropertiesUtil.getProperty("solrHost", PROPERTY_FILE_NAME),
                Integer.parseInt(PropertiesUtil.getProperty("solrPort", PROPERTY_FILE_NAME))),
                new UsernamePasswordCredentials(PropertiesUtil.getProperty("solrUserName", PROPERTY_FILE_NAME),
                        PropertiesUtil.getProperty("solrPassword", PROPERTY_FILE_NAME)));
 
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(requestConfig)
                .setConnectionManagerShared(true).setDefaultCredentialsProvider(credentialsProvider).build();
 
        CloudSolrClient cloudSolrClient = new CloudSolrClient(zkHost, httpClient);
 
 
此时就可以像以前一样正常查询了,注意在已经添加Credentials情况下,如果此时服务器不需要验证,也不会出错。 
 
对定时full/delta-import的影响
 
如果增加了安全校验,同样也会影响full-import, delta-import的执行,此时从solr.log日志中就可以拿到错误的信息:
 
2016-08-29 09:10:41.925 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Process started at .............. 29.08.2016 09:10:41 925
2016-08-29 09:10:41.948 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Full URL                      http://localhost:8983/solr/product/dataimport?command=delta-import&clean=false&commit=true
2016-08-29 09:10:41.958 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Response message                  Unauthorized
2016-08-29 09:10:41.958 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Response code             401
2016-08-29 09:10:41.986 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Disconnected from server              localhost
2016-08-29 09:10:41.986 INFO  (Timer-0) [   ] o.a.s.h.d.s.BaseTimerTask [product] <index update process> Process ended at ................ 29.08.2016 09:10:41 986
 
 
在full-import/delta-import的相关代码中,没有涉及到权限验证部分,直接使用http连接:
 
protected void sendHttpPost(String completeUrl, String coreName) {
  DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss SSS");
  Date startTime = new Date();
 
  // prepare the core var
  String core = coreName == null ? "" : "[" + coreName + "] ";
 
  logger.info(core
        + "<index update process> Process started at .............. "
        + df.format(startTime));
 
  try {
 
      URL url = new URL(completeUrl);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 
      conn.setRequestMethod("POST");
      conn.setRequestProperty("type", "submit");
      conn.setDoOutput(true);
 
      // Send HTTP POST
      conn.connect();
 
      logger.info(core + "<index update process> Full URL\t\t\t\t"
            + conn.getURL());
      logger.info(core + "<index update process> Response message\t\t\t"
            + conn.getResponseMessage());
      logger.info(core + "<index update process> Response code\t\t\t"
            + conn.getResponseCode());
 
      // listen for change in properties file if an error occurs
      if (conn.getResponseCode() != 200) {
        reloadParams();
      }
 
      conn.disconnect();
      logger.info(core
            + "<index update process> Disconnected from server\t\t"
            + server);
      Date endTime = new Date();
      logger.info(core
            + "<index update process> Process ended at ................ "
            + df.format(endTime));
  } catch (MalformedURLException mue) {
      logger.error("Failed to assemble URL for HTTP POST", mue);
  } catch (IOException ioe) {
      logger.error(
            "Failed to connect to the specified URL while trying to send HTTP POST",
            ioe);
  } catch (Exception e) {
      logger.error("Failed to send HTTP POST", e);
  }
}
 
 
这种方式同样需要增加权限验证, 在conn执行连接之前,要设置认证选项:
 
String encoding = Base64.encode(“username:password".getBytes());
conn.setRequestProperty("Authorization", "Basic " + encoding);
 
 
注意当前使用的仅仅是硬编码设置的用户名、密码,修改完成后,要将原有的jar包(apache-solr-dataimportscheduler-1.0.jar)进行重新编译并替换,重启solr服务即可。
 

使用内置的HttpSolrClient
 
即并不传入原来的,还有另外一种方法,可用于配置基本用户以及密码认证,在HttpClientConfigurer类中对DefaultHttpClient的参数进行配置时,使用了下面的属性配置:
 
final String basicAuthUser = config
    .get(HttpClientUtil.PROP_BASIC_AUTH_USER);
final String basicAuthPass = config
    .get(HttpClientUtil.PROP_BASIC_AUTH_PASS);
 
 
如果使用这种方式,那么在创建内置的HttpSolrClient时需要传入params,在params中加入基本认证即可。
 
ModifiableSolrParams params = new ModifiableSolrParams();
      params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 128);
      params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 32);
      params.set(HttpClientUtil.PROP_FOLLOW_REDIRECTS, false);
      params.set(HttpClientUtil.PROP_BASIC_AUTH_USER, "admin");
      params.set(HttpClientUtil.PROP_BASIC_AUTH_PASS, "zhen.com");
      params.set(HttpClientUtil.PROP_MAX_CONNECTIONS, 1000);
      params.set(HttpClientUtil.PROP_ALLOW_COMPRESSION, true);
      params.set(HttpClientUtil.PROP_MAX_CONNECTIONS_PER_HOST, 1000);
      CloseableHttpClient closeableHttpClient = HttpClientUtil.createClient(params);
 
HttpSolrClient solrClient = new HttpSolrClient(solrurl, closeableHttpClient);
  
同样的方法也适用于CloudSolrClient。
 
 
  • 大小: 82.7 KB
分享到:
评论

相关推荐

    手把手教你 对 solr8 配置用户登录验证 涉及到的配置文件

    在 Solr 8 中,为了确保系统的安全性和数据的隐私性,配置用户登录验证是非常重要的步骤。本文将详细介绍如何对手动配置 Solr 8 的用户登录验证。 首先,我们需要了解 Solr 的安全组件——Jetty 容器。Solr 默认...

    ambari离线安装solr所需文件

    8. **验证安装**:安装完成后,可以通过Ambari的监控功能检查Solr服务是否正常运行,以及执行一些基本的搜索操作来验证功能。 9. **维护与更新**:如果需要升级或调整Solr,可以按照类似的过程离线升级服务,同时...

    SOLR搭建企业搜索平台

    - 获取mmseg4j的最新版本,例如mmseg4j-1.8.2,将其jar文件复制到Tomcat的webapps\solr\WEB-INF\lib目录下。 2. **添加词库** - 在solr-tomcat\solr目录下创建dic文件夹,将sogou-dic的words.dic文件复制到该目录...

    solr dataimportscheduler jar 支持用户验证

    在apache-solr-dataimportscheduler.jar基础上进行了修改,修复了POST和时间的bug,添加了用户验证功能,在dataimport.properties中添加 username=xxx password=xxx 即可实现solr用户验证,亲测可用

    solr4.7服务搭建

    1. **修改 schema.xml 文件**:打开 `D:\solr\home` 目录下的 schema.xml 文件,增加或修改以下字段类型定义: ```xml &lt;fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100"&gt; ...

    apache-tomcat-9.0.35-solr7.7.3.rar

    总之,将Solr 7.7.3集成到Tomcat 9.0.35不仅提供了强大的搜索功能,还通过BASIC认证增强了安全性。通过以上步骤,你可以开始构建一个高效、安全的搜索环境。在日常运维中,持续监控和调整配置是保证系统性能和可用性...

    Apache Solr(solr-8.11.1.zip)

    9. **安全与认证**:Solr 8.x引入了内置的安全性框架,包括Zookeeper的ACL和Solr的Role-Based Access Control (RBAC),为用户提供了一种保护Solr集群的方式。 10. **JMX监控**:Solr支持Java Management Extensions...

    solr3.5与tomcat的部署配置以及与java项目的集成

    - **部署Solr Web应用**:将`D:\tools\javaTools\apache\apache-solr-3.5.0\example\webapp\solr.war`复制到`D:\lucene\solr\server`。 - **配置Tomcat的Server.xml**:打开Tomcat的`server.xml`文件,配置Solr Web...

    solr-web.zip

    本代码主要包含SOLR基本可视化运维,如通过控制套绑定数据库和创建应用搜索实例。支持删除索引和自定义的增量更新。同时具备分词检索能力。 部署方式:1、解压后在源码中修改solr-config.properties配置文件信息,...

    最新版windows solr-8.8.2.zip

    10. **安全与身份验证**:Solr 8.8.2可能包含安全模块,允许设置访问控制列表(ACLs)和角色基础的权限管理,以保护Solr实例免受未授权访问。 11. **日志和监控**:Solr提供了详细的日志记录,并可通过JMX(Java ...

    Apache Solr(solr-8.11.1.tgz)

    - **稳定性改进**:修复了已知的bug,增强了系统的稳定性和可靠性。 - **安全增强**:可能会有安全更新,以防止潜在的安全漏洞。 - **API更新**:可能更新了Solr的HTTP API,使其更加灵活和强大,方便集成到其他系统...

    solr dataimportscheduler 支持用户验证 含源码

    在apache-solr-dataimportscheduler.jar基础上进行了修改,修复了POST和时间的bug,添加了用户验证功能,在dataimport.properties中添加 username=xxx password=xxx 即可实现solr用户验证,亲测可用,该版本内含源码

    solr6.0 tomcat搭建

    - 找到 `web.xml` 文件中与安全相关的注释部分,并将其注释去除或修改。 - 重启 Tomcat 服务器。 #### 第四步:创建和配置索引库 1. **添加索引库**: - 登录到 Solr 管理界面,点击左侧的 `Core Admin`,然后...

    solr安装与配置

    - **配置Replication**:为提高系统的可用性和容错能力,可以设置多个副本,确保数据的安全性和一致性。 综上所述,Solr的安装与配置涉及多个环节,从基本的环境搭建到复杂的集群配置,每一步都至关重要。通过本文...

    solr4.10.2与tomcat6的整合

    ### Solr 4.10.2 与 Tomcat 6 的整合详解 #### 一、Solr 与 Tomcat 整合概述 Solr 是一个高性能、采用 ...这对于构建基于 Solr 的全文检索系统非常有帮助,可以方便地实现分布式部署和管理,提高系统的稳定性和性能。

    solr服务器_solr_

    7. **CloudSolrClient**:在SolrCloud模式下,应用通常使用CloudSolrClient与Solr集群通信,它可以自动处理数据路由和复制,确保高可用性和数据一致性。 8. **Faceting**:Solr提供分面搜索功能,允许用户通过分类...

    solr(solr-9.0.0.tgz)

    而Solr则在其基础上增加了分布式搜索、集群管理、结果高亮、 faceting(分类浏览)、近实时搜索(NRT)等高级特性,使得Solr更适合企业级的搜索应用。 总的来说,Solr-9.0.0是一个强大且灵活的搜索平台,适用于需要...

    Solr6.2官方版参考手册

    5. **安全性**: 讨论 Solr 的安全性和认证/授权机制。 #### 九、案例研究与最佳实践 - **应用场景**: 分享 Solr 在电子商务、新闻网站、企业内部搜索等多个领域的实际应用案例。 - **部署策略**: 探讨 Solr 的集群...

    tomcat9 + solr

    标题 "Tomcat9 + Solr" 提示我们讨论的是如何在Apache Tomcat 9服务器上部署和运行Apache Solr搜索引擎。Solr是一个基于Java的开源全文搜索引擎,它提供了...记得在每个阶段都要测试和验证,确保系统的稳定性和可靠性。

    solr解压版安装包

    8. **安全与集群**:对于生产环境,还需要考虑Solr的安全性,可以启用SSL加密通信,设置用户权限。同时,Solr支持分布式部署,通过Cloud模式实现多节点集群,提高可扩展性和容错性。 总的来说,Solr是一个强大的...

Global site tag (gtag.js) - Google Analytics