¿Overkill o apropiado? [cerrado]

0

Me he encontrado con una aplicación web que una empresa me ha pedido que reconstruya. Después de que se haya dicho y hecho toda la implementación, la implementaré en un servidor privado y la base de datos estará en su propio servidor privado. Administraré la comunicación entre los dos con cortafuegos y los datos de los servidores y la web estarán detrás de un equilibrador de carga. Mi pregunta es la siguiente: los datos que se recopilan son datos extremadamente confidenciales, ¿elijo las columnas de información confidencial y las cifro, porque antes de ahora no se han hecho así, o sería simplemente una exageración? Quiero almacenar de forma segura la información, pero puedo ser un poco intenso cuando se trata de mis preocupaciones.

Si la respuesta es no, es genial y me alegro de haberlo preguntado. Sin embargo, si la respuesta es afirmativa, ¿alguien sabe cómo actualizaría la información al nuevo cifrado necesario?

Los pasos deberían ser seleccionar toda la información, convertir las columnas de varchar a varbinary, cifrar los datos y, finalmente, volver a insertarlos en la base de datos.

La pila de desarrollo para el código a los datos que estoy usando es Java / MySQL.

    
pregunta Richard Davy 11.01.2015 - 18:27
fuente

2 respuestas

2

Admito completamente el cifrado de información confidencial mientras está almacenado. El cifrado de información confidencial en la base de datos impide que un atacante recopile información útil si ha obtenido la base de datos. Sin embargo, como siempre, la forma en que implementa el sistema de cifrado es de importancia crítica.

Primero debemos comparar y contrastar dos situaciones en las que la base de datos está comprometida:

  1. La situación uno ocurre cuando la base de datos se ha comprometido, pero el sistema de archivos sigue siendo seguro.
  2. La situación dos ocurre cuando tanto la base de datos como el sistema de archivos están comprometidos.

La situación uno es cuando el cifrado es el más útil. Este tipo de ataque ocurre cuando el atacante ha utilizado un método como la inyección SQL. Esto es ideal porque el atacante no tiene una clave / método de descifrado y tendría que aplicar una fuerza bruta a la clave de descifrado para obtener los datos (esto no debería ser factible).

La situación dos es mucho menos favorable. Este tipo de ataque ocurre cuando el atacante ha obtenido acceso al servidor (por ejemplo, acceso físico, FTP, SSH, etc.). Debido a que el atacante ha obtenido acceso al sistema de archivos, es probable que tenga la clave de descifrado, lo que significa que solo puede descifrar la base de datos y se acabó el juego.

Sin embargo, tiene una ventaja aquí porque tiene un servidor frontend y un servidor backend. Esto significa que puede implementar un diseño más seguro para protegerse contra la situación dos. Puede cifrar / descifrar en ambos servidores, lo que significa que el atacante tendría que comprometer ambos sistemas de archivos del servidor. Esto es lo que quiero decir: el servidor frontend puede cifrar los datos confidenciales con su propia clave; enviar esos datos al servidor de back-end; el servidor backend luego encripta los datos encriptados usando una clave diferente; y, finalmente, el servidor de back-end almacena los datos encriptados doble. El proceso de descifrado es justo lo contrario de esto: el servidor backend extrae los datos con doble cifrado; el servidor backend descifra la primera capa de cifrado y la envía al servidor frontend; el servidor front-end elimina la segunda capa de cifrado; finalmente, el servidor frontend muestra los datos confidenciales descifrados al usuario.

Todo lo dicho, como dice la respuesta de Kevinze, hay otras protecciones que deberían estar en su lugar. Debe utilizar HTTPS (SSL / TLS) para las comunicaciones entre el usuario y el servidor frontend. Esto evitaría MiTM (en la mayoría de los casos) y ayudaría a proteger las comunicaciones entre el cliente y el servidor. También debe considerar otras protecciones como el cifrado completo del disco. No puedo darle mucha información sobre esto, pero, por supuesto, agregaría protección al sistema de archivos.

En su pregunta, usted preguntó sobre la actualización de su base de datos y su conversión a una forma cifrada. Si estuviera en su posición, construiría una nueva base de datos para almacenar la información encriptada y luego escribiría un programa para leer todas las entradas de la base de datos anterior, iterar sobre ellas, cifrar las columnas confidenciales e insertarlas en la nueva base de datos. Aquí hay un pseudo-código:

All_Entries[][] = Fetch_Array_All_Entries(FROM_OLD_DATABASE); // Multidimensional Array

for(int i = 0; i < count(All_Entries); i++){
    thisEntry = All_Entries[i];
    encryptedEntry = new Array();
    encryptedEntry["Some Insensitive Column Name"] = thisEntry["Some Insensitive Column Name"];
    encryptedEntry["Sensitive Column 1"] = encryptColumn(Backend_Key, encryptColumn(Frontend_Key, thisEntry["Sensitive Column 1"]));
    encryptedEntry["Sensitive Column 2"] = encryptColumn(Backend_Key, encryptColumn(Frontend_Key, thisEntry["Sensitive Column 2"]));
    // ... Encrypt all sensitive columns and assign them to the encryptedEntry ...

    // Once all encryption is done:
    Insert_Array_Entry(TO_NEW_DATABASE, encryptedEntry);
} // end entry loop

Una vez que la nueva base de datos se haya actualizado con entradas cifradas, simplemente reemplace la antigua base de datos con la nueva.

Tu pregunta menciona el cambio de VARCHAR a VARBINARY . Esta es realmente su propia elección, pero podría continuar usando VARCHAR si convierte los bytes a un formato de cadena. Por lo general, los datos encriptados se muestran como una cadena Base64. Una vez más, tienes que tomar esa decisión por ti mismo, pero así es como probablemente lo haría.

    
respondido por el Spencer Doak 12.01.2015 - 21:37
fuente
1

El canal de comunicación entre el navegador y su servidor (básicamente cualquier canal a través de Internet) debe estar cifrado con TLS. Esto cifra y proporciona un canal seguro y autenticado.

Una vez que los datos hayan llegado de manera segura a su servidor de base de datos, debe emplear el cifrado en el almacenamiento del disco, ya que tiene la responsabilidad de proteger la información confidencial del cliente. Puede explorar el cifrado de disco completo (FDE) para su servidor, ya que debería ser más seguro que el simple cifrado de la base de datos (el sistema operativo debe estar cifrado). Agregue una capa de seguridad física (cerraduras de puertas, guardias de seguridad) y tendrá un ambiente profesional. El cifrado protege principalmente contra ataques sin conexión, por ejemplo, el servidor está comprometido físicamente, pero los datos siguen siendo ilegibles.

Después de implementar FDE, probablemente no necesite cifrar más las columnas de la base de datos individual porque no habrá mucho más beneficio. En una configuración realista, su base de datos no solo se encripta. También debe descifrar la información a pedido cuando sea necesario. Un atacante malintencionado puede explotar su servidor web de alguna manera para engañar a su servidor para que produzca la información desencriptada de todos modos. Cosas como las inyecciones de SQL, los scripts entre sitios y otros ataques "en línea" que posiblemente sean más comunes y más mortales. Echa un vistazo a las 10 principales amenazas aquí desde The Open Web Application Security Project.

enlace

    
respondido por el Kevin Lee 12.01.2015 - 19:48
fuente

Lea otras preguntas en las etiquetas