Proteja los datos de la base de datos de todos, incluidos los administradores de sistemas, etc.

3

Una de las cosas que siempre me ha molestado sobre el cifrado simple de datos de la base de datos: si el servidor está comprometido, la base de datos está comprometida efectivamente. El atacante puede usar el mismo código que la aplicación para consultar los datos como desee. Una simple revisión del código de la aplicación mostrará dónde / cómo se almacena la clave y cuáles son los parámetros de conexión de la base de datos.

Por supuesto, el cifrado de los datos puede ser útil cuando se almacenan copias de seguridad fuera del servidor, etc., pero para este fin, los archivos de la copia de seguridad podrían cifrarse completamente, en lugar de los campos, ahorrando algunos dolores de cabeza con consultas, etc.

En general, asegurarse de que el servidor esté seguro es la mejor práctica. Pero, ¿qué pasa si los datos deben protegerse de todos, incluidos los administradores de sistemas (de manera similar a como tratamos las contraseñas de los usuarios, a través de hashing)?

En última instancia, me pregunto cómo puede protegerse una clave de cifrado, de modo que nadie pueda acceder a ella sin el secreto, ni siquiera el código de la aplicación. El único enfoque que se me ocurre es que el usuario debe proporcionar la clave en tiempo de ejecución (no se conserva en el equipo host, punto).

Me imagino que el primer problema es que si un usuario tiene acceso al servidor, probablemente haya una forma de que el secreto pueda ser detectado en el punto de entrada, o si la clave está almacenada en la memoria por la aplicación (por ejemplo, en una variable de sesión) esto también podría ser explotado.

¿Cuáles son los otros problemas (probablemente evidentes) con este enfoque? ¿Esto es solo reinventar la rueda? Si es así, ¿cuál es la mejor práctica cuando la seguridad de los datos es crítica, incluso para los roles de superusuario?

Esta pregunta puede ser algo similar a: Cómo iniciar sesión y cifrar datos con la misma contraseña / clave , excepto que estoy preguntando si el concepto es incluso bueno, no cómo implementar.

    
pregunta RogerRoger 25.08.2014 - 19:59
fuente

4 respuestas

1

Si desea protegerse contra una clave u otro secreto que se expone como resultado de un compromiso del sistema, debería consultar un HSM para realizar actividades criptográficas. Dado que el HSM es esencialmente su propia pequeña computadora, entonces el HSM debería verse comprometido, lo cual es mucho más difícil.

También puede usar una arquitectura distribuida o de n niveles entre la aplicación, la base de datos y el descifrado, de modo que el compromiso de un sistema no resulte en un compromiso de los otros componentes (e..g, coloque el DB en su Servidor propio con menos servicios y acceso (bastion host).

Otras medidas dependerían de quién realmente necesita el texto simple, por ejemplo. Si solo es el sujeto / usuario que introdujo los datos, puede utilizar algún tipo de descifrado local a través de una contraseña o dispositivo de seguridad local / tarjeta de cifrado.

Editar: También publicó esto en los comentarios a otras respuestas, pero relevante para esta conversación es el cifrado homomórfico. En función de su comentario a continuación, si solo desea que tengan acceso a temas específicos, consulte un sistema como Mylar del MIT. Sin embargo, cambia el panorama si desea hablar sobre datos a los que deben acceder tanto los humanos como las cuentas de servicio.

    
respondido por el Eric G 25.08.2014 - 23:31
fuente
2

Para crear una base de datos en vivo que cifra sus datos, la base de datos en sí tendría que tener acceso a las claves. Por ese token, cualquier administrador podría ingresar a la cuenta y encontrarlos. Sus inquietudes son válidas.

Su idea de que el usuario presente una clave segura (por ejemplo, RSA) si lo hace a través de una conexión SSH o SSL no es una mala idea. @Eric G mencionó a Mylar en los comentarios a continuación que hacen este tipo de cosas, y más. Valdría la pena el examen.

Si en lugar de cifrar la base de datos, debe cifrar los datos antes de que se ingresen en la base de datos, entonces tendría una posibilidad diferente, esto se considera solo como una posible alternativa:

Los datos se cifran antes de la publicación y luego se descifran mediante un programa cliente. La base de datos no se cifraría, solo los datos que contiene.

... o para el verdadero paranoico de seguridad: haga ambas cosas: cifrado de base de datos y cifrado de datos, cada uno con diferentes métodos.

Más se describe y analiza a continuación en los comentarios.

    
respondido por el Jeff Clayton 25.08.2014 - 20:31
fuente
1

Creo que las otras respuestas son incorrectas o, en el mejor de los casos, poco prácticas.

Para proteger los datos en la base de datos y hacerlos accesibles solo por solicitud del usuario, podemos hacer lo siguiente.

Al registrarse el usuario, generamos dos hashes.

  • Hash A : nuestra contraseña, hash bcrypt, almacenada en la base de datos
  • Hash B : nuestra clave de cifrado, no es el mismo hash de contraseña, no se almacena en ninguna parte

Utilizamos Hash B para cifrar los datos del usuario.

Cuando un usuario inicia sesión, podemos crear Hash B. Podemos usar este hash para descifrar sus datos a petición. Este hash se puede mantener en la memoria del servidor o en un caché seguro del lado del cliente.

De esta manera, nos aseguramos de que todos los datos estén encriptados y que solo el usuario pueda acceder a ellos.

Si un usuario desea cambiar su contraseña, desciframos con el Hash B, volvemos a crear el Hash B y luego volvemos a cifrar el nuevo hash en la memoria y actualizamos la base de datos.

Si el usuario pierde u olvida su contraseña, perderá sus datos. Hay formas de protegerse contra esto.

La única forma de evitar que los administradores recojan datos o claves sin cifrar en algún momento es que el cliente encripte / desencripte en su extremo. El proceso que he descrito anteriormente es el enfoque más práctico para proteger los datos.

    
respondido por el cal97g 29.06.2016 - 15:48
fuente
-2

Las bases de datos son especialmente malas para esto.

Si los datos son tan críticos, no debería almacenar la información en una base de datos. Guarde un blob encriptado y descifre el lado del cliente (gpg ¿quizás?)

    
respondido por el Ángel 26.08.2014 - 00:34
fuente

Lea otras preguntas en las etiquetas