Actualmente tengo el siguiente diseño:
- Servidor alojado en la nube central con una API REST
- Múltiples servidores remotos, cada uno con una API REST
Los datos se envían desde los servidores remotos al servidor central a intervalos regulares.
Los comandos se envían desde el servidor central a servidores remotos individuales en forma de POST a la API REST que se ejecuta en el servidor remoto.
Estoy preocupado por la seguridad. Lo más importante es evitar que se emitan comandos no autorizados a los servidores remotos.
Actualmente estoy usando autenticación basada en token. Cada servidor remoto tiene un token sin vencimiento emitido por el servidor central que se almacena en un archivo de configuración en el sistema de archivos del servidor remoto. Este token se pasa en el encabezado de Autorización de las solicitudes POST que se originan en el servidor remoto.
La otra dirección de comunicación funciona de manera similar. Cada servidor remoto genera un token para el servidor central que se almacena en una base de datos relacional en la misma red que el servidor de la nube central.
Mis problemas con este diseño:
- Si la base de datos está en peligro, el atacante puede emitir comandos a los dispositivos remotos: esencialmente estoy almacenando contraseñas en texto sin formato en la base de datos
- Si el sistema de archivos de un dispositivo remoto está comprometido, el atacante obtiene acceso al token
¿En qué formas puedo mejorar este diseño? La comunicación desde el servidor de la nube central al dispositivo remoto no tiene por qué ser una API REST. Parece que lo que necesito es una especie de apretón de manos bidireccional entre los dos servidores. ¿Cómo se puede lograr eso con una API REST?
Algunas notas:
- Ambos apis de descanso se sirven a través de HTTPS
- Los dispositivos remotos a menudo pierden la conectividad a Internet por períodos de tiempo
- Los dispositivos remotos corren el riesgo de ser robados físicamente
Algunas cosas que he considerado:
- Podría conectar todos los servidores a la base de datos alojada central y usar eso para la comunicación. Esto no parece ideal porque parece un riesgo de seguridad al tener estos dispositivos remotos conectados directamente a la base de datos. Además, los servidores remotos a menudo pierden conectividad.
- Restrinja el acceso a los servidores remotos a una lista blanca de direcciones IP, incluido el servidor remoto central