Memcached è sicuramente un ottimo modo per rendere la propria infrastruttura informatica molto potente e con una serie di interessanti caratteristiche. In effetti si va a parlare di uno strumento di memorizzazione nella cache di memoria distribuita con alte prestazione.
Indice dei contenuti
Tra le caratteristiche che questo particolare strumento possiede è la sua natura generica ma progettato proprio in ottica del funzionamento delle applicazioni. Nello specifico si va a parlare di una maggiore attenzione rispetto alla velocità delle applicazioni web diventando decisamente più reattive perché va a sgravare il software del “peso” dei database che non di rado potrebbe essere anche molto gravoso.
Per comprendere meglio la funzione di questo strumento si potrebbe pensare ad una sorta di memoria momentanea che serve come una sorta di aiuto per l’applicazione nel caso di bisogno. Questo strumento quindi consente di attingere la memoria da parti del proprio sistema proprio dove serve.
Ma non solo perché questo prodotto permette di adoperare al meglio la memoria di cui si dispone. E’ possibile pensare a due differenti scenari nei quali questo strumento possa essere molto utile. Nel primo il nodo risulta essere completamente indipendente mentre nel secondo i nodi possono aver bisogno di una maggiore richiesta di memoria rispetto agli altri.
Nel primo caso si va a parlare di uno scenario abbastanza comune andando ad illustrare una strategia classica di distribuzione delle risorse. Questa comunque non sembra la soluzione migliore andando a parlare di costi benefici perché si rischia di non sfruttare al massimo le funzionalità che questo strumento riesce ad ottenere una piccola parte della memoria di cui si necessita.
Inoltre mantenere la cache coerente con tutti i vari nodi richiederà uno sforzo davvero molto importante. Ciò significa che adoperandolo in questo modo tutte le ottime caratteristiche memcached vengono completamente azzerate.
Uno tra gli elementi interessanti è senza dubbio la possibilità di avere tutti i server che vanno ad operare sul medesimo pool virtuale di memoria. Il risultato in poche parole è che i dati potranno sempre essere archiviati e reperiti nella medesima allocazione del cluster del server.
Ciò si andrà quindi a determinare una serie di interessanti ripercussioni positive perché i dati saranno più facilmente reperibili nella medesima allocazione. Inoltre proprio mediante questo particolare tipo di lavoro si potranno ad avere delle maggiori doti di sicurezza.
Non bisogna inoltre dimenticare il fatto che prima o poi la propria piattaforma andrà a scalare e ciò significa che dovranno essere aggiunti nuovi server. Ciò non farà altro che aumentare la necessità di movimentare e gestire una grande quantità di dati cosa che andrà ad impattare sul sistema.
Vi sono comunque due interessanti opportunità rispetto a questa situazione poiché da una parte aumentando le macchine aumenta anche la quantità di memoria a disposizione per amministrare le richieste di dati inoltre con memcached si va a rendere questa operazione decisamente meno problematica.
Bisogna comunque tenere presente che sempre più spesso si va a determinare la scelta della configurazione della rete. Sempre più spesso si decide di dedicare alla gestione dei dati un server dedicato. Ciò può sicuramente portare ad una serie di interessanti vantaggi.
Come vedremo tra poco non vi sono molti problemi nell’installazione quindi, sebbene non consigliabile, questa operazione potrebbe essere conclusa anche da personale mediamente esperto.
La scelta migliore nell’installazione e l’uso del memcached è l’uso di un sistema operativo con installato Ubuntu, Debian o Fedora. Vediamo quindi come è possibile installare memcached davvero in poco tempo:
- Ubuntu e Debian: apt-get install memcached;
- Fedora: yum install memcached;
La necessità di avere un sistema operativo aggiornato sta nel fatto che solo in questo modo è possibile avere un prodotto di ottimo livello e maggiormente sicuro.
Il problema sta nel fatto che del software non correttamente aggiornato non hanno beneficiato delle patch necessarie per migliorare la sicurezza delle applicazioni. Gli aggiornamenti possono essere inoltre molto utili per inserire una serie di funzionalità nuove che vanno a migliorare le prestazioni dell’applicazione.
Si deve quindi tenere presente che vi sono delle opportunità che possono andare a creare un sistema decisamente più potente.
Installare memcached da sorgente
Oltre ai comandi che abbiamo visto in precedenza è possibile scaricare ed installare questa applicazione anche tramite il sorgente ma in questo caso memcached dipende da “libevent” quindi tradotto in comando si ha:
- su Ubuntu e Debian: apt-get install libevent-dev
- su Fedora: yum install libevent-devel
Tutto il lavoro fatto però non serve a nulla senza un client.
Tutto ciò che è stato fatto fino ad ora però potrebbe risultare assolutamente inutili. Il fatto che mediante questa procedura si installa unicamente il demone che quindi entra in funzione ma non può essere controllato in nessun modo e che ha comunque il ruolo solo di conservare le coppie chiave/valore. Per poter cominciare ad adoperare in modo completo questo strumento è l’installazione del client. Anche in questo caso si va a parlare di un prodotto non difficile da installare e comunque disponibile per praticamente tutte le lingue.
Come configurare memcached?
Prima di tutto è necessario da subito controllare il file “ protocol.txt” della versione di memcached che si sta adoperando perché lì si trovano una serie di informazioni riguardanti i comandi perché vengono aggiornati con una buona regolarità quindi per esser sicuri di avere a disposizione sempre i comandi più aggiornati.
Gli argomenti della riga di comando
Prima di tutto è necessario tenere presente che questo strumento ha una sua documentazione su moltissimi argomenti riguardanti la linea di comando. Anche in questo caso ci si trova di fronte ad una soluzione estremamente utile ma nello stesso tempo facile da adoperare.
Per far partire la guida in linea, ricordiamo che è sempre aggiornata, è sufficiente digitare a riga di comando: memcached -h. Se invece si decide di partire con la configurazione di questo strumento si deve fare molta attenzione principalmente a -m, -d e -v.
Il discorso è abbastanza semplice e comunque si parla di questi tre elementi perché permetteranno di controllare le caratteristiche della macchina o meglio come questa dovrà interagire con lo strumento di amministrazione della memoria. Vediamo qual è nello specifico il significato e l’utilizzo:
- -m : in questo caso si va a parlare di memoria e nello specifico quanta memoria dev’essere messa in condivisione. In questo caso si andrà a determinare lo spazio di archiviazione che deve essere messo in condivisione per far funzionare questo strumento. Nello specifico si va a parlare di memoria di tipo random access, RAM, e deve essere definito in MB. È necessario notare come questo non sia un limite invalicabile ma la macchina va ad allocare più spazio qualora vi fosse la necessità. Naturalmente la memoria minima dovrebbe essere di 64 MB;
- -d : questo valore potrebbe anche non essere usato perché non sempre è poi così importante anche se vi sono alcuni elementi che lo rendono necessario. In sostanza il compito di questo argomento è quello di demonizzare. È consigliabile adoperarlo anche per comprendere meglio come funziona con tutte le sue varie caratteristiche;
- -v : serve per controllare la ridondanza in SYDOUT / STDERR. È molto interessante soprattutto se si è interessati a conoscere le varie informazioni che vengono prodotte sulle richieste che vengono effettuate a memcached.
Come accennato in precedenza è sempre bene andare ad informarsi bene riguardo le varie caratteristiche e le nuove funzionalità e l’unico modo per farlo è tenere d’occhio le note di rilascio.
Lo script di inizializzazione
Se memcached è stato installato dalla gestione dei pacchetti allora probabilmente verrà installato anche lo script di inizializzazione che fornisce una serie di metodi alternativi per configurare tutte e varie opzioni di avvio di memcached. Se hai deciso di fare questa operazione senza chiamare una persona esperta è possibile comunque avere una serie di esempi di configurazione dello script infatti nella directory “scripts” .
Networking
Per ciò che concernono le connessioni questo strumento è in ascolto per definizione con TCP. Vi sono comunque una serie di elementi che permettono di modificare molti aspetti anche se è probabilmente un problema dal punto di vista della sicurezza web perché memcached non ha particolari difese.
Da ciò ne consegue che diventa prioritario tenere presente che non si deve mai “esporre” questo strumento direttamente ad internet in modo che non vi siano problemi di accessi non autorizzati.
Proprio per questo motivo viene adoperata l’autenticazione SASL anche se nemmeno in questo caso si può avere la certezza di una sufficiente sicurezza. Vediamo quindi quali sono i vari argomenti per i protocolli di connessione:
TCP
-p : viene utilizzato per cambiare la porta d’ascolto della connessione ma è necessario ricordare che modificando la porta TCP verrà modificata anche quella UDP
UDP
Questo protocollo è molto utile per il recupero, la manipolazione e l’impostazione di oggetti di piccole dimensioni ma assolutamente inutile per quelli di dimensioni più grandi. Per disattivarlo è sufficiente impostarlo sullo 0. Questa è una buona opzione soprattutto se si hanno dei problemi riguardo la sicurezza informatica.
Socket Unix
Questo strumento è davvero molto utile se si ha intenzione di limitare l’accesso ad un demone da parte di un singolo utente locale. Anche mediante questo particolare elemento è possibilenascondere il demone dalla rete.
Il limite di connessione
Un altro importante elemento per fare in modo che memcached possa funzionare senza alcun tipo di intoppo.
Questo strumento è molto è settato per 1024 connessioni simultanee, si parla di un punto molto importante perché una perfetta configurazione è molto importante poiché le connessioni in più andranno comunque ad attendere la liberazione degli slot di memoria.
È possibile controllare l’andamento di questa caratteristica adoperando “listen_disabled_num”. Comunque è possibile scalare con grande semplicità naturalmente andando a scalare i server.
Threading
Mediante il threading è possibile modificare il memcached tra tutte le CPU presenti nel server. In questo modo questo strumento sarà più veloce andando a gestire le connessioni simultanee molto più facilmente.
Inoltre grazie alle sue ottime doti di scalabilità è possibile gestire al meglio un grande numero di client. Confrontato quindi con altre soluzioni questa appare decisamente più potente anche con un numero basso di thread.
L’impostazione di default vengono allocati 4 thread e normalmente dovrebbero essere sufficienti ma la facilità di scalare porta ad un facile assegnazione ulteriori risorse all’applicazione anche se in questo caso si dovrà mettere in conto una usa minore reattività.
Protocollo Standard
Il protocollo standard di memcached implica l’esecuzione di un comando su un particolare elemento. L’elemento è composto dai seguenti componenti:
- una chiave ovvero una stringa arbitraria con una lunghezza fino ad un massimo di 250 byte. Non devono essere presenti spazi o nuove righe in modalità ASCII;
- un valore “flag” da 32bit;
- un tempo di scadenza espresso in secondi;
- un valore “CAS” a 64 bit. Si tratta di un elemento facoltativo che può essere completamente con -C.
Cosa succede in assenza di una risposta?
Non è raro che alcuni comandi non rilascino una risposta al loro uso perché quelli basati sul codice ASCII permettono una versione “noreply”. Questa tipologia di comandi non dovrebbe essere adoperata perché potrebbe risultare molto complicato andare ad allineare le richieste con gli errori.
Alcune volte vengono adoperati perché è possibile adoperare comandi di mutazione, come per esempio add e set, senza dover attendere la risposta del comando.
Il protocollo binario invece va ad implementare molto bene le istruzioni “noreply”, chiamate anche silenziose, se quindi si ha un client che usa questo protocollo è consigliato il suo uso.
Comando di archiviazione
Finalmente entriamo nel vivo dei comandi per memcached e non si può non iniziare da quelli per l’archiviazione, vediamoli nello specifico:
- set: è tra tutti il comando più comune e più autorizzato in assoluto. Ha lo scopo di memorizzare i dati, magari sovrascrivendo quelli esistenti. I nuovi elementi inseriti appaiono in cima alla LRU;
- add:memorizza i dati solo ed esclusivamente se questi non sono già presenti. Come per il precedente anche in questo caso i nuovi elementi vanno in cima alla LRU. Nel caso dovesse essere inserito un dato già presente questo non verrà sovrascritto ma lo fa salire in cima alla LRU;
- replace: viene usato molto di rado anche perché necessita di una serie di argomenti rischiando di aumentare i rischi di errori. Il suo lavoro consiste nel memorizzare i dati solo se questi sono già presenti;
- append: aggiunge i dati dopo l’ultimo byte in un elemento già esistente. È molto adoperato ed utile alla gestione delle liste;
- prepend: inserisce nuovi dati prima dei dati esistenti;
- cas:è l’acronimo di Check and Restore. Si tratta di un’operazione che serve a memorizzare i dati dall’ultima volta che sono stati letti. È molto utile in moltissime situazione;
Comandi di recupero delle informazioni
Questi sono comandi molto importanti perché è possibile avere un set di informazioni in qualsiasi occasione. Vediamo quali sono e come funzionano:
- get:questo è il comando di recupero dei dati per eccellenza perché prende una o più chiavi e restituisce tutti gli elementi trovati;
- gets: questo comando è alternativo al primo e deve essere adoperato con CAS;
- delete:se esiste elimina l’elemento dalla cache;
- incr/decr:significano incremento e decremento. Se un elemento memorizzato rappresenta una stringa da 64 bit è possibile adoperare incr o decr per rispettivamente aumentare o diminuire quel numero. Non accetta numeri negativi;
I comandi delle statistiche
Vi sono una serie di comandi che rilasciano dei contatori e delle impostazioni del server memcached. Questi sono controllati tramite molti strumenti oppure con telnet e netcat.Vediamo quindi quali sono nello specifico:
- stats: permette di avere a disposizione le statistiche di base del server;
- stats item: restituisce alcune informazioni sugli elementi archiviati in memcached;
- stats slabs: restituisce un maggiore numero di informazioni sugli elementi archiviati;
- stats sizes: mostra come verrebbero distribuiti i vari elementi all’interno di ogni settore se fossero da 32 bit. È comunque altamente sconsigliabile adoperare questo strumento perché nel caso vi fossero molti elementi da controllare potrebbero andare a bloccare tutto il sistema con seri problemi per il funzionamento del server con gravi ripercussioni su tutta l’infrastruttura;
- frush all: invalida tutti gli elementi della cache esistenti in quel momento. Inoltre come accetta facoltativamente un parametro che serve per indicare dopo quanti secondi effettuare l’operazione. A differenza del precedente flush all non va ad interferire in alcun modo con il server. Infatti non libera o svuota la memoria e non mette in pausa il server. Semplicemente fa scadere gli elementi che sono all’interno dopo un determinato periodo di tempo.
Dopo aver parlato dei vari comandi che fanno funzionare in modo corretto e personalizzato il server memcached ma purtroppo è necessario mettere in conto anche i vari pericoli che internet ci mette di fronte.
Purtroppo è necessario sempre ricordare che la rete riesce a nascondere una serie di problemi abbastanza seri tenendo presente che purtroppo ci sono molti malintenzionati che tentano di creare dei problemi informatici cercando di carpire informazioni per poi effettuare delle truffe o molto più semplicemente per bloccare il normale funzionamento delle caratteristiche della propria infrastruttura informatica.
Come vedremo tra poco c’è principalmente un attacco che normalmente viene portato contro questo tipo di infrastruttura ed è il DDOS. Si tratta in effetti di un cosiddetto “attacco di amplificazione”, come il NTP o DNS. Nello specifico si va ad inviare una serie di richieste di spoofing verso un server vulnerabile. La risposta dello stesso non può che essere l’invio di una grande quantità di informazioni maggiori, anche di molto, rispetto alla richiesta iniziale andando ad aumentare di molto il volume di traffico.
A questo punto il server non potendo reggere il traffico crasha. Questo tipo di attacco è valido anche per i server memcached ma solo se hanno la possibilità di operare tramite il protocollo UDP. Questo è un protocollo che permette di l’invio di dati senza ottenere l’handshake ovvero il processo di rete in cui entrambi le parti accettano la comunicazione.
Molto spesso questo protocollo viene adoperato per l’host di destinazione non viene mai consultato riguardo la disponibilità o meno di ricevere i dati. In questo modo sarà possibile avere un trasporto di dati di grande quantità al computer obiettivo andando a snellire non di poco tutta l’operazione.
Come funziona un attacco su un server memcached?
Per un utente più o meno esperto non è particolarmente difficile perché dopo aver trovato un server esposto immette un file di grandi dimensioni quindi va a falsificare la richiesta GET con l’indirizzo IP della vittima che è stata designata.
A questo punto il server memcached risponderà con una risposta decisamente eccessiva. A questo punto il server o l’infrastruttura informatica di destinazione non sarà in grado di elaborare l’invio dei dati bloccando tutte le richieste, anche le altre, ottenendo appunto la negazione del servizio.
Mitigazione del rischio informatico
Disabilitare il protocollo UDP
Abbiamo appena visto che il protocollo UDP può potenzialmente mettere a rischio il funzionamento della propria infrastruttura informatica.
Per questo motivo se proprio non si ha il bisogno è meglio disabilitarlo. È bene tenere presente che dalla versione 1.5.6 questo l’UDP viene disabilitato di default essendo l’unico o almeno uno dei pochi a mettere a serio rischio la sicurezza di questo servizio.
Può comunque essere disabilitato aggiungendo agli argomenti -U 0. Se invece si usa un file di configurazione si può disabilitare il protocollo UDP aggiungendo al file /etc/memcached.conf i seguenti argomenti:
-U 0
quindi salvare nella stessa posizione e riavviare il servizio. Se si adopera il sistema operativo Ubuntu è possibile verificare la corretta configurazione usando netstat. Per far ciò è sufficiente eseguire il seguente comando:
$ sudo netstat -plunt
Se il risultato che ne scaturirà attesterà che memcached sta adoperando il protocollo TCP per dialogare il lavoro è finito. A questo punto una grossa falla di questo strumento è stata neutralizzata.
Usare il firewall nel server memcached, conviene davvero?
Sicuramente il primo obiettivo di coloro che amministrano una qualsiasi struttura informatica è mettere in sicurezza tutti gli elementi in modo da non mettere a rischio l’attività ed i dati personali degli utenti. In questo caso abbiamo giù visto come supplire al problema dell’UDP.
Ma per avere un maggiore livello di sicurezza bisogna è necessario mettere in sicurezza il sistema anche con un firewall. Se si utilizza una macchina locale è possibile limitare al 127.0.0.1 come indirizzo d’ascolto se invece si parla di un server che si deve connettere ad un elevato numero di computer o ad una rete privata è possibile connettersi ad un IP riservato.
Per modificare questo elemento è necessario sempre spostarsi su /etc/memcached.conf e lanciare il comando:
–listen 127.0.0.1 per farlo comunicare sul localhost. È interessante comunque ricordare che in sistemi operativi come Ubuntu e Debian l’impostazione di default per la connessione di memcached è proprio in localhost.
Il firewal è comunque sempre consigliato perché tra le varie funzionalità impedisce al traffico esterno di raggiungere il server memcached.
Conviene adoperare quindi memcached?
Alla fine dei conti bisogna tenere presente che questo strumento è assolutamente insostituibile per creare una struttura informatica di un certo livello con la sicurezza e la flessibilità che solo memcached è in grado di offrire.
È comunque necessario tenere presente che bisogna avere un certo livello di amministrazione del server non solo per ciò che concerne la sicurezza ma anche per tutti gli altri aspetti dell’infrastruttura.
In questa guida vi abbiamo spiegato un set di elementi molto utili per risolvere vari problemi ma è comunque bene non improvvisarsi e non tuffarsi immediatamente in un lavoro del genere.
È sempre bene mettere in pratica il principio di precauzione quindi partire con uno studio approfondito magari facendo effettuare le operazioni più complicate a persone già esperte.