¿Debo cifrar los datos en la base de datos?

13

Tengo un cliente, para el que haré una aplicación web sobre atención al paciente, administración de pacientes, consultas, historial, calendarios, todo sobre eso básicamente.

El problema es que se trata de datos confidenciales, historial del paciente y demás.

El cliente insiste en cifrar los datos en el nivel de la base de datos, pero creo que esto va a deteriorar el rendimiento de la aplicación web. (Pero tal vez no debería estar preocupado por esto)

He leído las leyes sobre protección de datos en temas de salud (Portugal), pero no es muy específico sobre esto (solo les pregunté sobre esto, estoy esperando su respuesta).

He leído el siguiente enlace , pero mi pregunta es diferente, debo cifrar los datos en la base de datos o no.

Un problema que preveo al cifrar los datos, es que voy a necesitar una clave, esta podría ser la contraseña del usuario, pero todos sabemos cómo son las contraseñas de los usuarios (12345, etc.) y generar una clave. tiene que almacenarlo en algún lugar, esto significa que el programador, dba, ¿qué podría tener acceso a él, algún comentario al respecto?

Incluso agregar un salt al azar a la contraseña del usuario no resolverá el problema ya que siempre puedo acceder a él y, por lo tanto, descifrar los datos.

    
pregunta Tio 30.11.2012 - 04:59

7 respuestas

7

Yo personalmente revisaría las leyes sobre esto. Si los datos necesitan estar cifrados, entonces deben estar cifrados.

Sin embargo, si no recibe ninguna orientación, me gustaría proteger el vínculo entre el paciente y sus datos. Es decir. lo más probable es que tenga un PatientID que se usa en tablas en toda la base de datos. PatientID no identifica a un paciente, solo el historial médico del paciente, etc. Sin embargo, para identificar el PatientID como Joe Bloggs que vive en la Rua de São Bernardo Lisboa, mantendré esto en un DB separado si puedo. Use TDE para los datos personales del paciente y considere cifrarlo además de eso utilizando claves en su aplicación web.

Aunque el robo de esa información médica sin los medios para identificar a los pacientes será extremadamente embarazoso, es poco probable que sea algo más allá de eso. Hay literalmente competiciones en línea que utilizan esta información médica anónima.

Con la separación de los datos médicos de los datos personales del paciente. Use un conjunto robusto de roles para limitar al personal solo a lo que necesitan. Con la excepción del personal médico que necesita tratar con el paciente directamente (enfermeras y médicos de primera línea), nadie debe tener acceso a ambos. Los recepcionistas solo necesitan los datos personales del paciente, el personal del laboratorio solo necesita el registro médico y PatientID, las enfermeras quirúrgicas solo tienen una condición médica actual y su nombre.

Cuando haya identificado cada conjunto de roles, intente no solo implementarlos en su aplicación web, sino también en la base de datos, así como en una capa adicional de seguridad.

    
respondido por el M Afifi 30.11.2012 - 10:05
11

Sí, debes cifrar la base de datos.

El cifrado básico de los datos almacenados ("datos en reposo") es un principio de seguridad generalmente aceptado, y es probable que sea obligatorio por ley si su país tiene leyes que protegen la información personal o de salud.

Estamos utilizando SQL Server 2008, por lo que usamos TDE de Microsoft; puede haber alguna solución de terceros para MySQL o tal vez solo funcione un enfoque de encriptado de volumen general (como TrueCrypt) (aunque me gustaría tener algo que haya sido certificado para su uso con una base de datos).

Si se hace correctamente, el impacto del rendimiento debería ser pequeño.

Por cierto, el enlace que mencionó (en relación con la separación de información confidencial) es algo que debe considerar además del cifrado básico de la base de datos.

EDITAR: El cifrado mencionado anteriormente cifraría el volumen. Si alguien robara el disco duro, encontraría la información encriptada. Sin embargo, si alguien hiciera consultas en la base de datos, vería los datos no cifrados (por eso mencioné la separación de información, aunque el OP no quería discutir esto).

Tenga en cuenta que esta recomendación es lo mínimo que debe hacer. Si desea asesoramiento legal, entonces, por supuesto, deberá buscar en otra parte. Si desea una discusión más detallada sobre la escritura de código seguro, empezaría con el libro Escribir código seguro .

    
respondido por el jdigital 30.11.2012 - 06:13
7

Ignorar por un momento lo que el cliente está pidiendo y cualesquiera que sean las leyes ...

No, probablemente no deberías cifrar los datos. Si lo haces, no podrás buscarlo fácilmente. Por ejemplo, ¿cómo buscaría un apellido like 'Smith%' si cada entrada de nombre está cifrada? ¿Cómo graficaría la presión arterial de un paciente a lo largo del tiempo si no puede select .... from.... where patient_id = N ?

Obviamente, debe asegurarse de que el servidor esté bien protegido, que la conexión a la red esté protegida y que la interfaz del usuario esté bien protegida (incluidos los tiempos de espera de sesión para que los usuarios no puedan abandonar el acceso a cualquiera que use su computadora). También es posible que desee cifrar las copias de seguridad de la base de datos. Y asegure físicamente la sala en la que se encuentra el servidor. Pero no cifraría los datos en vivo.

Aclaración: Esto supone que lo que el OP estaba preguntando es en realidad cifrar los datos en la base de datos. No es el sistema de archivos en el que reside la base de datos.

    
respondido por el GrandmasterB 30.11.2012 - 05:34
6

