¿Cómo puedo evitar que mi base de datos se vea comprometida si mi aplicación CakePHP está comprometida?

2

Tengo un servidor de aplicaciones que aloja una aplicación CakePHP y un servidor de bases de datos que aloja las bases de datos. Los servidores están físicamente separados. Las bases de datos contienen información confidencial encriptada. Las claves de cifrado para los datos cifrados también se almacenan en la base de datos (que a su vez están cifradas). Las claves son descifradas por la aplicación para usarlas en descifrar la información de la base de datos.

Tengo la impresión de que si alguien comprometiera el servidor de la base de datos y robara las bases de datos, no podría descifrar los datos, ya que la aplicación (que está en un servidor diferente) tiene la clave de cifrado. El problema surge si alguien puede comprometer el servidor de aplicaciones. Si el servidor de la aplicación se ve comprometido, la información de conexión de la base de datos se almacena directamente en la aplicación CakePHP de la siguiente manera:

  

public $ default = array (

  'datasource' => 'Database/Mysql',
  'persistent' => false,
  'host' => 'xxx.xxx.xxx.xxx',
  'login' => 'login',
  'password' => 'password',
  'database' => 'database',
  'prefix' => '',
  //'encoding' => 'utf8',
     

);

¿Hay una manera de almacenar esta información de conexión de una manera más segura o es simplemente una cuestión de saber que si la aplicación está comprometida, la base de datos también está comprometida? ¿Hay algo que pueda hacer para mitigar las posibilidades de este tipo de compromiso en el que no haya pensado? ¡Gracias de antemano!

    
pregunta JadedCore 05.02.2014 - 20:38
fuente

3 respuestas

3

Si la aplicación está comprometida, la base de datos está comprometida incluso si puede ocultar las credenciales. Las credenciales de la base de datos solo deben ser válidas desde la dirección IP del servidor de la aplicación y si han comprometido mucho el servidor de la aplicación, simplemente pueden alterar el código de la aplicación para hacer lo que quieran si usted de alguna manera logró proteger las credenciales.

La clave es asegurarse de que las credenciales solo funcionen desde el servidor y que el usuario que utiliza la aplicación solo pueda afectar a la aplicación en sí misma en las formas en que la aplicación necesita interactuar con la base de datos.

Realmente, de todas formas es muy difícil ocultar las credenciales. Puede usar algo como un TPM, pero la aplicación necesita una forma de obtener acceso al TPM. A menos que no otorgue la autorización de la aplicación sin que el usuario proporcione las credenciales para la base de datos en sí, debe almacenarlas.

Dependiendo de cómo se accede a los datos confidenciales, es posible que también pueda utilizar el cifrado basado en el usuario. Con el cifrado basado en el usuario, utiliza la contraseña del usuario para derivar una clave que se utiliza para cifrar una clave segura. Esa clave segura se usa para desbloquear un conjunto de claves que contiene claves para acceder a los registros a los que el usuario tiene acceso. Dado que solo se puede acceder al conjunto de claves del usuario cuando el usuario está conectado, reduce la amenaza de un compromiso fuera de línea en el que tanto el servidor de aplicaciones como el servidor de bases de datos están en peligro.

Esto pone algunos límites a lo que se puede hacer mientras el usuario no ha iniciado sesión, aunque puede tener un sproc que tenga acceso para realizar algunas operaciones de descifrado utilizando un anillo de llaves maestras que solo está disponible en el servidor DB. pero tendrías que tener mucho cuidado de bloquear esa funcionalidad para evitar que se abuse de ella. (Por ejemplo, los límites de tasa en sprocs personalizados para cada tipo de consulta que necesita contra los datos protegidos).

    
respondido por el AJ Henderson 05.02.2014 - 22:43
fuente
1

Utilizar variables ambientales. Puede almacenar las credenciales de la base de datos como variables de entorno en su servidor, por ejemplo, en la configuración de apache o nginx para su aplicación. En ese caso, si su código está comprometido, entonces el atacante también tendría que violar los archivos de configuración del servidor web, que es otro nivel de seguridad. Hay complementos para hacer que esto funcione en CakePHP, por ejemplo, eche un vistazo a esta plantilla de aplicación:

enlace

En el ejemplo, recomiendan configurar las variables env dentro de un archivo, pero recomiendo hacerlo directamente en el servidor web.

    
respondido por el José Lorenzo Rodríguez 05.02.2014 - 23:22
fuente
0

Es mejor usar variables de entorno en este caso. Los uso todo el tiempo en el desarrollo de Django. Con los permisos correctos establecidos en el propio servidor, puede mitigar un compromiso directo con la base de datos.

enlace

    
respondido por el jmbmxer 05.02.2014 - 23:24
fuente

Lea otras preguntas en las etiquetas