DB fate largo ai No-SQL

nosql_logoI Database NoSQL

NO-SQL è un movimento che negli ultimi anni si è molto affermato, producendo dei risultati soddisfacenti con la creazione di progetti e iniziative utilizzate anche su larga scala. Tale movimento vuole “rompere” la storica linea dei database relazionali e definire delle nuove linee guida per l’implementazione di database che non utilizzano il linguaggio di interrogazione SQL e non siano strettamente legati ad una definizione “rigida” dello schema dati.
La filosofia del NO-SQL si può riassumere nei seguenti punti, partendo dalla domanda “Perchè avere altri DBMS se esistono quelli relazionali?”:

  1. I database relazionali sono troppo costosi e spesso, quelli che svolgono bene il loro lavoro, sono solo commerciali. NO-SQL abbraccia totalmente la filosofia open-source;
  2. NO-SQL è semplice da usare e non occorre uno specialista di DBMS. Il paradigma di programmazione è, infatti, ad oggetti;
  3. I dati sono altamente portabili su sistemi differenti, da Macintosh a DOS;
  4. Non definisce uno schema “rigido” (schemaless) e non occorre prototipare i campi, per cui non esistono limiti o restrizioni ai dati memorizzati nei database NO-SQL;
  5. Velocità di esecuzione, di interrogazione di grosse quantità di dati e possibilità di distribuirli su più sistemi eterogenei (replicazione dei dati), con un meccanismo totalmente trasparente all’utilizzatore;
  6. I DBMS NO-SQL si focalizzano su una scalabilità orizzontale e non verticale come quelli relazionali.

A questo punto passiamo a fare una comparazione tra quelli che attualmente sono tra i piu’ utilizzati , quali :

Cassandra, MongoDB, CouchDB, Redis, Riak, HBase, Membase e Neo4j :

** (vedi anche precedente articolo Not Only Sql)
– CouchDB

Scritto in: Erlang
Punto principale: Consistenza DB consistency, facilità d’uso
Licenza: Apache
Protocolli: HTTP/REST
Replicazione bidirezionale continua o ad-hoc con individuazione dei conflitti, replicazione master-master
MVCC – le operazioni di scrittura non bloccano le letture
Sono disponibili le versioni precedenti dei documenti
Progettazione crash-only (reliable)
Necessità di compattazioni nel tempo
Viste: embedded map/reduce
Viste formattate: lists & shows
Possibilità di validazione server-side dei documenti
Possibile autenticazione
Aggiornamenti real-time attraverso _changes (!)
Gestione degli allegati e, CouchApps (standalone js apps)
libreria jQuery inclusa
Utilizzo ideale: Per accumulazione dei dati con cambi occasionali sui quali vengono eseguite query predefinite. Situazioni in cui la gestione delle versioni è importante.
Per esempio: CRM, sistemi CMS. Situazioni in cui la replicazione master-master è una caratteristica interessante (ad esempio multisito).

– Redis

Scritto in: C/C++
Punto principale: Velocità
Licenza: BSD
Protocolli: Telnet-like
Disk-backed in-memory database,
In questo momento non include il disk-swap (VM e Diskstore sono stati abbandonati)
Replicazione master-slave
Recupero di valori semplici o intere tables a partire da una chiave
suppporto ad operazioni complesse come ZREVRANGEBYSCORE.
INCR (incremento) e  simili (molto utili per gestire limitazioni di valore e statistiche)
permette l’uso di insiemi (sets) e operazioni su essi (unione/differenza/intersezione)
permette l’uso di liste (lists) e  operazioni su esse (queue; blocking pop)
permette l’uso di hashes (oggetti dotati di campi)
permette l’uso di insiemi ordinati (utili per classifiche, e ricerche su range di valori)
Redis implementa correttamente le transazioni (!)
I valori memorizzati possono avere una scadenza temporale (sistemi di cache)
Implementa facilmente il messaging Publisher/Subscriber (!)
Utilizzo ideale: Adatto a moli di dati (residenti in memoria) di dimensione nota che cambiano frequentemente .
Per esempio: Quotazioni azionistiche. Analisi. Gestione dati in Real-time. Comunicazioni in Real-time.

– MongoDB

