Cómo asignar una clave a una aplicación web para descifrar datos en una base de datos

0

Mi situación es que necesito almacenar datos confidenciales en una base de datos para una aplicación web. Los datos confidenciales incluyen elementos como tokens de actualización para sistemas Oauth2, claves secretas para otras API, etc.

Estoy tratando de construir esto asumiendo que un atacante ya tiene acceso al servidor y puede ver los binarios que ejecutan la aplicación (sin código fuente en el servidor), las variables de entorno y las bases de datos, etc.

Básicamente, lo que estoy tratando de proteger es que un atacante puede leer información confidencial de la base de datos.

Para hacer eso, asumo que necesito cifrar los datos antes de almacenarlos en la base de datos, pero esto me ha dejado con el problema de cómo proporcionar a la aplicación web las claves para cifrar y descifrar los datos en primer lugar.

Si un atacante ya tiene acceso al servidor, las variables de entorno, los archivos de configuración e incluso otros servidores que la aplicación puede hacer que las solicitudes HTTP parezcan inútiles porque el atacante podría hacer lo mismo que la aplicación para solicitar las claves de todos modos.

Por lo que puedo imaginar la implementación de un flujo de trabajo donde la aplicación solicita las claves no va a funcionar. En su lugar, necesito un flujo de trabajo donde a la aplicación se le asignen las claves.

Inicialmente, pensé que solo podía ingresar las teclas manualmente en el inicio de la aplicación y mantenerlas almacenadas en la memoria, pero el problema es que entonces tendría que intervenir manualmente para iniciar cada instancia de la aplicación. Idealmente, quiero que el inicio sea lo más automatizado posible, lo que significaría entregar las claves a algún tipo de script o algo así, en cuyo caso estoy de vuelta en el punto de partida.

Hasta ahora, la única forma en que se me ha ocurrido proporcionar la aplicación con claves de forma automática es implementar un punto final de algún tipo que pueda ser POST ed con las claves.

La idea es que inicie la aplicación en el servidor, pero la aplicación rechaza todas las solicitudes porque todavía no tiene las claves. Las claves se almacenan en una máquina separada en algún lugar; esta máquina podría estar en la oficina u otro servidor, etc.

La máquina con las claves y luego POST s al punto final de la aplicación para darle las claves a través de una conexión HTTPS y la aplicación almacena las claves en la memoria hasta que se reinicie, momento en el cual necesitará las claves POST ed a ella de nuevo.

Una vez que se hayan proporcionado las claves, la aplicación aceptará solicitudes como de costumbre y cerrará el punto final que aceptó las claves.

Esto significa que un atacante podría encontrar el punto final y probar las claves POST ing a sí mismo, pero es muy improbable que proporcionen las claves correctas de todos modos e incluso si la aplicación aceptara las claves en la pequeña ventana de tiempo donde el punto final estaría disponible, los datos descifrados serían incomprensibles de todos modos.

Así que ahora mis preguntas son, ¿estoy sobreestimando esto, y existe una forma mejor y estándar de la industria de proporcionar claves para una aplicación web con el fin de cifrar / descifrar datos en una base de datos?

Si no hay un método acordado para hacer esto, ¿sería factible mi idea y qué tipo de cosas estoy ignorando podrían debilitar la seguridad en lugar de fortalecerla?

    
pregunta Jake Lucas 20.12.2017 - 03:34
fuente

2 respuestas

1
  

Inicialmente, pensé que solo podía ingresar las teclas manualmente en el inicio de la aplicación y mantenerlas almacenadas en la memoria, pero el problema es que entonces tendría que intervenir manualmente para iniciar cada instancia de la aplicación.

Aunque la memoria solo es en la práctica notablemente más segura que en el disco, si tienen suficiente acceso a la máquina subyacente que ejecuta la aplicación, pueden tomar un volcado de memoria y sacar las llaves de allí.

  

Así que ahora mis preguntas son, ¿estoy sobreestimando esto, y existe una forma mejor y estándar de la industria de proporcionar claves para una aplicación web con el fin de cifrar / descifrar datos en una base de datos?

El mejor enfoque que he visto es tenerlos almacenados en el servidor de aplicaciones en un archivo de configuración que no es legible por el usuario que ejecuta la aplicación. Se pasan como argumentos o por IPC cuando se inicia la aplicación.

Esto significa que se requiere una escalada de privilegios en el servidor de aplicaciones para obtener las claves. Si el servidor DB está comprometido, las claves no están allí.

    
respondido por el Hector 20.12.2017 - 10:45
fuente
1

El núcleo de ASP.net está incorporado para el escenario que describe, que podría usar como un ejemplo de implementación en el marco de su elección.

Este artículo documenta una configuración de ejemplo de la Configuración de Azure KeyVault Proveedor .

Básicamente usa Azure KeyVault para almacenar tus secretos, asegurado mediante el Control de acceso basado en roles.

Luego tiene un proveedor de configuración que puede cargar la configuración de la aplicación desde la clave de la clave. El proveedor de configuración está autorizado para usar el valor de la clave a través de un "secreto de cliente" o certificado que normalmente se establecería durante la implementación de su aplicación (y no aparecerá en el control de origen).

Azure tiene en versión beta la capacidad para una " identidad de servicio administrado " lo que esencialmente significa que no tiene que preocuparse por distribuir el secreto del cliente o el certificado usted mismo.

Esto podría ser una exageración para su caso de uso. Es posible que desee simplemente tener un archivo de configuración cifrado (que lo proteja mientras está en el sistema de archivos) en el que la máquina pueda descifrar sobre la marcha.

    
respondido por el Alex KeySmith 20.12.2017 - 23:38
fuente

Lea otras preguntas en las etiquetas