Tirare aggiornamenti, non spingere
Man mano che si ridimensiona, diventerà impossibile effettuare aggiornamenti push a tutti i tuoi prodotti.
- Dovrai tracciare ogni singolo cliente, che potrebbe avere ciascuno una diversa configurazione del firewall.
- Dovrai creare connessioni in entrata 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, chiedi ai tuoi prodotti di "estrarre" periodicamente i loro aggiornamenti, quindi puoi aumentare la capacità sul lato server man mano che cresci.
Come?
Questo problema è già stato risolto, come hai suggerito. Ecco diversi approcci a cui riesco a pensare.
- usando apt : usa il sistema apt incorporato con un PPA personalizzato e un elenco di fonti. Come si configura un PPA?
- Contro: A meno che non utilizzi un servizio di hosting pubblico come launchpad, Configurare il tuo sistema di packaging apt PPA + non è per i deboli di cuore.
- usando ssh : genera una chiave pubblica SSH per ciascun prodotto, quindi aggiungi la chiave di quel dispositivo ai tuoi server di aggiornamento. Quindi, basta avere 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 firma :
- Pubblica un file di aggiornamento firmato da qualche parte (Amazon S3, server FTP, ecc.)
- Il prodotto verifica periodicamente la modifica del file di aggiornamento, quindi scarica / verifica la firma.
- Contro : a seconda di come lo distribuisci, i file potrebbero essere accessibili pubblicamente (il che potrebbe rendere più facile la decodifica e l'hacking del tuo prodotto)
ansible : Ansible è un ottimo strumento per la gestione delle configurazioni di sistema. È nel regno del burattino / chef, ma è privo di agenti (usa Python) e progettato per essere idempotente. Se la distribuzione del software richiederebbe uno script bash complicato, utilizzerei uno strumento come questo per rendere meno complicato eseguire gli aggiornamenti.
Certo, ci sono altri modi per farlo. Ma mi porta ad un punto importante.
Firma / convalida i tuoi aggiornamenti!
Indipendentemente da ciò che fai, è indispensabile 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 delle configurazioni di cui sopra. Se non convalidi l'aggiornamento, la tua casella è molto più facile da hackerare ed entrare.
Un buon modo per farlo è firmare i file di aggiornamento. Dovrai conservare un certificato (o pagare qualcuno per farlo), ma sarai in grado di installare l'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 le altre distribuzioni! La sicurezza fisica è probabilmente la responsabilità del cliente.
Se per un momento immaginassi 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 integrata fin dall'inizio. Non tagliare gli angoli qui - te ne pentirai alla fine se lo fai.
La protezione completa 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 questo settore. Vale ogni centesimo.