Ограничение IP-адресов для Jetty и Solr - PullRequest
14 голосов
/ 19 января 2012

Я настраиваю Solr с помощью Jetty. Я хотел бы ограничить доступ только несколькими IP-адресами. Не кажется сразу очевидным, что это можно сделать с помощью Jetty. Возможно ли это, и если да, то как?

Ответы [ 2 ]

28 голосов
/ 17 мая 2013

Solr 4.2.1 использует Jetty 8.1.8.Jetty 8 (как отметил jonas789) не поддерживает .htaccess.Вместо этого он использует IPAccessHandler, который не имеет большой доступной документации.Мне пришлось немножко поиграть с ним, чтобы заставить его работать, поэтому я публикую здесь обновленное решение.

IPAccessHandler управляет черным списком и белым списком, принимает произвольные диапазоны IP-адресов,и поддерживает присоединение определенных путей URI к каждой записи белого / черного списка.IPAccessHandler также подклассов HandlerWrapper, что оказывается важным.

Приложение solr все еще живет в WebAppContext (как в решении Линдсея), но теперь WebAppContext управляется ContextHandler, который находится в ContextHandlerCollection, занимающем Contextпервый слот обработчика на сервере.Чтобы запретить попадание запросов с неправильного IP-адреса в приложение, нам нужно обернуть его внутри IPAccessHandler где-нибудь по этому пути.IPAccessHandler ведет себя странно, если он находится в неправильном месте: я попытался вставить его до обработчиков контекста, и он выдал 403 Forbidden на неправильные машины, бросил истерики NullPointerException без дополнительных сообщений об ошибках, всякая чепуха.Я наконец заставил его работать, обернув сам ContextHandlerCollection на уровне сервера.

Перейдите к etc/jetty.xml и прокрутите до раздела обработчиков.Затем оберните существующий элемент ContextHandlerCollection следующим образом:

<!-- =========================================================== -->
<!-- Set handler Collection Structure                            --> 
<!-- =========================================================== -->
<Set name="handler">
  <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
    <Set name="handlers">
     <Array type="org.eclipse.jetty.server.Handler">
   <Item>

     <!-- here begins the new stuff -->
     <New class="org.eclipse.jetty.server.handler.IPAccessHandler">
       <Call name="addWhite">
         <Arg>xxx.xxx.xxx.xxx</Arg>
       </Call>
       <Set name="handler">
         <!-- here's where you put what was there before: -->
         <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
       </Set>
     </New>
     <!-- here ends the new stuff -->

   </Item>
       <Item>
         <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
       </Item>
       <Item>
         <New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/>
       </Item>
     </Array>
    </Set>
  </New>
</Set>

Ресурсы:

8 голосов
/ 20 января 2012

Я нашел решение.

Сначала извлеките содержимое solr.war в папку example / webapps. Затем создайте файл с именем .htaccess и поместите его в папку example / webapps / solr (только что извлеченную), содержащую следующее:

<Limit>
    satisfy all
    order deny,allow
    deny from all
    allow from xxx.xxx.xxx.xxx
</Limit>

В примере / etc / отредактируйте файл jetty.xml и закомментируйте часть org.mortbay.jetty.deployer.WebAppDeployer. Затем, наконец, создайте папку в примере / named contexts (если она еще не существует) и добавьте в нее файл solr.xml, содержащий:

<Configure id="solr" class="org.mortbay.jetty.webapp.WebAppContext">
    <Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/solr</Set>
    <Set name="contextPath">/solr</Set>
    <Call name="setSecurityHandler">
        <Arg>
            <New class="org.mortbay.jetty.security.HTAccessHandler">
                <Set name="protegee">
                    <Ref id="solr"/>
                </Set>
            </New>
        </Arg>
    </Call>
</Configure>

Тогда запусти свой новый безопасный solr!

...