¿Se incrementa la seguridad al usar un subdominio por cliente en una aplicación web?

6

Estoy pensando en agregar subdominios por cliente a mi aplicación web (lo que significaría un certificado SSL de comodín y un código adicional). Es una aplicación para ayudar a las pequeñas empresas con su flujo de caja. Los clientes no podrán subir su propio contenido a la aplicación, al menos no al principio.

¿Qué aporta en términos de seguridad? Por ejemplo, mi entendimiento es que me beneficiaré de la misma política de origen para evitar el javascript entre dominios. ¿Es realmente el caso, y hay otros beneficios?

    
pregunta Thibaut Barrère 23.09.2011 - 14:39
fuente

3 respuestas

7

Depende de qué es la aplicación y de qué control tienen los clientes sobre ella. La misma política de origen aún se aplica, por lo que es recomendable utilizar el subdominio como perímetro de seguridad, pero, como siempre, habrá algunas peculiaridades.

Sus usuarios aún pueden hacer solicitudes de dominio cruzado con Intercambio de recursos de origen cruzado . Si no se pueden cambiar los encabezados HTTP, solo perderán el acceso a la respuesta, pero, por ejemplo, un usuario podría falsificar un carga silenciosa de archivos a otro subdominio sin problemas.

Sus clientes también podrían, a veces sin saberlo, relajar la Política del mismo origen. Por ejemplo, si pueden cargar archivos, lo más probable es que alguien suba permitir-todo crossdomain.xml . Además, podrían establecer document.domain en el dominio principal para que todos los subdominios hermanos puedan acceder al DOM.

En cuanto a las cookies, el atacante aún puede configurarlo para el dominio principal y otro subdominio (del cliente víctima) todavía obtendrá la cookie, los subdominios no lo protegerán de eso, solo los dominios separados lo harán.

Hay muchas maneras en que las aplicaciones instaladas en diferentes dominios pueden comunicarse entre sí, algunas de estas formas pueden usarse para un ataque. Si sospecha que sus clientes podrían intentar atacarse entre sí, preste especial atención para evitar la falsificación de solicitudes de sitios cruzados (¡tokens!) y Fijación de sesión . Por ejemplo, configure un nombre de cookie de sesión diferente para cada subdominio. Guarde sus sesiones del lado del servidor en una tienda por cliente (es decir, no en el directorio / tmp común) y rechace las cookies con un ID de sesión desconocido para el servidor.

    
respondido por el Krzysztof Kotowicz 24.09.2011 - 00:27
fuente
6

Comentarios generales. Hay una variedad de arquitecturas, con un nivel diferente de robustez a las vulnerabilidades de seguridad en su código del lado del servidor.

La estrategia más sólida es usar un dominio no relacionado para cada cliente (por ejemplo, customera.com, customerb.com). Esto le brinda todos los beneficios de la política del mismo origen. Por ejemplo:

  • Si un cliente encuentra una forma de cargar Javascript malintencionado en su sitio, no puede atacar a otros clientes (la política del mismo origen del navegador no permitirá que el código malicioso manipule otros dominios).

  • Si el sitio de un cliente tiene una vulnerabilidad de seguridad (por ejemplo, XSS), los atacantes no pueden usarlo como un punto de partida para atacar a sus otros clientes.

Sin embargo, el uso de un dominio no relacionado por cliente hace que pague el costo de un dominio separado por cliente. Es posible que ese costo no sea necesario, dependiendo de su aplicación particular.