Scritto in: C++
Punto principale: Mantiene alcune proprietà utili del modello SQL (Query, index) molto facili da usare.
Licenza: AGPL (Drivers: Apache)
Protocollo: Specifico, binario (BSON)
Replica Master/slave (munita di  failover quando si usano i  “replica sets”)
Lo Sharding è parte integrante del sistema
Le intterrogazioni a db (queries) sono espressioni javascript
Permette l’uso di funzion i javascript lato server
Update-in-place migliore rispetto a CouchDB
Usa “memory mapped files” per la persistenza dei dati
Favorisce la velocità rispetto alle funzionalità implementate
Journaling (opzione –journal) fortemente consigliato
Sui sistemi a 32bit risente di una  limitazione sulla quantità di dati a circa 2.5Gb
Un database vuoto occupa comunque 192Mb
GridFS per la memorizzazione di “big data + metadata” (effettivamente non è un  FS)
Indicizzazione geospaziale Geospatial indexing
Utilizzo ideale: se si necessita di query dinamiche. Se si preferisce lavorare con gli indici rispetto ad usare algoritmi map/reduce. Buono se si ha bisogno di velocità quando si lavora con grandi moli di dati.  Adatto a tutti gli scenari in cui si usa CouchDB e non si può scegliere quest’ultimo perchè i dati cambiano troppo riempiendo la memoria fisica.
Per esempio: tutte le situazioni in cui si vorrebbe usare MySQL o PostgreSQL senza avere colonne definite a priori.

– Riak

Scritto in: Erlang & C, some Javascript
Punto principale: Fault tolerance
Licenza: Apache
Protocollo: HTTP/REST o custom binary
Trade-offs modulabili per replica e distribuzione (N, R, W)
Hooks di pre- e post-commit in JavaScript o Erlang, per la validazione e la sicurezza.
Map/reduce in JavaScript o Erlang
Links & link walking per utilizzarlo come database a grafi
Indici secondari: ricerca nei metadati
Supporto per oggetti di grandi dimensioni (Luwak)
Edizioni sia “open source” che “enterprise”
Ricerca full-text, indexing e querying con il Riak Search server (beta)
Sta migrando lo storing di backend da “Bitcask” al “LevelDB” di Google
La multi-site replication replication senza alcun master e il monitoring SNMP necessitano di una licenza commerciale
Utilizzo ideale: se si vuole qualcosa di simile a Cassandra (Dynamo), ma non si ha nessuna intenzione di avere a che fare con la realtiva inerente complessità. Se si ha bisogno di un’ottima scalabilità, disponibilità e fault-tolerance per un solo sito ma si è disposti a pagare per la replica multi-sito.
Per esempio: Raccolta dei dati di point-of-sales. Sistemi di controllo aziendali. Situazioni in cui anche il downtime di alcuni secondi può essere rilevante. Potrebbe essere anche utilizzato come un web server estremamente aggiornabile.

– Membase

Scritto in: Erlang & C
Punto principale: Compatibile con memcache ma con persistenza e clustering
Licenza: Apache 2.0
Protocollo: memcached con estensioni
Accesso molto veloce ai dati mediante chiave (200k+/sec)
Persistenza su disco
Tutti i nodi sono identici (replicazione master-master)
Fornisce un sistema a buckets simile a memcached
De-duplicazione delle scritture per ridurre IO
Interfaccia GUI per la gestione dei cluster molto interessante
Aggiornamento software senza mettere offline il database
Proxy di connessione per il pooling e il multiplexing (Moxi)
Utilizzo ideale: Qualsiasi applicazione dove un bassa latenza dell’accesso ai dati, un’alta concorrenzialità e un’alta disponibilità degli stessi sono requisiti chiave.
Per esempio: Casi in cui c’è necessità di bassa latenza come l’erogazione di servizi di pubblicità mirata (ad targeting)  o alta concorrenza come il giochi online (per esempio Zynga).

– Neo4j