Antes de decidir sobre estos asuntos de seguridad, debe evaluar el modelo de amenaza. Sin una idea de contra qué te defiendes, cualquier medida que tomes tendrá poco valor.

Ahora, hay algunas cosas de las que podría preocuparse en este contexto:

  • Los atacantes obtienen acceso físico a sus datos (por ejemplo, ingresando al centro de datos, robando cintas de respaldo, etc.)
  • Los atacantes que obtienen acceso de lectura a su base de datos sin procesar
  • atacantes que comprometen su aplicación, por ejemplo, a través de inyección SQL, saturación de búfer, etc.

Para el primer escenario, el almacenamiento de la base de datos y todas las copias de seguridad en volúmenes cifrados debería funcionar, siempre que el servidor no tenga acceso a la cabeza: robar el servidor o las cintas requeriría romper el cifrado a nivel de disco.

Para el segundo escenario, el cifrado de datos de la base de datos ayuda, pero solo si no almacena las claves o frases de contraseña necesarias en cualquier lugar.

En el tercer escenario, todo depende del contexto en el que ocurra el ataque: si es, por ejemplo, un ataque XSS o CSRF, entonces un atacante puede hacer todo lo que pueda hacer el usuario legítimo y no puede cifrar sus datos. ayuda en absoluto.

Su modelo de amenazas, por lo tanto, es un atacante que obtiene acceso de lectura a la base de datos sin procesar, ya sea encontrando las credenciales de inicio de sesión y logrando iniciar sesión en el servidor de la base de datos desde el exterior, o obteniendo acceso de root al servidor de la base de datos. Una ruta típica es obtener primero acceso de shell en el servidor web; desde allí, un atacante puede leer las credenciales de acceso del archivo de configuración y conectarse a la base de datos.

Una consideración adicional es dónde guardas las claves y las frases de contraseña, especialmente si estás utilizando una plataforma con un modelo de ejecución sin estado como PHP. Lo ideal es que el cliente escriba su contraseña cuando sea necesario, y la guarde solo en la memoria, o incluso mejor, realice el descifrado del lado del cliente (pero esto no suele ser posible). En una plataforma sin estado, el estado generalmente se realiza mediante sesiones, memcache, bases de datos o archivos sin formato; pero todos estos son mucho más vulnerables que mantener el estado en la propia memoria de una aplicación web con estado. Evitar esto es un problema de la gallina y el huevo, porque si encripta el estado antes de persistir, simplemente creó otro secreto que debe recordar de manera segura. Recordar la contraseña en el cliente y enviarla junto con cada solicitud que lo necesite puede ser la solución menos horrible en ese momento; el cliente sigue siendo vulnerable si tiene alguna fuga de XSS y necesita tomar las precauciones habituales (servir solo https, configurar todas las cookies como httponly y seguras, etc.), pero esos son problemas que tiene de todos modos.

    
respondido por el tdammers 30.11.2012 - 09:38
1

Si desarrolla la aplicación web con cuidado utilizando un marco MVC efectivo como CakePHP. Zend o Rails, entonces debería poder habilitar / deshabilitar el cifrado en el nivel modal de datos.

CakePHP, por ejemplo, tiene algunos ejemplos de comportamientos para modales que cifran datos. Hacer que el proceso sea transparente para los controladores y las vistas.

Ignorar los problemas relacionados con la indexación y otros problemas técnicos de la base de datos al hacer esto. Debería ser posible tener esto como una opción configurable.

Además, activaría el cifrado más tarde o solo en el servidor de producción. Los datos cifrados son difíciles de depurar y trabajar mientras se desarrollan, y solo se pueden realizar en ciertas columnas.

    
respondido por el cgTag 30.11.2012 - 09:48
1

Sí, debes cifrar la base de datos.

Dado que se trata de información personal y confidencial, definitivamente creo que debería hacerlo.

De la contraseña, puede derivar una clave de cifrado que solo almacena para la sesión. De esa manera, no se almacena en ningún lugar y nadie (incluidos los DBA) puede saberlo, ya que nadie puede saber la contraseña tampoco. Cualquier persona que intente ver la base de datos directamente estará mirando engaño. La única forma de corromper esto es mediante el secuestro de sesión, pero supongo que las sesiones también son seguras.

    
respondido por el dagnelies 30.11.2012 - 15:48
-1

Me pregunto por qué el cliente le pide que cifre la base de datos? Si le pidiera que protegiera los datos, estaría de acuerdo, pero ya tiene en mente una implementación implícita. Entonces, mientras no sepa exactamente de qué está hablando, solo está lanzando palabras de moda desde mi punto de vista.

También me parece muy inútil cifrar la base de datos, porque estoy convencido de que, literalmente, todos los principales DBMS tienen en cuenta la seguridad de manera apropiada y probablemente mejor que tú. Para acceder a la base de datos a través del DBMS necesitaría credenciales. En el caso de una base de datos cifrada, también necesitaría esas credenciales, y para descifrar los datos necesitará esas credenciales que ya parece tener.

Siguiendo esta mentalidad, propongo dejar que el DBMS maneje la seguridad y hacer esfuerzos para proteger las credenciales desde la entrada del usuario hasta el acceso a la base de datos, también puede imponer contraseñas seguras y cambios periódicos.

    
respondido por el sschrass 09.02.2016 - 10:25

Lea otras preguntas en las etiquetas