Non sono d'accordo con il commento di @ JulianKnight, vi è un diverso insieme di rischi introdotto dalla nuova infrastruttura convergente. L'ultima volta che avevamo un'infrastruttura convergente, l'aspetto della rete dell'informatica era nelle sue fasi iniziali e le principali questioni di sicurezza riguardavano l'escalation dei privilegi. Lo abbiamo cambiato negli anni '90 con il design a strati: spesso con il livello frontend, il livello applicazione e il livello database.
Ora, il frontend layer è spesso l'unico esposto alla rete esterna. Altri livelli sono dietro un firewall NAT + e, quindi, più o meno protetti. Scontando le falle del firewall e perforando le vulnerabilità e ignorando le impronte digitali passive per la mappatura della rete, possiamo dire che i livelli interni sono gorgogliati all'interno di un rifugio più o meno sicuro.
Questo produce molte cattive pratiche come ascoltatori di database aperti, non autenticati. Ad esempio, supponendo che i server di database siano sicuri dal mondo esterno, gli amministratori di sistema abbandonano l'autenticazione tra i livelli dell'applicazione e del database. Ciò aumenta le prestazioni ma espone il database a un utente malintenzionato che può attraversare il firewall.
OK, ma non ho ancora parlato di infrastrutture convergenti. La nostra nuova tendenza (architettura convergente / iperconvergenza) spinge tutti i livelli indietro in una singola macchina. Ma non siamo più negli anni '80 o all'inizio degli anni '90, stiamo spingendo tutti i livelli dell'infrastruttura su una macchina che è strongmente interconnessa alla rete e spesso visibile da Internet. Riesco a vedere due enormi implicazioni:
1. La documentazione per l'infrastruttura a strati è fuorviante
Quando si configura l'infrastruttura convergente e si utilizza la documentazione scritta con un'infrastruttura a strati, è possibile che si cada preda di falsi sistemi di sicurezza. C'è molta documentazione (post di blog, tutorial, persino manuali ufficiali) che presuppone che i livelli interni dell'infrastruttura siano protetti da un firewall e prendano decisioni basate su questo.
Lasciare una porta del database non autenticata aperta nel livello del database dietro un firewall è brutta, ma può essere compensata dall'aumento delle prestazioni. Lasciare la porta aperta su una macchina che è visibile da Internet è decisamente terribile.
Ma la cattiva documentazione è un grosso rischio? Per l'infrastruttura convergente lo è certamente. La maggior parte dell'infrastruttura convergente è costruita in IaaS
/ PaaS
/ SaaS
, che a sua volta sono utilizzati da startup "veloci e sporche" che spesso hanno sviluppatori o sviluppatori inesperti che seguirebbero ciecamente una guida per fare le cose più velocemente.
Soluzione? Non fidarti della documentazione, usa il tuo buon senso. In altre parole, richiede la coscienza degli sviluppatori.
2. L'escalation dei privilegi è tornata in prima fila
Ma non nella stessa forma di prima. Prima (durante il periodo d'oro dell'escalation dei privati sui primi sistemi operativi multiutente) l'escalation dei privilegi era necessaria per superare le peculiarità del sistema operativo (ad esempio, traboccare un programma setuid). La differenza è che ora stiamo eseguendo macchine che sono strongmente collegate, incluse le connessioni sull'interfaccia di loopback.
Poiché stiamo eseguendo un'infrastruttura convergente, dov'è il firewall in esecuzione? Sulla stessa macchina.
Questo firewall sarà (molto probabilmente) molto permissivo a qualsiasi traffico sull'interfaccia di loopback. Se si dispone di un utente con privilegi bassi all'interno della macchina, è comunque libero di esplorare l'interfaccia di loopback. Se si lasciano le comunicazioni basate sulla rete tra quelli che precedentemente erano i livelli dell'applicazione da eseguire sull'interfaccia di loopback, qualsiasi utente non privilegiato può giocarci. E guarda indietro al punto 1 (documentazione fuorviante) sopra per vedere perché la comunicazione tra i pezzi di infrastruttura passerebbe attraverso l'interfaccia di loopback.
Soluzione? Usa la memoria condivisa per comunicare tra i livelli dell'infrastruttura sulla stessa macchina (proprio come le persone prima dell'approccio a livelli), la memoria condivisa ha le autorizzazioni impostate dal sistema operativo.