Solution 1 :
Tirez les mises à jour, n'insistez pas
Au fur et à mesure que vous évoluerez, il deviendra impossible de faire pousser mises à jour de tous vos produits.
- Vous devrez suivre chaque client unique, qui peuvent chacun avoir une configuration de pare-feu différente.
- Vous devrez créer un élément incoming connexions via le pare-feu du client, ce qui nécessiterait une redirection de port ou un autre mécanisme similaire. Il s'agit d'un risque de sécurité pour vos clients
Au lieu de cela, demandez à vos produits de "tirer" leurs mises à jour périodiquement, puis vous pouvez ajouter une capacité supplémentaire côté serveur au fur et à mesure de votre croissance.
Comment ?
Ce problème a déjà été résolu, comme vous l'avez suggéré. Voici plusieurs approches auxquelles je peux penser.
- utiliser apt :Utilisez le système apt intégré avec un PPA personnalisé et une liste de sources. Comment configurer un PPA ?
- Inconvénient : À moins que vous n'utilisiez un service d'hébergement public comme Launchpad, la configuration de votre propre système d'empaquetage apt PPA + n'est pas pour les âmes sensibles.
- à l'aide de ssh :générez une clé publique SSH pour chaque produit, puis ajoutez la clé de cet appareil à vos serveurs de mise à jour. Ensuite, munissez-vous simplement de votre logiciel
rsync
/scp
les fichiers requis.- Inconvénient : Vous devez suivre (et sauvegarder !) Toutes les clés publiques pour chaque produit que vous envoyez.
- Pro :Plus sécurisé qu'un téléchargement brut, puisque les seuls appareils pouvant accéder aux mises à jour seraient ceux sur lesquels la clé publique est installée.
-
téléchargement brut + vérification de signature :
- Publier un fichier de mise à jour signé quelque part (Amazon S3, serveur FTP, etc.)
- Votre produit vérifie périodiquement si le fichier de mise à jour doit être modifié, puis télécharge/vérifie la signature.
- Con :Selon la manière dont vous le déployez, les fichiers peuvent être accessibles au public (ce qui peut faciliter la rétro-ingénierie et le piratage de votre produit)
-
ansible :Ansible est un excellent outil de gestion des configurations système. C'est dans le domaine de la marionnette / chef, mais sans agent (utilise python) et conçu pour être idempotent. Si le déploiement de votre logiciel nécessitait un script bash compliqué, j'utiliserais un outil comme celui-ci pour simplifier l'exécution de vos mises à jour.
Bien sûr, il existe d'autres façons de procéder. Mais cela m'amène à un point important.
Signez / validez vos mises à jour !
Quoi que vous fassiez, c'est impératif que vous disposez d'un mécanisme pour vous assurer que votre mise à jour n'a pas été altérée. Un utilisateur malveillant pourrait se faire passer pour votre serveur de mise à jour dans l'une des configurations ci-dessus. Si vous ne validez pas votre mise à jour, votre box est beaucoup plus facile à pirater et à pénétrer.
Une bonne façon de le faire est de signer vos fichiers de mise à jour. Vous devrez conserver un certificat (ou payer quelqu'un pour le faire), mais vous pourrez installer votre empreinte digitale sur chacun de vos appareils avant de les expédier afin qu'ils puissent rejeter les mises à jour qui ont été falsifiées.
Sécurité physique
Bien sûr, si quelqu'un a un accès physique au déploiement du client, il peut facilement prendre en charge le serveur. Mais au moins, ils ne peuvent pas attaquer les autres déploiements ! La sécurité physique est probablement la responsabilité de votre client.
Imaginez un instant ce qui se passerait si vous utilisiez un grand réseau OpenVPN pour les mises à jour... Ils pourraient alors utiliser le serveur compromis pour attaquer chaque instance sur le VPN
Sécurité
Quoi que vous fassiez, la sécurité doit être intégrée Depuis le début. Ne coupez pas les coins ronds ici - vous le regretterez à la fin si vous le faites.
La sécurisation complète de ce système de mise à jour n'entre pas dans le cadre de cet article, et je recommande fortement de faire appel à un consultant si vous ou un membre de votre équipe n'êtes pas compétent dans ce domaine. Cela vaut chaque centime.
Solution 2 :
Avez-vous réellement besoin d'y accéder ?
Ou simplement les mettre à jour ? Parce que vous pouvez les mettre à jour eux-mêmes, de la même manière qu'apt se met à jour de lui-même sans surveillance.
Si vous devez vous connecter
Pourquoi pas un démon OpenSSH écoutant via la redirection de port ? Chaque client peut avoir une clé distincte pour la sécurité et ne sera connecté qu'en cas de besoin.
À vos clients
Vous devez également tenir compte de ce que le client est prêt à accepter. Ils peuvent ne pas être à l'aise avec un accès à distance à leur réseau, ou seulement à l'aise avec des technologies/configurations spécifiques.
Solution 3 :
Je suggère un outil d'orchestration comme Puppet ou Salt.
Salt est une file d'attente de messages et peut établir une connexion sortante persistante de votre appareil à un serveur maître. Vous pouvez l'utiliser pour exécuter des commandes arbitraires sur les appliances... comme un apt-get
.
L'autre option est Puppet, où vous avez toujours un serveur maître et les clients établissent des connexions sortantes à partir de leurs emplacements.
J'utilise ces deux outils dans un but similaire où je n'ai peut-être pas le contrôle administratif du pare-feu.