¿Cómo puedo asegurar las claves de los datos almacenados en una aplicación web de Python contra la violación del servidor?

2

Estoy creando una aplicación REST para almacenar credenciales: claves GitHub y otros datos confidenciales (que pueden ser cargados por el usuario de la aplicación web). Estoy buscando una forma óptima de proteger los datos, pero no entiendo cómo reducir el riesgo de seguridad en caso de que la base de datos / servidor de aplicaciones web esté comprometido.

Actualmente estoy viendo la siguiente solución:

  • Las credenciales cifradas se almacenan en la base de datos de la aplicación.

  • Las claves de cifrado de las credenciales se almacenan en una base de datos separada detrás de un firewall.

  • Esto, cuando lo veo, debería reducir el riesgo si la base de datos de la aplicación está comprometida.

La base de datos es PostgreSQL y es probable que el servidor sea Apache2 + wsgi.

¿Tiene sentido esta arquitectura? ¿Es redundante? ¿Qué se puede mejorar en cuanto al almacenamiento de las claves de cifrado? ¿Qué herramientas recomendaría para este caso de uso? Gracias de antemano!

    
pregunta Alex Bausk 07.10.2016 - 10:17
fuente

1 respuesta

1

La clave para responder a esta pregunta radica en pensar qué acceso tiene su aplicación web principal y qué podría suceder si un atacante pudiera reprogramarlo para hacer lo que quiera.

Este experimento mental muestra rápidamente que la única forma de evitar completamente que los datos confidenciales que se filtran en este escenario sea que la aplicación web nunca los vea, por ejemplo, cifrándolos en el cliente con una clave conocida solo por el cliente. Este enfoque es a menudo poco práctico para aplicaciones web. Sin embargo, se utiliza para algunas aplicaciones como las copias de seguridad en la nube.

Sin embargo, no todo está perdido. Uno todavía puede reducir drásticamente los riesgos de una pérdida masiva de todos los datos confidenciales en el sistema de varias maneras.

1. Almacene los datos cifrados, pero no almacene las claves.

En el caso de que el servidor se vea comprometido, el atacante solo obtiene los datos cifrados. En el funcionamiento normal, el usuario puede proporcionar la clave, por ejemplo, como su contraseña. Esto tiene la desventaja de que si un usuario pierde su contraseña, también perderá sus datos.

2. Coloque los datos confidenciales (o claves) en un servidor separado, detrás de un firewall accesible solo a través de una API restrictiva.

La clave de este enfoque es diseñar la API restrictiva de modo que, si un atacante obtiene acceso para llamarla comprometiendo la aplicación web principal, esté limitado en lo que puede recuperar. Hay muchas formas de lograrlo, pero las ideas básicas son las de cualquier servicio. Estas son algunas de las cosas que debe considerar si implementa una API de este tipo:

  • Requerir autenticación (como el usuario final relevante)
  • No proporcionar API de exportación masiva
  • Mantenga la API simple para reducir el riesgo de errores de programación
  • solicitudes de límite de tasa
respondido por el Anthony 07.10.2016 - 11:02
fuente

Lea otras preguntas en las etiquetas