Actualmente estoy creando una aplicación cuya única complejidad real reside en la seguridad de la clave privada. No me siento cómodo manteniendo la clave privada en la imagen del disco, desde la cual el servidor la leería, así que pensé en crear un "servicio de firma" dedicado que escuche una conexión entrante en el arranque, desde el cual reciba la clave privada a través de HTTPS desde un servidor fuera de línea, que se conectará a Internet brevemente, para enviar la clave privada al servicio web. Este servicio imitaría, efectivamente, un Módulo de seguridad de hardware (HSM), pero al costo de una máquina virtual en la nube, que es una fracción de la de un HSM.
Además de esto, el servicio de firma, que recibe la clave privada de esta manera, expondrá una interfaz segura, en lugar de una interfaz que permite la firma de mensajes arbitrarios. Así, por ejemplo, el servicio podría configurarse para exponer una interfaz que acepta una lista de transacciones que pagan a un conjunto predefinido de "direcciones de recepción", y luego el servicio devolverá una transacción firmada que mueve el valor de todos estos reciben direcciones a la clave privada que controla.
En otras palabras, la clave privada residiría en el espacio de memoria de la aplicación que solo expone una interfaz segura, lo que requiere que un atacante ponga en peligro la máquina virtual en la que se está ejecutando esta aplicación y lea la clave privada del espacio de memoria. del proceso de solicitud. La penetración en el entorno de la nube, por lo tanto, no causaría la pérdida de la clave privada ni permitiría al atacante firmar mensajes arbitrarios.
Preguntas:
- ¿Tiene sentido este enfoque? ¿Ofrece una ganancia en seguridad?
- ¿Qué problemas relacionados con la seguridad debo tener en cuenta al enviar la clave privada al servicio web?
- Relacionado con IP: el programa que envía la clave privada al servicio web se enviaría según la dirección IP del servicio web. ¿Qué tan difícil sería para un atacante recibir estos datos, destinados al servicio? ¿Debo configurar una VPN entre la red desde la que se enviará la clave y el entorno de nube?
- Google Cloud tiene un HTTPS load balancer , que puede proporcionar a su La clave privada de HTTPS se colocará frente a su aplicación y le enviará solicitudes aleatorias, lo que pondrá a Google a cargo de autenticar las máquinas virtuales que se ejecutan en el entorno de la nube (desde donde nuestro servicio de firma recibirá la clave privada). Por lo tanto, si 1) nos conectamos a la IP del servicio de firma (para armarlo con la clave privada) y 2) verificamos que el certificado es auténtico, significaría que un atacante tendría que comprometer el servicio de proxy HTTPS de Google Cloud para recibir la clave privada, por 1) el intermediario de la conexión destinada a la máquina virtual y 2) el uso de la clave privada de Google Cloud para firmar la solicitud HTTPS como auténtica. ¿Tendría esto sentido como una forma de externalizar la seguridad de la clave privada? (El atacante también puede realizar un robo de clave privada al ejecutar su propia imagen de disco en nuestro entorno de nube, que solo se envía a sí mismo la clave privada recibida, pero esto podría evitarse al requerir que las imágenes de disco que se ejecutan en nuestro entorno de nube estén firmadas con una clave que también se mantiene fuera de línea (por ejemplo, en el mismo lugar que la clave privada del servicio de firma)
Entonces, el HSM (la máquina virtual que ejecuta el servicio de firma) 1) expone una interfaz segura para la firma de mensajes y 2) mantiene la clave privada en el mismo espacio de memoria que la lógica que restringe su uso. Un Amazon AWS HSM cuesta alrededor de $ 10,000 / año, por lo que, de hecho, esto imitaría tal dispositivo a una fracción del costo (siempre que sea seguro).