Che cosa si deve intendere per consumo di risorse?
Innanzitutto per capire da dove nasce la questione basta osservare la crescente offerta dei componenti elettronici che costituiscono un computer: a scadenze mensili, ormai, compaiono sul mercato processori più veloci, chip di memoria più capienti, supporti magneto-ottici più efficienti. Parallelamente il mercato del software, sia dei sistemi operativi che delle applicazioni, si evolve a ritmo incalzante, potendo usufruire di più risorse - di calcolo, di memoria, di banda di comunicazione.
Questo trend, che è prima di tutto una legge di mercato, non può che frustrare gli utenti, che spesse volte vedono i loro applicativi girare lentamente o al di sotto delle prestazioni attese, se non addirittura, per quelli che sono rimasti fermi a vecchi computer, non girare affatto.
Ma il problema affligge anche chi, pur disponendo degli ultimi ritrovati tecnologici, possiede un sistema di calcolo che deve offrire servizi a più utenti. Consideriamo ad esempio un sistema di calcolo commerciale, i cui server devono garantire, via Internet, determinati servizi (che chiameremo risorse logiche) agli utenti. In generale, il sistema eseguirà i suoi compiti in maniera più o meno efficiente, o efficace, a seconda del numero di richieste che deve soddisfare, e soprattutto della quantità di risorse -fisiche- che ha a disposizione per ogni richiesta.
Questi parametri determinano insomma la qualità del servizio offerto, che non dovrebbe mai scendere sotto una determinata soglia considerata di accettabilità. Se cioè il servizio scende sotto il livello di prestazioni atteso, a discapito magari anche degli altri utenti, risulta più conveniente non offrirlo affatto, o delegarlo ad altri server, in attesa di potenziare, con nuovo hardware, il proprio sistema di calcolo. E' l'hardware, che si trova a monte delle risorse logiche, ad essere in ultima analisi il punto critico di un sistema altamente scalabile.
Quando un server non riesce a soddisfare tutte le richieste degli utenti si dice che è coinvolto in un problema di denial-of-service (letteralmente, negazione di servizio). Generalmente ciò è dovuto al caso in cui uno o più utenti consumino in modo eccessivo le risorse fisiche delle macchine preposte al servizio, compromettendo le prestazioni dell'intero sistema e danneggiando così gli altri utenti. E' curioso notare come un attacco di questo tipo possa essere volontario (ad esempio a causa di un'applicazione maliziosa) oppure no (la causa può essere un errore di programma o un eccessivo numero di utenti), cosicché risulta difficile risolvere il problema mediante meccanismi e strumenti di sicurezza: accertarsi dell'identità di un utente e controllare le sue autorizzazioni ad eseguire determinate operazioni non è sufficiente ad evitare comportamenti anomali del codice eseguito.
Molti ricorderanno ad esempio quando pure un colosso come Yahoo fu vittima di un attacco di denial-of-service da parte dell'azione congiunta di 50 macchine collegate in Internet, che riuscirono a rendere praticamente inutilizzabile il sito per diverse ore con danni economici di alcuni milioni di dollari.
Ecco ad esempio alcuni campi di sviluppo gravemente a rischio di denial-of-service:
Quali soluzioni si possono attuare di fronte ad un rischio di denial-of-service, o più generalmente di un consumo eccessivo di risorse fisiche?
Alcune politiche di sicurezza possono limitare, ma non eliminare, i rischi. Un controllo degli accessi e delle autorizzazioni degli utenti non è in generale sufficiente a prevenire comportamenti anomali del codice, o comunque non può prevedere il verificarsi di situazioni critiche dal punto di vista delle prestazioni.
Si rende dunque necessaria la presenza di un monitor preposto che sia in grado di misurare il consumo delle risorse fisiche ritenute critiche e che sia in grado, in caso di situazioni di allarme, di eseguire delle azioni che recuperino il sistema e lo riportino in uno stato accettabile.
Ovviamente non può esistere una politica di recupero valida per tutti; questa dovrà essere mirata al tipo di applicazioni e al livello di qualità di servizio che si vuole mantenere.
Invece l'individuazione delle risorse fisiche da monitorare sembra abbastanza facile da individuare, complice la sostanziale somiglianza di tutte le architetture hardware su cui sono costruiti tutti i moderni sistemi di calcolo, a prescindere dal sistema operativo che utilizzano.
Si sta parlando, evidentemente, di: