2012-05-08 35 views
13

Quiero restringir el acceso a ciertas URL en mi aplicación web Tomcat. Solo se permite el acceso a 3 direcciones IP conocidas a las URL que se ajustan a un determinado patrón.¿Cómo puedo restringir el acceso a ciertas URL por IP de origen en Tomcat?

p. Ej. http://example.com:1234/abc/personId

¿Cómo puedo lograr esto?

+1

¿Cómo estás de decidir si rechazar o permitir el acceso? Por IP? ¿Por usuario registrado? Por región geográfica? ¿Por qué tienes iptables ahí? iptables no tiene conocimiento de una URL que pueda estar en uso. ¿Qué pila está ejecutando su servidor web y en qué punto de su arquitectura de red desea negar el acceso? – Cheekysoft

+0

No está claro por qué preguntas. ¿Es esta máquina un servidor web y estás tratando de restringir el acceso a las URL a las que sirve? ¿O es esta máquina una caja NAT? ¿O proxy inverso? –

+0

por ip. Tengo tres ips de solo necesito el acceso. Quiero prohibir que todos los demás ips utilicen la API. – Randeep

Respuesta

0

yo no restringir el acceso por dirección IP, por las siguientes razones:

  • Si lo hace, en decir las direcciones internas, por ejemplo, 10.0.0.0/24, significa que confías implícitamente en todo este rango. ¿Qué pasa si está comprometido?
  • No todos sus clientes pueden o podrán obtener direcciones IP estáticas, suponiendo que desee permitir el acceso de algunos clientes.
  • Los clientes detrás de dispositivos de puerta de enlace donde los proxies no son compatibles con x-forwarded-for, los encabezados solo van a tener la IP del dispositivo de puerta de enlace; confiando en que IP confía a todos detrás de la puerta de enlace, nuevamente asumiendo que es posible que desee dar acceso a algunos clientes.

En su lugar, si necesita ejecutar un sistema donde algunas llamadas solo son accesibles para ciertos usuarios, usaría la autenticación: los certificados del lado del cliente SSL funcionan bastante bien para este propósito. Alternativamente, puede usar algo como OAuth.

+0

Gracias por su respuesta. El caso es que mi servidor está proporcionando información a las aplicaciones móviles. Así que tengo muchas aplicaciones públicas. No puedo bloquearlos del público. Pero también hay algunas aplicaciones privadas.A eso solo se debe acceder desde tres sistemas internos. Y no puedo agregar mecanismos de autenticación adicionales. – Randeep

4

Usted puede hacer eso con esto en server.xml:

<Valve 
    className="org.apache.catalina.valves.RemoteAddrValve" 
     deny="117.40.83.*,122.224.95.*,119.255.28.*,218.8.245.*,218.85.139.*,219.117.197.*,124.89.39.*,58.18.172.*,180.153.225.*" 
     /> 

(éstas son las direcciones IP reales: los propietarios, que saben por qué: - |), pero como se puede ver en realidad no es un bloqueador habilitador Una mejor solución sería colocar el Apache HTTPD delante de él con las instrucciones Denegar todo y Permitir de, que le permitirán permitir solo las 3 direcciones IP que necesita para acceder al servicio.

+0

Solo puede agregar Válvulas a los elementos del Contenedor (Motor, Anfitrión, Contexto). Puede restringirlos a un subconjunto de URL dentro de una aplicación. Para eso, necesitas la versión de filtro. –

+0

Merece la pena señalar que esta respuesta se refiere a Tomcat 6. En Tomcat 7, la sintaxis ha cambiado, ya que toda la entrada es una expresión regular. –

11

Utilice org.apache.catalina.filters.RemoteAddrFilter y asígnela a la URL que desea proteger. Ver http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Remote_Address_Filter para detalles de configuración.

+0

¡mi URL comienza con un puerto! No está funcionando para mi. He añadido las siguientes líneas en server.xml Filtro de dirección remota org.apache.catalina.filters.RemoteAddrFilter permiten 122 \ .167 \ .211 \ .31 ## mi IP filtro de dirección remota /abc/* ## para http://example.com:1234/abc/(personId) Randeep

+1

Los filtros no están definidos en server.xml, se definen en web.xml. Trátelo como un filtro de servlet normal. –

+0

Lo sentimos, pero su url comienza con un puerto ???? Y este puerto no es el puerto de Tomcat? ¿Cómo se ejecuta tu API en Tomcat? –

2

se puede usar algo como esto para bloquear ips y si está detrás de proxy:

<Context path="/manager" docBase="manager" reloadable="true" privileged="true" > 
    <Valve className="org.apache.catalina.valves.RemoteIpValve"/> 
    <Valve className="org.apache.catalina.valves.RemoteHostValve" allow="<your IP regex>"/> 
</Context> 
Cuestiones relacionadas