Soluzione 1:
Trascina gli aggiornamenti, non spingere
Man mano che ridimensioni, diventerà impossibile fare push aggiornamenti a tutti i tuoi prodotti.
- Dovrai monitorare ogni singolo cliente, ognuno dei quali potrebbe avere una diversa configurazione del firewall.
- Dovrai creare incoming connessioni attraverso il firewall del cliente, che richiederebbe il port forwarding o qualche altro meccanismo simile. Questo è un rischio per la sicurezza dei tuoi clienti
Invece, fai in modo che i tuoi prodotti estraggano periodicamente i loro aggiornamenti e poi puoi aggiungere ulteriore capacità lato server man mano che cresci.
Come?
Questo problema è già stato risolto, come hai suggerito. Ecco diversi approcci che mi vengono in mente.
- usando apt :Usa il sistema apt integrato con un PPA personalizzato e un elenco di fonti. Come imposto un PPA?
- Contro: A meno che tu non utilizzi un servizio di hosting pubblico come il launchpad, configurare il tuo sistema di pacchettizzazione apt PPA + non è per i deboli di cuore.
- usando ssh :genera una chiave pubblica SSH per ogni prodotto, quindi aggiungi la chiave del dispositivo ai server di aggiornamento. Poi, prendi il tuo software
rsync
/scp
i file richiesti.- Contro: Devi tenere traccia (e fare il backup!) di tutte le chiavi pubbliche per ogni prodotto che invii.
- Pro :Più sicuro di un download non elaborato, poiché gli unici dispositivi che possono accedere agli aggiornamenti sarebbero quelli con la chiave pubblica installata.
-
download non elaborato + controllo della firma :
- Pubblica un file di aggiornamento firmato da qualche parte (Amazon S3, server FTP, ecc.)
- Il tuo prodotto controlla periodicamente la modifica del file di aggiornamento, quindi scarica/verifica la firma.
- Con :a seconda di come lo distribuisci, i file potrebbero essere accessibili pubblicamente (il che potrebbe rendere più semplice il reverse engineering e l'hacking del tuo prodotto)
-
ansibile :Ansible è un ottimo strumento per la gestione delle configurazioni di sistema. È nel regno del burattino / chef, ma è senza agenti (usa Python) e progettato per essere idempotente. Se la distribuzione del tuo software richiedesse uno script bash complicato, utilizzerei uno strumento come questo per rendere meno complicato eseguire i tuoi aggiornamenti.
Naturalmente, ci sono altri modi per farlo... Ma questo mi porta a un punto importante.
Firma / convalida i tuoi aggiornamenti!
Qualunque cosa tu faccia, è imperativo di disporre di un meccanismo per garantire che l'aggiornamento non sia stato manomesso. Un utente malintenzionato potrebbe impersonare il tuo server di aggiornamento in una qualsiasi delle configurazioni di cui sopra. Se non convalidi il tuo aggiornamento, la tua casella è molto più facile da violare ed entrare.
Un buon modo per farlo è firmare i file di aggiornamento. Dovrai mantenere un certificato (o pagare qualcuno per farlo), ma sarai in grado di installare la tua impronta digitale su ciascuno dei tuoi dispositivi prima di spedirli in modo che possano rifiutare gli aggiornamenti che sono stati manomessi.
Sicurezza fisica
Naturalmente, se qualcuno ha accesso fisico alla distribuzione del cliente, potrebbe facilmente assumere il controllo del server. Ma almeno non possono attaccare gli altri schieramenti! La sicurezza fisica è probabilmente responsabilità del cliente.
Immagina per un momento cosa accadrebbe se utilizzassi una grande rete OpenVPN per gli aggiornamenti... Potrebbero quindi utilizzare il server compromesso per attaccare ogni istanza sulla VPN
Sicurezza
Qualunque cosa tu faccia, la sicurezza deve essere incorporata dall'inizio. Non prendere scorciatoie qui:alla fine te ne pentirai se lo fai.
La completa protezione di questo sistema di aggiornamento non rientra nell'ambito di questo post e consiglio vivamente di assumere un consulente se tu o qualcuno del tuo team non siete esperti in quest'area. Vale ogni centesimo.
Soluzione 2:
Hai davvero bisogno di accedervi?
O semplicemente aggiornarli? Perché puoi fare in modo che si aggiornino da soli, in modo simile a come apt si aggiorna autonomamente.
Se devi effettuare il login
Perché non un demone OpenSSH in ascolto tramite port forwarding? Ogni cliente può avere una chiave separata per la sicurezza e sarà connesso solo quando necessario.
Ai tuoi clienti
È necessario prendere in considerazione anche ciò che il cliente è disposto ad accettare. Potrebbero non sentirsi a proprio agio con alcun accesso remoto alla propria rete o solo a proprio agio con tecnologie/configurazioni specifiche.
Soluzione 3:
Suggerisco uno strumento di orchestrazione come Puppet o Salt.
Salt è una coda di messaggi e può stabilire una connessione in uscita persistente dall'appliance a un server principale. Puoi usarlo per eseguire comandi arbitrari sulle appliance... come un apt-get
.
L'altra opzione è Puppet, dove hai ancora un server principale e i client effettuano connessioni in uscita dalle loro posizioni.
Uso entrambi questi strumenti per uno scopo simile in cui potrei non avere il controllo amministrativo del firewall.