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?