2012-01-19 12 views
12

Estoy configurando Solr usando Jetty. Me gustaría restringir el acceso a solo unas pocas direcciones IP. No parece inmediatamente obvio que esto se puede hacer usando Jetty. ¿Es posible y, de ser así, cómo?Restricción de direcciones IP para Jetty y Solr

+0

I cree que no puede hacerlo directamente sin escribir un controlador o filtro personalizado. De todos modos, podrías poner Jetty detrás de otro servidor web como Apache. – Chewie

Respuesta

25

Solr 4.2.1 utiliza Jetty 8.1.8. Jetty 8 (según lo notado por jonas789) no es compatible con .htaccess. En cambio, usa IPAccessHandler, que no tiene una gran documentación disponible. Tuve que jugar bastante para que funcione, así que estoy publicando una solución actualizada aquí.

IPAccessHandler gestiona una lista negra y una lista blanca, acepta intervalos arbitrarios de IP y admite la conexión de rutas de URI específicas a cada entrada de lista blanca/negra. IPAccessHandler también subclasifica a HandlerWrapper, que resulta ser importante.

La aplicación solr aún vive en un WebAppContext (como en la solución de Lyndsay), pero un WebAppContext ahora se rige por un ContextHandler, que reside en un ContextHandlerCollection que ocupa la ranura del primer controlador en el servidor. Para evitar que las solicitudes provenientes de una dirección IP incorrecta lleguen a la aplicación, debemos envolverla dentro de un IPAccessHandler en algún lugar a lo largo de esa ruta. IPAccessHandler se comporta de forma extraña si está en el lugar equivocado: intenté insertarlo antes de los controladores de contexto y dio 403 Prohibido a las máquinas equivocadas, lanzó tantrums NullPointerException sin mensajes de error adicionales, todo tipo de tonterías. Finalmente logré que funcionara envolviendo ContextHandlerCollection, en el nivel del servidor.

Vaya a etc/jetty.xml y vaya a la sección de controladores. Luego envuelva el elemento ContextHandlerCollection existente de la siguiente manera:

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

Recursos:

+0

Lo he probado y funciona perfecto! Bloquea el acceso a 'solr admin' y al' cliente' utilizado desde otros hosts que no sea el utilizado por usted. – h4k1m

+0

Llego independientemente a esta misma solución; No encontré esto primero. Para tu información, esta cosa de IPAccessHandler solo funciona con IPv4, es un error/limitación. Por lo tanto, al iniciar Java, pase: '-Djava.net.preferIPv4Stack = true'. Y para aquellos que buscan reglas sugeridas, la mía es así: 127.0.0.1 -.-.-.- |/solr/techproducts/select Así localhost puede hacer cualquier cosa, y todos los demás están severamente restringidos a un cierto "core" y/select Solr RequestHandler. –

8

Encontré la solución.

En primer lugar, extraiga el contenido de solr.war en la carpeta example/webapps. A continuación, cree un archivo llamado .htaccess y colocarlo en el ejemplo webapps/carpeta/Solr (la que acaba de extraer) que contiene lo siguiente:

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

En el ejemplo etc/editar el archivo/jetty.xml y comentario la parte org.mortbay.jetty.deployer.WebAppDeployer. Entonces, finalmente, crear una carpeta en el ejemplo/llamados contextos (si es que aún no existe) y añadir un archivo llamado solr.xml a ella que contiene:

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

entonces poner en marcha su nueva Solr seguro!

+3

Para otros, esto no funcionará en las versiones más nuevas de Jetty alojadas en eclipse. Básicamente, no hay más HTAccessHandler. Referencia: http://jetty.4.n6.nabble.com/jira-Created-JETTY-962-Clean-room-implementation-of-org-mortbay-jetty-securtiy-HTAccessHandler-td41205.html – jonas789

Cuestiones relacionadas