Cuando hice esto, aparté el cifrado del servidor web por completo. Básicamente he tenido el siguiente escenario
- Un servidor de base de datos que almacena el
datos encriptados
- Un servidor web que
ejecuta la aplicación y
almacena / recupera datos encriptados
- Un servidor criptográfico que realiza la
cifrado y descifrado y que
está bloqueado
Básicamente, el servidor web llama a un servicio web en el servidor criptográfico, que solo está disponible en una red interna y dice "Aquí hay algunos datos y el tipo de datos". El servidor criptográfico toma una decisión sobre el tamaño de la clave, la caducidad de la misma, etc. según el tipo de datos, la cifra con una nueva clave simétrica y sal y devuelve un blob binario más un identificador de clave. Luego, el servidor criptográfico almacena la clave en su propia base de datos SQL, pero primero la protege con un certificado X509, al que solo tiene acceso el servicio criptográfico, por lo que si logra acceder a la base de datos de forma remota, es inútil, ya que todavía necesitará acceso al sistema operativo. para obtener el certificado X509 para descifrar las claves, y en cualquier caso, los datos se guardan en otro lugar.
Las contraseñas de administrador del servidor de cifrado se guardan en un "cuadro de interrupción" donde se necesitan dos personas separadas para combinar sus partes para obtener la contraseña.
Esto significa que los desarrolladores no tienen que preocuparse por los algoritmos que deben usar o el almacenamiento seguro de claves, ya que el servidor criptográfico se encarga de ellos, y usted puede actualizar los algoritmos utilizados a medida que su proceso cambia o surgen nuevas reglas sin tener que para actualizar cualquier cosa que no sea el servidor criptográfico. Solo el proceso que ejecuta la aplicación web puede llamar al servidor de cifrado, las cuentas de usuario normales o incluso las cuentas de administrador no pueden. Los administradores de bases de datos que pueden ver la base de datos web solo ven datos encriptados y tampoco pueden acceder a las claves.
Incluso si el servidor web está comprometido, todavía está limitado en lo que puede hacer, llame al servidor de cifrado para obtener las claves y luego llame a la base de datos de almacenamiento de datos para obtener los datos a los que se refieren las claves. Es difícil de hacer si el compromiso es simplemente la capacidad de ejecutar código arbitrario, sin saber cómo suceden estas cosas o dónde se encuentran los servidores en la red interna.
Por supuesto, si el compromiso es un arraigo, y el atacante puede tomar su código y hacerse pasar por procesos, todas las apuestas están desactivadas, pero ese siempre será el caso.