Quiero crear un sistema de software distribuido con los siguientes elementos:
- Un número de trabajadores , que administran datos potencialmente confidenciales y ejecutan código en nombre de varios clientes.
- Varios clientes , que pueden enviar comandos a los trabajadores.
- Una autoridad de confianza central , que otorga el derecho a ejecutar acciones sobre un trabajador dado a un cliente.
En una operación típica, el cliente se pondría en contacto con la autoridad de confianza y solicitaría la autorización para ejecutar una operación en un trabajador. La autoridad de confianza autentificaría al cliente y, si tiene éxito, otorgará la autorización. El cliente luego se conectaría al servidor de trabajo y emitiría el comando solicitado, presentando la autorización que se obtuvo anteriormente. El servidor trabajador podría verificar la validez de la autorización para la operación solicitada y, si tiene éxito, realizarla.
X.509 parece un ajuste natural para este tipo de problema, y la solución más simple que se me ocurrió es la siguiente:
- La autoridad de confianza utiliza un certificado X.509 para entregar autorizaciones a los clientes, firmándolos con la clave privada del certificado.
- El cliente transmite la autorización firmada de la autoridad de confianza al servidor de trabajo.
- El servidor del trabajador descarga el certificado público del servidor de la autoridad de confianza y usa su clave pública para validar la autorización proporcionada por el cliente.
Para implementar esto, proporcionaría una API REST basada en HTTPS en el servidor de autoridad de confianza. Usando esta API, el servidor del trabajador podría descargar el certificado de clave pública y validarlo localmente contra un certificado de nivel superior (si fue firmado por una CA). Usando la clave pública obtenida de esta manera, el trabajador podría validar una autorización recibida de un cliente.
Para obtener una autorización, un cliente podría usar otro punto final de API en la autoridad de confianza, a la que proporciona todos los detalles relevantes del comando dado y el servidor de trabajo. El servidor de confianza respondería con una autorización firmada que el cliente puede transferir al servidor de trabajo.
(en todos los pasos anteriores, asumo que la comunicación entre todas las partes se puede asegurar y validar utilizando algún tipo de TLS)
Mi pregunta con respecto a esta configuración es triple:
- ¿Es este un enfoque razonable? Si no, ¿qué sería?
- ¿Contra qué posibles escenarios de ataque sería vulnerable este esquema?
- ¿Hay implementaciones de referencia de código abierto de dicho sistema?