Scritto in: Java
Punto principale: Database a grafi o dati connessi
Licenza: GPL, salcune caratterstiche con AGPL/commerciale
Protocollo: HTTP/REST (o incluso in  Java)
Standalone, o includibile nelle applicazioni Java
Piena conformità ACID (incluso i dati durable)
Sia i nodi che le releazioni possono avere dei metadati
Linquaggio di query basato su pattern-matching (“Cypher”)
Può anche essere usato il linguaggio di attraversamento dei gravi “Gremlin”
Indicizzazione dei nodi, delle chiavi e delle relazioni
Piacevole interfaccia di amministrazione web
Sono disponibili diversi algoritmi di ricerca dei percorsi
Ottimizzato per le letture
Ha le transazioni (nelle API Java)
Si può usare il linguaggio di scripting Groovy
Backup online, monitoraggio avanzato e alta disponibilità con licenza AGPL/commerciale
Utilizzo ideale: Per dati interconnessi, semplici o complessi, con struttura a grafo. In questo senso Neo4j is è un po’ diverso dagli altri database noSQL.
Per esempio: Relazioni sociali, collegamenti nei trasposti pubblici, mappe di strade, topologie di rete.

– Cassandra

Scritto in: Java
Punto principale: Migliore di BigTable e Dynamo
Licenza: Apache
Protocollo: Proprietario, binario (Thrift)
Distribuzione e replicazione attivabile (N, R, W)
Query possibili mediante colonne e insiemi di chiavi
Carattersitiche simili a BigTable: colonne, famiglie di colonne
Indici secondati
La scrittura è molto più veloce della lettura(!)
Mappatura e riduzione possibile mediante Apache Hadoop
I admit being a bit biased against it, because of the bloat and complexity it has partly because of Java (configuration, seeing exceptions, etc)
Utilizzo ideale: Quando si scrive più che leggere (logging). Se ogni componente del sistema deve essere in Java.
Per esempio: Sistemi bancari e industria finanziaria.
Inoltre, siccome le scritture sono più veloci delle letture, una nicchia naturale è l’analisi dei dati in tempo reale.

– HBase

Scritto in: Java
Punto principale: miliardi di righe con milioni di colonne
Licenza: Apache
Protocollo: HTTP/REST (anche Thrift)
Modellato dopo BigTable
Mappatura e riduzione con Hadoop
Costrutti query push down attraverso scansione lato server e con filtri per il get
ottimizzazione per le query in tempo reale
E’ un gateway Thrift con alte performance
HTTP supports XML, Protobuf, and binary
Cascading, hive, and pig source and sink modules
Shell basata su Jruby (JIRB)
Punti di ripristino multipli
Rolling restart for configuration changes and minor upgrades
L’accesso random ai dati è paragonabile a quello di MySQL
Utilizzo ideale: Se siete innamorati di BigTable.   e quando c’è la necessità di un accesso in lettura e scrittura, random e in tempo reale alla grande quantità di dati.
Per esempio: il database dei messaggi in Facebook.

 

La scelta e’ davvero varia a seconda del compito che vi serve maggiormente venga svolto dal DB che avrete prescelto, quindi perche’ non provarli ?

Ubuntu Tips and Tricks

Ubuntu-trucchiUbuntu alcuni Trucchi per migliorane l’uso :

1. Cambiamo i programmi di default

Ubuntu viene distribuito con moltissimi programmi che fanno le cose in modo molto simile tra loro, ad esempio come editor di default è settato “nano”, per alcuni di voi pero’ potrebbe essere meglio cambiare e avere “vim”.

La strada più facile per farlo è usare il programma update-alternatives; questo tool di gestione mantiene dei link simbolici nel PATH /etc/alternatives ,  che determinano quali programmi lanciare di default, per alcuni programmi come ftp, system, editor, telnet, rsh, windows manager ecc…; per avere la lista completa basta digitare:
ls -la /etc/alternatives/

ora per modificare l’editor di default per passare da nano a vim è sufficiente digitare:

sudo update-alternatives –config editor

apparirà qualcosa simile a questo:

