2012-01-19 3 views
12

Jetty를 사용하여 Solr을 설정 중입니다. 몇 가지 IP 주소로만 액세스를 제한하고 싶습니다. Jetty를 사용하여이 작업을 수행 할 수 있다는 것은 당연한 것 같지 않습니다. 가능하고 그렇다면 어떻게 될까요?Jetty 및 Solr의 IP 주소 제한

+0

I을 다음과 같이 기존 ContextHandlerCollection 항목을 포장 커스텀 핸들러 나 필터를 작성하지 않고 직접 할 수 없다고 생각합니다. 어쨌든, 당신은 아파치 같은 다른 웹 서버 뒤에 부두를 넣을 수 있습니다. – Chewie

답변

25

Solr 4.2.1은 Jetty 8.1.8을 사용합니다. Jetty 8 (jonas789에서 언급했듯이)은 .htaccess를 지원하지 않습니다. 대신 IPAccessHandler를 사용합니다. IPAccessHandler는 유용한 설명서가 없습니다. 나는 그것이 작동하도록 꽤 많은 노력을 기울여야 만 했으므로 여기서 업데이트 된 솔루션을 게시하고 있습니다.

IPAccessHandler은 블랙리스트와 화이트리스트를 관리하고, 임의의 범위의 IP를 허용하며, 특정 URI 경로를 각 화이트/블랙리스트 항목에 첨부하는 것을 지원합니다. IPAccessHandler는 또한 HandlerWrapper를 하위 클래스로 분류하여 중요한 것으로 판명되었습니다.

Solr 앱은 여전히 ​​(Lyndsay의 솔루션에서와 같이) WebAppContext에 있지만 WebAppContext는 서버의 첫 번째 처리기 슬롯을 차지하는 ContextHandlerCollection에있는 ContextHandler에 의해 관리됩니다. 앱에 잘못된 IP로부터의 요청을 막으려면 IPAccessHandler를 그 경로의 어딘가에 포장해야합니다. IPAccessHandler가 잘못된 위치에있는 경우 이상하게 작동합니다. 전에 문맥 핸들러 인을 삽입하려했는데 잘못된 기계에 금지 된 403을 부여하고 NullPointerException을 발생 시켰습니다. 추가적인 오류 메시지가 없었습니다. 모든 종류의 말도 안됩니다. 마지막으로 서버 수준에서 ContextHandlerCollection 자체를 래핑하여 작동하도록했습니다.

etc/jetty.xml으로 이동하여 처리기 섹션으로 스크롤하십시오.

<!-- =========================================================== --> 
<!-- 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> 

자료 :

+0

나는 그것을 시도했다. 그것은 완벽하게 작동합니다! 그것은 당신이 사용하는 호스트가 아닌 다른 호스트에서 사용되는'클라이언트'에'solr admin'과 &에 대한 접근을 차단합니다. – h4k1m

+0

나는이 동일한 해결책에 독자적으로 도착한다; 나는 이것을 처음으로 찾지 못했다. 참고로이 IPAccessHandler는 IPv4에서만 작동합니다 - 버그/제한 사항입니다. 따라서 Java를 시작할 때'-Djava.net.preferIPv4Stack = true'를 전달하십시오. 제안 된 규칙을 찾는 사람들은 다음과 같습니다. 127.0.0.1 -. -. -.- |/solr/techproducts/select 따라서 localhost는 모든 작업을 수행 할 수 있으며 다른 모든 사람은 특정 "core"및/또는 Solr RequestHandler를 선택하십시오. –

8

해결책을 찾았습니다.

먼저 example/webapps 폴더에서 solr.war의 내용을 추출하십시오. 예에서

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

의/etc/편집 jetty.xml의 파일 및 의견 : 다음을 포함하는 (방금 추출 된 하나) 다음의 .htaccess라는 파일을 생성하고 예/웹 어플리케이션/SOLR 폴더에 넣습니다 org.mortbay.jetty.deployer.WebAppDeployer 부분을 제거하십시오. 그리고 마지막으로 (하나 아직 존재하지 않는 경우) 예 /라는 맥락에서 폴더를 만들고이를 포함에 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를 시작합니다!

+3

다른 사람들에게는 eclipse에서 호스팅되는 최신 버전의 Jetty에서는 작동하지 않습니다. 기본적으로 더 이상 HTAccessHandler가 없습니다. 참조 : http://jetty.4.n6.nabble.com/jira-Created-JETTY-962-Clean-room-implementation-of-org-mortbay-jetty-securtiy-HTAccessHandler-td41205.html – jonas789