Esta publicación en Asegurando los datos de la aplicación Java para Cloud Computing ofrece una buena introducción al uso de Java KeyStore para proteger los datos cifrados en la nube. Sin embargo, no responde a la pregunta fundamental, como se señala en uno de los comentarios: ¿cómo protegería la contraseña del almacén de claves en la nube?
Estamos diseñando una aplicación web SAAS en la nube pública de AWS, que tendrá muchos usuarios finales (escalada a millones). Todos los datos del usuario se cifrarán para cada usuario con el cifrado estándar. Las claves de cifrado protegidas por contraseña se almacenarán en un servidor de claves remoto y seguro, que requiere una clave secreta API para acceder. Básicamente, tiene el mismo problema que se señaló en la pregunta anterior, ya que la clave secreta de la API del servidor de claves se puede comparar directamente con la contraseña del almacén de claves: ¿cómo protegería la clave secreta de la API del servidor de claves en la nube?
Tenga en cuenta que nuestra aplicación web necesita acceso a esta clave secreta para que pueda obtener claves por usuario para cifrar y descifrar los datos del usuario. Estamos utilizando el cifrado simétrico AES-256, pero el problema fundamental sigue siendo incluso para una solución PKI, ya que todavía necesita proteger la clave privada. Tenga en cuenta también que podríamos usar un almacén de claves en lugar de un servidor de claves remoto, pero esto solo se reduce a la pregunta anterior y, de nuevo, el problema fundamental continúa.
Algunas restricciones adicionales:
- El almacenamiento del secreto en el servidor de claves seguro remoto es imposible, obviamente, ya que se usa para acceder a ese servidor de claves.
- El almacenamiento del secreto en el sistema de archivos en la nube es inseguro, ya que el punto principal es evitar que el secreto sea accesible para cualquiera que infrinja el sistema de archivos en la nube. (Si el sistema de archivos en la nube estuviera perfectamente seguro, no tendríamos que cifrar los datos allí). Además, dado que se espera que los recursos de la nube disminuyan y necesiten reiniciarse, confiar en la nube para guardar el secreto no es confiable.
- El almacenamiento del secreto en el código es inaceptable, por muchas razones, entre ellas: control de versión, almacenamiento de texto sin formato, ingeniería inversa, rotación de claves, etc. Consulte también ¿Debe un sitio web de código cerrado mantener una clave secreta en su fuente? .
- No es práctico almacenar el secreto en un HSM, ya que no podemos adjuntar uno a un servidor de nube virtual. Vea también Almacenamiento de 'secretos', keystores, HSMs y el resto .
- Almacenar el secreto fuera de la nube para que la aplicación la cargue de forma remota también es problemático: estamos buscando un enfoque basado únicamente en la nube para evitar tener que mantener servidores internos; la confiabilidad de la red no está garantizada; la autenticación de la solicitud de secreto del servidor en la nube en el servidor interno tiene sus propios problemas; etc.
- Se debe minimizar cualquier interacción manual, ya que queremos que los servidores se inicien y reinicien lo más automáticamente posible para reducir el tiempo de inactividad o los errores humanos. Mi conjetura es que la interacción manual puede ser necesaria.
Entonces, ¿cuál es la mejor práctica para almacenar un secreto en la nube? ¿Cómo debería una aplicación web cargar un secreto? Me interesaría particularmente una solución Java, pero este es un problema general en cualquier idioma.