Gestione del cluster di computer Linux dietro i firewall


19

Il prodotto della mia azienda è essenzialmente un box Linux (Ubuntu) presente nella rete di qualcun altro che esegue il nostro software. Fino ad ora avevamo meno di 25 scatole in natura e abbiamo usato TeamViewer per gestirle.

Stiamo per spedire 1000 di queste scatole e TeamViewer non è più un'opzione. Il mio compito è capire un modo per accedere a queste caselle e aggiornare il software su di esse . Questa soluzione dovrebbe essere in grado di perforare i firewall e cosa hai.

Ho considerato:

1. Soluzione cresciuta in casa (ad es. Un servizio Linux) che stabilisce un tunnel inverso SSH verso un server nel cloud e un altro servizio nel cloud che tiene traccia di questi e ti consente di collegarti a loro.

Questo ovviamente richiede molta manodopera e, francamente, sembra reinventare la ruota poiché molte altre aziende devono aver già incontrato questo problema. Anche così, non sono sicuro che faremo un ottimo lavoro.

2. Strumenti come pupazzo, cuoco o OpenVPN

Ho cercato di leggere il più possibile, ma non riesco a penetrare abbastanza nel marketing, per capire l'ovvia scelta con cui andare.

Nessun altro, tranne noi, deve collegarsi a queste caselle. C'è qualcuno con esperienza pertinente che può darmi alcuni suggerimenti?


2
"Non siamo in procinto di nave" => "Siamo ora in procinto di nave"?
Bob

Risposte:


23

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/ scpi 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.


2
Secondo me l'uso di Ansible è a metà strada nella complessità tra script di shell e gestione della configurazione in stile Puppet / Chef in piena regola e ha la raffinatezza di fare cose più complesse di un semplice aggiornamento del software (come suggerito dalla domanda che dice " gestire").
RichVel

Se segui il percorso di utilizzo di Ansible, puoi scriverlo per eseguirlo su 'localhost' e non richiederà l'accesso SSH a nessuna delle macchine gestite. Configuralo per essere un cronjob e sei d'oro.
BobTuckerman,

1
A proposito: se si desidera eseguire il proprio pacchetto server fpme aptlysono due ottimi strumenti che semplificano molto la creazione e l'hosting dei propri pacchetti. Ho appena passato questo processo di recente ed è stato molto carino.
BobTuckerman

10

Hai davvero bisogno di accedervi?

O semplicemente aggiornarli? Perché puoi farli aggiornare da soli, in modo simile al modo in cui gli aggiornamenti apt sono autonomi.

Se devi effettuare l'accesso

Perché non un demone OpenSSH in ascolto tramite port forwarding? Ogni cliente può avere una chiave separata per la sicurezza e sarebbe collegato solo quando necessario.

Fino ai tuoi clienti

Devi prendere in considerazione anche ciò che il cliente è disposto ad accettare. Potrebbero non essere a proprio agio con alcun accesso remoto alla propria rete, o solo con tecnologie / configurazioni specifiche.


4
Questo. con 1000 requisiti dei clienti diversi almeno alcuni non vorranno una connessione openvpn permanente ai tuoi uffici. Idealmente, dovresti provare a farli aggiornare se / come / quando rilevano una nuova versione (da un file in un bucket AWS S3, diciamo. Questo è quello che facciamo.
Sirex

@Sirex - Uno svantaggio dell'utilizzo di un bucket S3 è che non esiste una whitelist IP semplice che il cliente può utilizzare per bloccare quel server in modo che possa raggiungere solo il bucket che contiene l'aggiornamento. Alla fine abbiamo dovuto impostare un server di aggiornamento con un indirizzo IP pubblico statico in modo che i clienti potessero utilizzare i filtri IP per controllare con cosa quel server può parlare. (AWS pubblica tutti i loro blocchi IP, quindi è teoricamente possibile impostare un filtro che consenta l'accesso solo alle risorse AWS, ma che è eccessivamente ampio per questo caso d'uso)
Johnny

Non abbiamo gli aggiornamenti su S3, ma abbiamo un file di testo che descrive in dettaglio quale è la versione più recente, utilizzata dall'app per fornire i messaggi banner "aggiorna disponibile". I clienti possono quindi attivare (nel nostro caso manualmente) il download dell'ultima versione, nel nostro caso da un servizio chiamato fetchapp.
Sirex,

9

Suggerisco uno strumento di orchestrazione come Puppet o Salt .

Salt è una coda di messaggi e può stabilire una connessione in uscita permanente dall'appliance a un server master. Puoi usarlo per eseguire comandi arbitrari sugli apparecchi ... come unapt-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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.