¿Es oscurecer / ofuscar los identificadores de bases de datos públicas realmente una "mejor práctica"?

23

He escuchado a personas dar conferencias aquí y allá en Internet que es una buena práctica ocultar los identificadores de bases de datos públicas en las aplicaciones web. Supongo que significan principalmente en formas y en URL, pero nunca he leído nada más que un bocado sobre el tema.

EDITAR : Por supuesto, ahora que pregunto esto, encuentro algunos recursos sobre el tema:

Estos enlaces satisfacen parte de mi curiosidad, pero las publicaciones de SO no tienen muchos votos y no están necesariamente centradas en el tema en este contexto, por lo que no estoy seguro de qué hacer al respecto, y algunos de ellos afirman que el tercero El enlace es falso. Dejaré el resto de mi publicación intacta:


Entiendo las diferencias entre la oscuridad y la seguridad, así como cómo los dos pueden trabajar juntos, pero no puedo imaginar por qué esto sería necesario.

¿Hay algo de verdad en esto, es solo paranoia, o es totalmente falso?

Se me ocurren formas de hacerlo, pero, por supuesto, agrega mucha complejidad al código de la aplicación. ¿En qué circunstancias sería útil? Si esto es algo que la gente hace con frecuencia, ¿cómo se suele implementar? Hashing los identificadores? ¿Algo más? Parece mucho trabajo por poca seguridad adicional. No estoy buscando soluciones reales, solo quiero tener una idea de cómo / por qué la gente haría esto en el mundo real.

¿Se considera esto realmente una "mejor práctica" o es simplemente una microoptimización de poco valor?

NOTA : Creo que algunas personas pueden haber tenido una idea equivocada: no estoy sugiriendo que los identificadores difíciles de adivinar serían el único mecanismo de seguridad, obviamente habría las comprobaciones de acceso habituales. Supongamos que están en su lugar, y que simplemente conocer la identificación o la identificación hash de un registro no es suficiente para otorgar acceso.

Wesley Murch
fuente

Respuestas:

28

No creo que sea tan importante, pero hay algunos escenarios en los que podría importar dependiendo de otras decisiones que tomes.

Por ejemplo, si tuviera que exponer una identificación de pedido que se genera de forma secuencial, y tuvo un ataque de ingeniería social con alguien que llamó al servicio de atención al cliente y dijo "oye, acabo de gastar $ 2000 en una computadora nueva y ustedes me enviaron la orden de otro tipo para un cable de $ 15, ahora estoy fuera de $ 2000 ", podrías pasar mucho tiempo tratando de investigar el problema antes de concluir que es falso o enviar al falsificador una computadora nueva.

Hay variaciones similares, menos sofisticadas, pero vergonzosas sobre el tema; Si un tipo malo incrementa una ID de pedido, un enlace enviado por correo electrónico a un recibo, y si no se realizan validaciones adicionales para verificar que la persona que hizo clic en el enlace tiene el derecho de ver la ID del pedido, de repente está exponiendo involuntariamente información privada del cliente a la persona equivocada

En tales casos, si los números no son secuenciales, la exposición se mitiga ligeramente porque es menos probable que adivinar arroje resultados interesantes. Por otro lado, ahora necesita una manera conveniente de hacer referencia a un ID de pedido en las interacciones de atención al cliente que no dará lugar a largas conversaciones de ida y vuelta con las interacciones telefónicas del cliente mientras su representante intenta distinguir entre B, PD y T en el número de pedido BPT2015D.

Yo diría que es difícil llamar a esta ofuscación una "mejor práctica", pero en ciertos escenarios, puede reducir la facilidad de explotar otra debilidad en su código de validación o autorización. Por otro lado, realmente no importa si alguien sabe que escribiste la publicación de blog # 1 o # 2559. Si la identificación no es información valiosa, incluso con conocimiento adicional, entonces el argumento de que ofuscarlo es una mejor práctica tiene menos peso.

Hay un segundo argumento potencial, que es que su identificador de base de datos puede unirlo a una implementación de base de datos particular (o instancia), y cuando su empresa se compra o elige un competidor y ahora tiene que fusionar dos sistemas heredados, o el CEO sale a beber con el representante de DynoCoreBase y deciden que ahora moverá todos sus datos a DynoCoreBase versión 13h y quiere que todas las claves principales sean guías, y debe crear algún tipo de capa de mapeo para traducir las ID antiguas a nuevas ID para que las URL antiguas no se rompan, pero si estos escenarios son importantes para usted depende mucho más de la naturaleza de su negocio (y de la participación del cliente con esos ID) que de cualquier práctica recomendada general.