There are 3 alternatives which provide `editor’.

Selection Alternative
———————————————–
1 /usr/bin/vim
2 /bin/ed
*+ 3 /bin/nano

Press enter to keep the default[*], or type selection number:

a questo punto è sufficiente premere 1 per avere vim come editor di default.

2. Come installare un pacchetto:

Quasi tutti i software che volete installare in ubuntu sono presenti nei repositories di default ed è semplice installarli tramite programmi grafici come Synaptic o simili. Cosa succede però se si vuole installare un programma come ad esempio Opera (browser) che è disponibile per Ubuntu ma non è presente nei repositories?

In questo caso dobbiamo scaricare il pacchetto debian (.deb) e cliccarci con il tasto destro per poi  aprirlo con GDebi, in alcuni casi è sufficiente il doppio click, GDebi mostrera’ in modo grafico le informazioni sul pacchetto: cosa fa, le varie dipendenze, cosa contiene, ed un tasto per installarlo.

Se invece preferite fare tutto da linea di comando è sufficiente digitare

sudo dpkg -i <nomepacchetto.deb>

3. Sudo e gksudo

Se si e’ usato linux per un pò di tempo, conoscete la potenza distruttiva che può avere un programma lanciato male da root, può modificare la configurazione spostare file di sistema, distruggere dati importanti ecc…

Cosi in Ubuntu hanno pensato un sistema diverso; l’utente root esiste in Ubuntu ma non può essere usato se non attraverso il comando sudo.

Probabilmente già conoscete come funziona sudo tool, ma se volete lanciare un programma grafico come se foste root o un altro utente ? è semplice basta usare gksudo al posto di sudo. Se volete lanciare ethereal (che è un famoso sniffer) come root,  bastera’ lanciare dalla shell il comando gksudo ethereal , vi verra’ richiesta una password (quella del vostro utente) e il programma sarà avviato come utente, ma con i permessi di root, a patto che il vostro utente sia stato precedentemente inserito tra gli utenti nella lista dei sudoers (/etc/sudoers).
Ma in alcuni casi si ha davvero la necessita’ di usare proprio l’utente root da shell e, per ovviare a questo problema si puo’digitare :

sudo -i

4. Aggiungere utenti come admin

Quando installiamo Ubuntu, viene aggiunto in automatico il primo utente come sudoers, questo permette a quell’utente di poter lanciare comandi come se fosse un utente root scrivendo la sua password (cosi come spiegato al punto precedente).

Tuttavia se si aggiungono altri utenti questi non avranno tale privilegio; per poter dare anche ai nuovi utenti questo privilegio bisogna inserirli tra gli utenti “admin” , digitando quanto segue:

sudo usermod -G admin nomeutente

Se l’utente facesse già parte di un’ altro gruppo bastera’ aggiungere al comando l’opzione ” -a ” facendolo diventare:

sudo usermod -a -G admin nomeutente

Se preferite fare il tutto da interfaccia grafica potete andare in Sistema (System) -> Amministrazione (Administration) -> Utenti e Gruppi (Users and Groups), selezionare l’utente a cui si vogliono dare i permessi di sudo e cliccare con il tasto destro, scegliere Propietà e sotto  “Privileggi utente” selezionare “Amministrare il sistema”.

5. Aggiungere un nuovo desktop

Molti utenti non sono sicuri su quale desktop usare, a differenza di sistemi come windows, Linux prevede l’uso di molte, diverse, interfacce grafiche in base alle preferenze dell’utente, ogni Desktop Manager è completamente diverso dagli altri e offre funzionalità diverse, tra i più famosi troviamo Gnome (quello di default), KDE, Xfce e molti altri.

Ubuntu infatti viene distribuito con molti nomi e contenuti diversi oltre all’ Ubuntu classico infatti ci sono Kubuntu, Xubuntu, Edubuntu, ecc…  se se n’ è installato soltanto uno è possibile comunque installare gli altri digitando semplicemente quanto segue senza bisogno di scaricare di nuovo il CD:

sudo apt-get install kubuntu-desktop
sudo apt-get install edubuntu-desktop
sudo apt-get install xubuntu-desktop

Alcuni sono più semplici da usare mentre altri sono più veloci, altri ancora sono più belli, insomma ce n’è per tutti i gusti.

Naturalmente si possono installare anche da interfaccia grafica usando tool come Synaptic.

6. Avanzamento di versione

Ci sono diversi metodi per eseguire un avanzamento di versione da un rilascio di Ubuntu ad un’ altro. Questi descritti sono i metodi raccomandati sulle guide ufficiali, ma fate sempre molta attenzione poiche’ nulla e’ perfetto.

do-release-upgrade

Il metodo di avanzamento raccomandato per la Server Edition è l’utilizzo dell’utilità do-release-upgrade, installata in modo predefinito come parte del pacchetto update-manager-core e priva di alcuna dipendenza grafica.

I sistemi basati su Debian possono ricorrere anche al comando apt-get dist-upgrade. L’uso di do-release-upgrade è comunque raccomandato in quanto è in grado di gestire le modifiche necessarie alla configurazione di sistema tra i rilasci.

Per avanzare ad un nuovo rilascio, da un terminale digitate quindi :

do-release-upgrade

È anche possibile usare do-release-upgrade per avanzare a una versione di sviluppo di Ubuntu. Per fare ciò, usare l’opzione -d:

do-release-upgrade -d

Da Video a GIF con QGifer

QGifer-logoTra i file maggiormente diffusi le immagini in formato GIF occupano sicuramente una posizione di rilievo. Online, ed in special modo sui forum, le GIF vengono infatti usate in maniera molto frequente, in particolare per pubblicare contenuti divertenti.

QGifer è un software gratuito ed open source per sistemi Windows, Linux e FreeBSD, attraverso il quale possiamo convertire video .avi in animazioni .gif e personalizzarle in base alle nostre preferenze.

Funzionalita’

QGifer dispone di svariati e utili funzionalità che rendono il software unico nel suo genere, tra le principali caratteristiche troviamo :

  • la possibilità di convertire l’intero filmati avi o solo una parte.
  • Attraverso una semplice e molto intuitiva interfaccia grafica potremo applicare filtri al video da convertire, gestire i margini e frame rate.
  • opzione con la quale potremo anche operare sui FPS e i livelli di Zoom con la possibilità di attivare anche il loop.
  • E’ possibile inserire testo o immagini all’interno del video con la possibilità di visualizzarli in tutto il video o solo una parte di esso.

Utilizzare QGifer è davvero molto semplice anche se deve fare attenzione al formato del video da convertire che non deve avere più di 1800 frames e non usare i codec motion JPEG or YUV4. Se il video che vogliamo convertire non è supportato da QGifer potremo prima convertire il video in avi utilizzando ad esempio OpenShot oppure altri tool di conversione come Selene Media Encoder,ConvertMe , Panther ecc…

Per installare QGifer in Ubuntu

sudo add-apt-repository ppa:samrog131/ppa
sudo apt-get update
sudo apt-get install qgifer

All’avvio del programma tutte le funzioni di modifica del file sono mostrate nella parte sinistra dello schermo mentre nella parte destra è presente l’anteprima del file.
La prima operazione da effettuare per potersi servire di QGifer consiste nel caricare il file video originale da cui si desidera creare l’immagine GIF.

QGifer supporta tutti i formati di file video più diffusi tra cui anche MOV, MP4 AVI.

Dopo aver selezionato il file video su cui agire è possibile procedere applicando filtri, margini e cambiando il frame rate. Dalla sezione Preview Properties sotto Toolbox è anche possibile controllare gli FPS e il livello di zoom, oltre a poter specificare se attivare o meno il loop. QGifer consente inoltre d’impostare l’inizio e la fine della GIF.

Una volta apportate tutte le modifiche desiderate, la GIF può essere esportata semplicemente cliccando sul pulsante Extract GIF annesso all’interfaccia principale del software.

Da notare inoltre che QGifer consente anche di salvare il proprio progetto in modo tale da potervi apportare ulteriori modifiche in un secondo momento.

Per chi preferisce il formato .tar.gz potete scaricare il pacchetto da questo link : Download

Sicurezza con il PortKnocking

portknockingMi e’ capitato spesso di dover configurare firewall per proteggere i Server di mia competenza e molte volte capita l’esigenza di dover tenere aperto un accesso dall’esterno, per poter operare in qualunque momento o per qualunque motivo. Ovviamente questo ci potrebbe esporre facilmente alla possibilita’ di venire attaccati; che cosa fare in questi casi ??? Beh! le possibili soluzioni sono davvero tante, tante quanto la fantasia di chi le studia; in questo articolo quindi descrivero’ semplicemente un mio modo personale di arginare tale possibile pericolo.

* Il primo suggerimento e’ quello di spostare il servizio SSH dalla porta 22 ad una di vostra preferenza, stando ben attenti a non usare possibili porte utilizzabili da altri servizi web.

* Il secondo suggerimento e’ quello di creare un servizio di Honeypot (tipo honeyd a bassa interazione, oppure come honeynet ad alta interazione) , da tenere in ascolto sulla porta standard (la 22) dell’SSH, cosi’ che i male intenzionati trovino la porta attiva e nel tentativo di attaccarvi perdano tempo e si ritrovino successivamente all’interno di servizi fasulli.

* Il terzo suggerimento e’ quello di utilizzare la tecnica del port-knocking per poter gestire a proprio piacimento ogni accesso in SSH attivando e disattivando tramite una sequenza di caratteri che solo voi conoscete e che potrete cambiare a piacimento.

PORTKNOCKING

Iniziamo col dire che cosa e’ questa tecnica: le tecniche di Port knocking permettono di aumentare considerevolmente la sicurezza di un server che deve garantire alcuni servizi non permanenti attraverso IP pubblici. Se s’inviano dei pacchetti a delle porte prestabilite sulle quali il demone è in ascolto e nel caso la sequenza sia corretta, questi attiverà un comando che potrà eseguire delle regole di iptables che apriranno le porte necessarie alla connessione. Il vantaggio è notevole in quanto il server potrebbe rimanere sempre in stealth mode e aprire le porte per un determinato servizio solo in caso di necessità.

Innanzitutto per poter utilizzare il portknocking e’ necessario che il firewall sia attivo e funzionante, ora posiamo installare il pacchetto software

sudo apt-get install knockd

Configurazione knockd

  1. Per fare in modo che il demone parta all’avvio del computer modificare con un editor di testo a piacimento, e con i privilegi di amministrazione il file /etc/default/knockd in questo modo:

    START_KNOCKD=1

     

  2. Sempre nel medesimo file /etc/default/knockd modificare con un editor di testo a piacimento, e con i privilegi di amministrazione indicando su quale interfaccia il demone dovrà rimanere in ascolto:

    KNOCKD_OPTS="-i eth0"

     

Configurazione knockd.conf per l’apertura di una sola porta

Modificare con un editor di testo a piacimento, e con i privilegi di amministrazione il file /etc/knockd.conf impostandolo come segue:

[options]
        logfile = /var/log/knockd.log

[openSSH]
        sequence    = 7000,8000,9000
        # Questa è la sequenza delle porte sulle quali knockd rimarrà in ascolto. Di default il protocollo è TCP.
        # Quali e quante porte usare è discrezionale.

        # sequence   = 7000:udp,8000:tcp,9000:udp
        # Esempio con sequenza con porte miste udp/tcp

        seq_timeout = 30
        #Tempo di attesa massimo per completare la sequenza.

        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        # Quando la sequenza verrà accettata verrà inserita una regola che aprirà la porta SSH standard.

        tcpflags    = syn
        # Ulteriore filtro, sul tipo di flag del pacchetto inviato alla sequenza di porte.
        
[closeSSH]
        sequence    = 9000,8000,7000
        # Questa è un'altra sequenza di porte sulle quali knockd rimarrà in ascolto.

        seq_timeout = 30

        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        # Quando la sequenza verrà accettata verrà inserita una regola che cancellerà quella creata in precedenza.

        tcpflags    = syn
        # Ulteriore filtro, sul tipo di flag del pacchetto inviato alla sequenza di porte.

La variabile «%IP%» passa alla regola di iptables l’indirizzo che ha effettuato la richiesta di connessione, in questo caso verrà permessa l’apertura della porta SSH discriminando solo l’IP validato.

Configurazione per l’apertura di una sola porta, per soli esperti

Un’altra possibilità per usare il demone knockd, e’ utilizzabile solo se il firewall sul server è configurato per accettare le connessioni “established” e “related” alla porta che si vuole aprire (es ssh, 22) è di chiudersi subito dietro la porta appena aperta, per evitare che, restando “aperta”, qualche malintenzionato tenti un brute-force al servizio, lanciando uno script anzichè impostando delle regole sul firewall.

Per questo scopo il file /etc/knockd.conf può ad esempio essere modificato, con un editor di testo a piacimento, e con i privilegi di amministrazione, come segue :

[options]
        logfile = /var/log/knockd.log

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 30
        start_command     = /etc/init.d/ssh start
        tcpflags    = syn

        cmd_timeout = 5
        stop_command     = /etc/init.d/ssh stop
        # Dopo cmd_timeout secondi, viene eseguito il comando stop_command

Ricordiamo ancora che è indispensabile che il firewall sul server accetti le connessioni “related” ed “established” altrimenti la sezione “stop_command”, appena sarà eseguita, vi chiuderà la connessione SSH senza quindi avere possibilità di connettervi al server!

tuttiperlinux@server:~# iptables -nL | grep ":22"

ACCEPT     tcp  --  0.0.0.0/0    0.0.0.0/0           tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0    0.0.0.0/0           tcp spt:22 dpts:513:65535 state RELATED,ESTABLISHED
ACCEPT     tcp  --  0.0.0.0/0    0.0.0.0/0           tcp spts:1024:65535 dpt:22 flags:0x17/0x02 state RELATED,ESTABLISHED
ACCEPT     udp  --  0.0.0.0/0    0.0.0.0/0           udp dpt:22 state ESTABLISHE

Configurazione knockd.conf per l’apertura di più porte

Nell’esempio sopra esposto si è visto come aprire una sola porta. Se l’esigenza fosse però quella di aprirne di più procedere creando più sessioni «[openServizio]» e «[closeServizio]». Questo sistema risulta però scomodo per ovvi motivi, per ottenere lo stesso risultato è consigliato usare degli script.

Modificare con un editor di testo a piacimento, e con i privilegi di amministrazione il file /etc/knockd.conf impostandolo come segue:

[options]
        logfile = /var/log/knockd.log

[open]
        sequence    = 7000,8000,9000
        seq_timeout = 30
        tcpflags    = syn
        command     = sh /etc/open_ports %IP%


[close]
        sequence    = 9000,8000,7000
        seq_timeout = 30
        tcpflags    = syn
        command     = sh /etc/close_ports %IP%

In questo caso invece di eseguire direttamente iptables si richiamano due script passando il parametro «%IP%» alla variabile speciale «$1».

Esempio di script open_ports

Modificare con un editor di testo a piacimento, e con i privilegi di amministrazione il file /etc/open_ports impostandolo come segue:

iptables -A INPUT -s $1 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 631 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 5125 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 5126 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 8888 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 10000 -j ACCEPT
iptables -A INPUT -s $1 -p tcp --dport 81 -j ACCEPT

Esempio di script close_ports

Modificare con un editor di testo a piacimento,  e con i privilegi di amministrazione il file /etc/close_ports impostandolo come segue:

iptables -D INPUT -s $1 -p tcp --dport 22 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 21 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 631 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 5125 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 5126 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 8888 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 10000 -j ACCEPT
iptables -D INPUT -s $1 -p tcp --dport 81 -j ACCEPT

Esempio di una connessione

Per effettuare la connessione digitare il seguente comando all’interno di una finestra di terminale:

./knock -v <ip_host> port1 port2 port3 port...

Ora non resta altro che fare pratica e pratica ma sono sicuro che il portknocking vi dara’ tanta soddisfazione.

Leggete anche l’articolo sulla sicurezza inerente Metasploit Framework.

Metasploit Framework

metasploit_logoTestiamo la nostra Sicurezza

Oggi giorno sempre piu’ servizi sono online e tra questi troviamo anche cose importanti come la gestione del conto bancario oppure il nostro profilo INPS ecc….; tutto cio’ e’ molto comodo ma e’ anche piu’ facile che una falla sui sistemi che usiamo possa rendere facile a persone poco raccomandabili di intercettare qualche nostro dato “sensibile” per poi servirsene a piacimento.

Certamente molti di noi si affidano al fatto che confidiamo nell’alto livello di sicurezza dei gestori di questi servizi, ma pochi pensano che in ogni conversazione, compresa quella tra computer in un luogo pubblico come Internet, deve avere entrambi i soggetti SICURI , quindi come fare per essere certi il piu’ possibile (dato che sicuro e’ morto) che noi per primi siamo esenti da bug ???? Un buon metodo e’ tenersi sempre aggiornati sui bug piu’ noti e pericolosi e poi testare la propria macchina. Il metodo migliore per farlo e’ quello di usare un Framework come Metasploit.

I metodi per usare Metasploit sono tanti e disparati , dall’usare un Live-CD, installarlo su di una Pen-Drive, creare una VM apposita ecc…
Stessa cosa si puo’ dire per i metodi d’installazione del Framework in questione quindi vi descrivero’ quello che preferisco e che trovo piu’ funzionale.

INSTALLAZIONE

mkdir git
cd git
git clone https://github.com/mcfakepants/metasploit-framework.git

…..a questo punto potete verificare cosa e’ stato scaricato nella DIR entrandoci e lanciando un ls -L
il risultato dovrebbe essere una lista come questa

git/metasploit-framework$ ls -L
config           external      modules     msfencode    msfrpcd    scripts
CONTRIBUTING.md  Gemfile       msfbinscan  msfmachscan  msfupdate  spec
COPYING          Gemfile.lock  msfcli      msfpayload   msfvenom   test
data             HACKING       msfconsole  msfpescan    plugins    tools
db               lib           msfd        msfrop       Rakefile
documentation    LICENSE       msfelfscan  msfrpc       README.md

a questo punto prima di lanciare la console di Metasploit per l’installazione conviene assicurarci di avere tutti i pacchetti per gli script in Ruby installati, per completare questa operazione possiamo lanciare il seguente comando :

gem install bundler

ora non ci rimane che lanciare l’installazione del Framework in questione tramite

sudo ./msfconsole -L

se dovessimo riscontrare un errore come questo: Could not find rake-10.0.4 in any of the sources potremo risolvere fermando l’installazione in corso con un Ctrl+C , ed eseguire, dalla stessa posizione in cui ci troviamo, il comando bundle install che installaera’ tutte le “GEMME” mancanti; rilanciamo pure l’installazione come prima con : # sudo ./msfconsole -L

Ci vorra’ qualche minuto per ultimare questa fase in quanto i pacchetti da scaricare sono diversi; al termine dell’installazione ci ritroveremo catapultati all’interno della console amministrativa di Metasploit, con una schermata di questo tipo

< metasploit >
 ------------
       \   ,__,
        \  (oo)____
           (__)    )\
              ||--|| *

=[ metasploit v4.9.0-dev [core:4.9 api:1.0] ]
+ -- --=[ 1288 exploits - 705 auxiliary - 203 post ]
+ -- --=[ 334 payloads - 35 encoders - 8 nops      ]

msf >

Ora tutto quello che ci rimane da fare e’ testare quelle criticita’ che ci sembrano piu’ rischiose e capire cosi’ se il nostro PC ne e’ affetto.

Una di quelle da verificare, per fare il nostro primo test, e’ quella relativa ad un bug nel parsing dei font presenti nei file SWF (i file Flash) di Adobe, grazie al quale un malintenzionato potrebbe essere in grado di eseguire codice malevolo sulla macchina della vittima fino ad arrivare ad ottenere il controllo di una shell remota, senza necessita’ di inserire una password. Questo bug e’ molto problematico in quanto colpisce tutti i sistemi operativi e tutti i PC che abbiamo installata una versione di Flash precedente alla 11.3

Per verificare se il vostro PC e’ affetto tornate nella console di metasploit ed eseguite il test lanciando la seguente stringa :

msf  > use exploit/windows/browser/adobe_flash_otf_font

Eseguendo questo exploit , metasploit costruira’ in pratica un falso webserver sulla vostra macchina locale, ed un finto client che va a leggere  una pagina HTML contenente un file SWF (che si trova nella cartella metasploit-framework/data/exploits/CVE-2012-1535), in modo da eseguire il test automaticamente.

In generale per avere più informazioni sull’utilizzo di qualsiasi comando basta invocare l’help dedicato:

msf > nomecomando -h

Vediamo adesso i comandi per interagire con le librerie di exploit e payload. Il primo da conoscere è show che serve per mostrare il contenuto delle librerie, ad esempio:

msf > show exploits

Con questo comando verrà stampata la lista di tutti gli exploit presenti.

Per visualizzare i payload similmente useremo:

msf > show payloads

Per cercare un elemento specifico possiamo servirci del comando search:

msf > search cve:2012 type:exploit app:client

Search utilizza keyword (type, app, platform, name, etc) per affinare la ricerca. Al solito è buona norma consultare l’help del comando per avere un’idea di tutte le sue funzionalità:

msf > search -h

Prossimamente verranno aggiunti su questo Blog altri articoli relativi ai Bug piu’ pericoli da testare grazie a Metasploit, fino ad allora buona pratica e buon divertimento.

Vedi anche precedente articolo KaliLinux