La siguiente estrategia más robusta es usar un subdominio diferente por cliente (por ejemplo, customera.mysite.com, customerb.mysite.com). Esto le brinda la mayoría de los beneficios de la política del mismo origen, pero con algunas advertencias y agujeros:

  • Si no tiene cuidado, es posible que el código del sitio de un cliente aún pueda leer las cookies de los sitios de otros clientes. En particular, es importante que todas las cookies establecidas por el sitio para el cliente A tengan su atributo de dominio establecido en customera.mysite.com , no en .mysite.com (como se explica en @dgarcia). Si controla el código del lado del servidor y el código del lado del cliente, puede aplicar esto. Sin embargo, si ejecuta el código provisto por el cliente, puede ser más difícil hacer cumplir este requisito, y es posible que desee utilizar un dominio no relacionado por cliente.

  • No importa cómo configure su sitio, el sitio de un cliente seguirá teniendo la capacidad de establecer cookies para el sitio de otro cliente. Esta es una brecha poco conocida en la política del mismo origen; customera.mysite.com puede configurar una cookie con el atributo de dominio .mysite.com , y luego esa cookie se enviará junto con todas las solicitudes a customerb.mysite.com. (Vea también document.domain para otras vías de ataque). Esta es una posible violación del aislamiento, cuyas implicaciones pueden variar de "ninguna" a "grave". No hay una buena manera de prevenir este vector de ataque. Por lo tanto, si usa un subdominio diferente por cliente, es posible que necesite que el código del lado del servidor esté completamente bajo su control y libre de vulnerabilidades; e igual para todo el Javascript servido en el sitio de cada cliente.

    Esta limitación puede ser aceptable en su aplicación o puede que no. Si no es un riesgo aceptable, entonces puede usar dominios no relacionados para cada uno de sus clientes.

La estrategia menos robusta es atender a todos sus clientes desde su mismo dominio (por ejemplo, mysite.com/customera, mysite.com/customerb; o mysite.com con un inicio de sesión diferente por cliente). La desventaja de este enfoque es que ya no puede confiar en la política del mismo origen del navegador para ayudarlo a mantener a los clientes separados, por lo que ahora la responsabilidad pasa a su servidor. No me malinterprete: este enfoque definitivamente puede ser seguro si su código está libre de vulnerabilidades y su código garantiza que ningún cliente pueda atacar a ningún otro. Esta arquitectura es probablemente la más comúnmente encontrada en la web: la mayoría de los sitios web orientados al usuario usan esta arquitectura. La limitación de esta arquitectura es que es menos robusta ante fallas en el código del lado del servidor; un error de XSS, falla de saneamiento u otro problema en su código puede permitir que un cliente ataque a otro, o romper el aislamiento del cliente.

Consejos para su situación particular. Para su aplicación, imagino que cualquiera de estos estaría bien. Parece que no tiene una aplicación de alto valor, por lo que esta no es una situación de alto riesgo y alta sensibilidad. Además, parece que no hay forma de que los clientes carguen contenido, carguen documentos HTML, carguen Javascript, carguen documentos, etc. Esas operaciones son arriesgadas y, si su sitio lo permite, me inclino más a recomendar que use diferentes subdominios dominios no relacionados; pero como su sitio no lo permite, no veo una razón importante por la que necesite dominios diferentes.

Por razones similares, no veo una razón sólida por la que necesite un certificado SSL diferente por cliente. Por lo tanto, sospecho que estaría bien con una arquitectura en la que use un solo dominio y confíe en el código del servidor para autenticar a cada cliente y aplique los controles de acceso adecuados para proteger a los clientes entre sí.

    
respondido por el D.W. 26.09.2011 - 05:41
fuente
4

También evita que las personas vean y configuren cookies entre sí, en lugar de tener a los clientes bajo una sola raíz. Difícil evaluar cuán importante es eso sin conocer tu aplicación.

Por cierto, los certificados de comodín son peligrosos: la casilla más sensible solo está tan protegida como la más débil. Los certificados de comodines tienden a acostumbrarse mucho después de obtenerlos. Las personas los colocan en servidores de correo, Sharepoint, etc. No son inseguros si se usan correctamente, pero son una gran tentación de usar de forma peligrosa, y como cuestión de política, los evito.

    
respondido por el Steve Dispensa 23.09.2011 - 19:58
fuente

Lea otras preguntas en las etiquetas