JasonTrue
fuente
2
Siento que eres el único que entendió mi pregunta. Definitivamente puede "reducir la facilidad de explotar otra debilidad" como usted dice, pero ¿de qué valor es eso? ¿Alguien determinado individuo se va a desanimar de mi algo como un hash salado? Pensé que esto era más una técnica de "ventaja profesional", pero no lo veo en la práctica (o tal vez no me daría cuenta si lo hiciera ...). Como dijiste, conocer solo la identificación no debería otorgar acceso (creo que algunas personas se perdieron esa parte, lo di por sentado). Entonces, creo que estoy de acuerdo con su evaluación general.
Wesley Murch
9

Esta es mi opinión sobre ella:

Si bien la "seguridad a través de la oscuridad" obviamente no es suficiente, la oscuridad puede ayudar a la seguridad, aunque sea un poco. Tienes que decidir si ese poquito de psuedo-security vale la pena el esfuerzo adicional que lleva desplegar algo como esto en tu aplicación.

Hay otra razón fuera de la seguridad que se me ocurre para implementar esto:

Intimidad

Digamos que estamos tratando con identificadores de usuario en la url. Si la identificación de usuario de Joe es 100y la identificación de usuario de Bob es 101, probablemente sea obvio que la cuenta de Joe se creó primero. Si bien esto puede no importar en la mayoría de las aplicaciones, puede ser importante para algunas. Este es un ejemplo de privacidad estrictamente a través de la oscuridad, por lo que, a menos que tenga un sistema muy sofisticado de ofuscación de los identificadores de usuario, podría ser bastante fácil de disolver y descubrir si el usuario con ID 3Js9kW3hTs7sa120ha tenido una cuenta más larga que el usuario con ID Q8Hs73kks0hEg.

Desde el enlace al que hice referencia:

El primero es que, dada la URL de algún objeto, puede averiguar las URL de los objetos que se crearon a su alrededor. Esto expone el número de objetos en su base de datos a posibles competidores u otras personas que tal vez no desee tener esta información (como lo demostraron los aliados que adivinan los niveles de producción de tanques alemanes al observar los números de serie).

El uso de una identificación de incremento automático expone públicamente el número de objetos en la base de datos y puede exponer cuáles se crearon primero y cuáles son más nuevos. Esta información puede revelar el hecho de que un negocio es nuevo o no funciona bien incluso. Por ejemplo: supongamos que solicita un libro y su identificación de pedido es 1. Puede ser evidente que su pedido fue el primero en el sistema, lo que puede ser desconcertante. Digamos que volver y pedir otra y su identificación de la orden es 9. Esto revela la información de que solo se hicieron 7 pedidos en el período de tiempo entre sus dos pedidos. Esta podría ser información valiosa para los competidores. En este caso, la identificación numérica de incremento automático probablemente esté mejor ofuscada.

Wesley Murch
fuente
2

La palabra "oscuro" es probablemente un poco engañosa aquí, y puede llevar a la gente a pensar "ofuscar" o "esconderse parcialmente".

La recomendación es que nunca incluya claves de base de datos generadas internamente como parte de una URL pública si estos registros de base de datos contienen datos confidenciales.

Es demasiado fácil jugar con los números en la URL y acceder a otros registros.

James Anderson
fuente
1
Sí, quise decir ofuscarme en el título y en algunos otros casos, perdón por eso. Aunque me alegra que sepas lo que quise decir. Entiendo lo de "jugar con los números", pero ese es mi punto: tu aplicación no debe protegerse haciendo que los identificadores sean un poco más difíciles de adivinar y cruzando los dedos. Si alguien aterriza /account/8hdy39s1lks062dfasd4y se asigna a una cuenta real, no debería tener acceso de todos modos.
Wesley Murch
2

Iré en contra de la corriente principal y le diré que usar un identificador aleatorio y largo es, en mi opinión, una forma de seguridad bastante decente.

Debe quedar claro para quien tiene acceso a esos datos que es tan sensible como una contraseña. Y, por supuesto, tiene la desventaja de que si entra en la naturaleza puede ser más difícil cambiarlo.

Pero tiene un par de ventajas sobre el par de nombre de usuario y contraseña habitual. Primero, el usuario no tiene otra opción, por lo que puede estar seguro de que es esencialmente imposible de adivinar. No tiene sentido diseñar un sitio perfectamente seguro cuando el administrador elige su primer nombre como contraseña. En segundo lugar, cada elemento tiene un identificador diferente, por lo que si uno tiene acceso a un elemento, esto no ayuda con el otro.

Por supuesto, cuantas más capas de seguridad haya, mejor. Pero este método solo puede ser más seguro que un par de credenciales.

