Obtenga actualizaciones, no presione
A medida que escala, será inviable realizar actualizaciones automáticas para todos sus productos.
- Tendrá que rastrear a cada cliente, que puede tener una configuración de firewall diferente.
- Tendrá que crear conexiones entrantes a través del firewall del cliente, lo que requeriría el reenvío de puertos o algún otro mecanismo similar. Esto es un riesgo de seguridad para sus clientes.
En su lugar, haga que sus productos "actualicen" sus actualizaciones periódicamente, y luego puede agregar capacidad adicional en el lado del servidor a medida que crece.
¿Cómo?
Este problema ya se ha resuelto, como sugirió. Aquí hay varios enfoques en los que puedo pensar.
- usando apt : use el sistema apt incorporado con un PPA personalizado y una lista de fuentes. ¿Cómo configuro un PPA?
- Contras: a menos que use un servicio de alojamiento público como launchpad, configurar su propio sistema de empaque PPA + apto no es para los débiles de corazón.
- usando ssh : genere una clave pública SSH para cada producto y luego agregue la clave de ese dispositivo a sus servidores de actualización. Luego, solo tiene su software
rsync
/ scp
los archivos requeridos.
- Con: tiene que rastrear (¡y hacer una copia de seguridad!) Todas las claves públicas para cada producto que envía.
- Pro : más seguro que una descarga sin formato, ya que los únicos dispositivos que pueden acceder a las actualizaciones serían aquellos con la clave pública instalada.
descarga sin procesar + verificación de firma :
- Publique un archivo de actualización firmado en alguna parte (Amazon S3, servidor FTP, etc.)
- Su producto verifica periódicamente el cambio del archivo de actualización y luego descarga / verifica la firma.
- Con : Dependiendo de cómo implemente esto, los archivos pueden ser accesibles públicamente (lo que puede hacer que su producto sea más fácil de realizar ingeniería inversa y piratear)
ansible : Ansible es una gran herramienta para administrar las configuraciones del sistema. Está en el ámbito de la marioneta / chef, pero no tiene agente (usa python) y está diseñado para ser idempotente. Si la implementación de su software requiere un script bash complicado, usaría una herramienta como esta para que sea menos complicado realizar sus actualizaciones.
Por supuesto, hay otras formas de hacer esto ... Pero me lleva a un punto importante.
¡Firma / valida tus actualizaciones!
No importa lo que haga, es imperativo que tenga un mecanismo para garantizar que su actualización no haya sido alterada. Un usuario malintencionado podría hacerse pasar por su servidor de actualizaciones en cualquiera de las configuraciones anteriores. Si no valida su actualización, su caja es mucho más fácil de hackear y entrar.
Una buena forma de hacerlo es firmar sus archivos de actualización. Tendrá que mantener un certificado (o pagarle a alguien para que lo haga), pero podrá instalar su huella digital en cada uno de sus dispositivos antes de enviarlos para que puedan rechazar las actualizaciones que han sido manipuladas.
Seguridad física
Por supuesto, si alguien tiene acceso físico a la implementación del cliente, fácilmente podría hacerse cargo del servidor. ¡Pero al menos no pueden atacar los otros despliegues! La seguridad física es probablemente la responsabilidad de su cliente.
Si quisiera por un momento, imagine lo que sucedería si usara una gran red OpenVPN para actualizaciones ... Luego podrían usar el servidor comprometido para atacar cada instancia en la VPN
Seguridad
Hagas lo que hagas, la seguridad debe incorporarse desde el principio. No cortes las esquinas aquí: si lo haces, te arrepentirás al final.
Asegurar completamente este sistema de actualización está fuera del alcance de esta publicación, y recomiendo contratar a un consultor si usted o alguien de su equipo no tiene conocimiento en esta área. Vale la pena cada centavo.