Andrea
fuente
1
Estoy de acuerdo. Cualquiera sea el método de seguridad que esté utilizando, se trata de enviar bytes no adivinables a través del cable. Si se hace correctamente, está enviando una identificación que es tan buena como la encriptada, que no pierde ninguna información sobre su espacio de identificación, y diría que es más fuerte de lo que la gente está hablando cuando critican "la seguridad a través de la oscuridad". "
Marc Stober
0

Hay dos aspectos en esto: usabilidad y seguridad.

En cuanto a la seguridad, ocultar las identificaciones es bastante inútil; Lo importante es que la ID nunca debe ser la única 'clave' para ningún recurso no público. Esto significa que si desea dar acceso a los usuarios seleccionados a una página determinada, simplemente no es suficiente con la identificación de la página en la URL, debe implementar un mecanismo de seguridad real, como un nombre de usuario / contraseña o autenticación de clave pública / privada, así como la autorización adecuada (es decir, el sistema debe poder juzgar, por caso, si el usuario X puede acceder al recurso Y y actuar en consecuencia).

En cuanto a la usabilidad, el consejo general es mantener ocultas las claves artificiales: no tienen ningún significado para el usuario, y al revelarlas de manera obvia, introduce una dependencia adicional, una que es particularmente difícil de manejar porque vive fuera el reino del software: las personas escribirán, enviarán un correo electrónico, enviarán un fax, imprimirán, marcarán, etc., esas identificaciones, y si alguna vez las cambian, recibirán algunos molestos tickets de soporte.

tdammers
fuente
En una aplicación web no puedo pensar en ejemplos en los que las personas escriban una identificación interna por cualquier motivo. Enviar por correo electrónico una URL o algo (o marcar uno) que tenga una identificación que pueda entender, pero en ese caso no veo dónde entra en juego la usabilidad. No sugerí cambiarlos a mitad de camino, pero entiendo cómo sería un problema.
Wesley Murch
@Madmartigan: no es tan raro con los sistemas de información personalizados. Los usuarios necesitan hacer ciertas cosas, y a veces la aplicación no los soporta directamente, o simplemente está rota, o tal vez revisar las ID directamente es más fácil que seguir la ruta que los arquitectos de software imaginaron. Las personas pueden ser muy creativas con estas cosas, y antes de que te des cuenta, esas identificaciones 'internas' comienzan a conducir sus propias vidas.
tdammers
0

No , usted absolutamente no quiere permitir el acceso a recursos arbitrarios simplemente conociendo su identificación interna. Este es el Internet, cualquiera que sea actos maliciosos, o simple presencia infantil se puede imaginar de existir, existe realmente , y tarde o temprano van a llegar a su sitio. A menos que todo lo que pueda servir sea completamente público para todos (y si tiene incluso un cliente, se garantiza que ese no sea el caso), debe restringir el acceso a aquellos que realmente están autorizados para tenerlo.

La solución habitual es usar tokens de autorización de algún tipo que estén almacenados en una sesión encriptada, y verificaciones que verifiquen si se supone que algo debe ser visible para el usuario autenticado antes de enviarlo. Este puede ser un administrador de seguridad real, como el que se incluye con el JDK, o cualquier otro componente que cumpla el mismo rol, siempre que lo haga de manera consistente. (Si exponer las ID internas a alguien que ya está autenticado o no es también una pregunta interesante con varios pros y contras, pero es menos esencial para la seguridad).

El valor de hacer esto es difícil de calcular hasta que alguien realmente lo ataca. Por lo general, es la diferencia entre cerrar el negocio y simplemente ignorar otro guión frustrado para niños.

Kilian Foth
fuente
2
Creo que es posible que se haya equivocado de idea, no sugerí "permitir el acceso a recursos arbitrarios simplemente conociendo su identificación interna", estoy hablando de ofuscar la identificación además de las medidas de seguridad existentes. Obviamente, solo conocer la identificación o el hash no debería considerarse una autorización.
Wesley Murch
0

Obviamente, depende de cuán sensibles sean los datos, pero para una seguridad media, lo mínimo que haría sería incluir el ID y un valor de suma de verificación.

Genere la suma de verificación agregando sal (es decir, una colección de caracteres aleatorios) antes y después de la ID y haciendo un MD5 en el valor.

En cada página que lea el valor de ID, debería generar el valor de suma de comprobación y compararlo con el que se pasó, rechazar la solicitud si no coincide.

Si un pirata informático potencial puede obtener suficientes combinaciones válidas, entonces puede calcular el valor de Salt por la fuerza bruta, por lo que si puede agregar otra capa de seguridad, como verificar la ID de usuario, eso también ayudará.

Generador de Código PHP
fuente