[Articolo] Cancellazione sicura dei file in Linux

Approfondiamo oggi il tema della cancellazione dei file su Linux, e in particolare vedremo come è possibile rimuovere definitivamente e in modo sicuro i propri dati. Questo può essere utile se dobbiamo cancellare dati sensibili, ad esempio se vogliamo cedere un disco o una chiavetta USB ad un nostro amico o conoscente.

Difficoltà articolo (0->10): 5

Approfondiamo oggi il tema della cancellazione dei file su Linux, e in particolare vedremo come è possibile rimuovere definitivamente e in modo sicuro i propri dati. Questo può essere utile se dobbiamo cancellare dati sensibili, ad esempio se vogliamo cedere un disco o una chiavetta USB ad un nostro amico o conoscente.

Quali metodi conoscete per rimuovere i file su Linux? rm? rmdir? La formattazione completa dell’intero disco? Ecco, tutti questi strumenti non sono sufficienti per la cancellazione definitiva di un file, anche se possono andare bene per la quotidianità. Ad esempio il comando rm non elimina realmente, ma solo l’indice che punta a quel file, rendendo impossibile il suo recupero, ma solo apparentemente! Con questi metodi infatti il sistema non elimina fisicamente i file, ma modifica solamente le coordinate dei file rimossi in maniera tale da poter essere riscritti successivamente. E’ possibile quindi recuperare in un secondo momento file e directory rimossi in questo modo con semplici programmi anche gratuiti, come ad esempio con PhotoRec o con Recuva, e non servono aziende specializzate per farlo.

Esaminiamo in dettaglio due strumenti che possiamo usare per rimuovere definitivamente file e directory:

  • shred
  • srm

Il comando shred, presente solitamente di default tra le utility di sistema, permette di sovrascrivere X volte (3 di default) un file in modo tale da rendere impossibile recuperarne il reale contenuto.

# shred -vu prova.txt
shred: prova.txt: pass 1/3 (random)...
shred: prova.txt: pass 2/3 (random)...
shred: prova.txt: pass 3/3 (random)...
shred: prova.txt: removing
shred: prova.txt: renamed to 000000000000
shred: 000000000000: renamed to 00000000000
shred: 00000000000: renamed to 0000000000
shred: 0000000000: renamed to 000000000
shred: 000000000: renamed to 00000000
shred: 00000000: renamed to 0000000
shred: 0000000: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: prova.txt: removed

Alcuni esempi di utilizzo sono:

$ shred -zu file.pdf$ shred -vun 15 file.pdf

$ shred -v /dev/hda1

$ shred -v -u -z -n 5 file.txt

Dove:

  • l’opzione z specifica che dopo l’eliminazione del file vengono scritti tutti 0, per cercare di nascondere ad altri tool il fatto che è stato usato un comando per l’eliminazione di dati;
  • l’opzione v serve per la modalità verbose;
  • l’opzione u per eliminare anche il puntatore al file;
  • l’opzione n XXX (con XXX numero) indica quante volte deve essere sovrascritto il file da eliminare.

Attenzione: il comando non funziona con tutti i tipi di file system, ad esempio non funziona con sistemi RAID che scrivono dati in modo ridondato!

Il comando shred ha però i suoi limiti. Cosa succede se vogliamo eliminare tutte le sottodirectory di una determinata directory? Dovrebbe essere sufficiente usare l’asterisco:

shred -uv *

E invece no! Il comando precedente eliminerà tutti i file contenuti nella directory di lavoro corrente, ma non le sottodirectory. Per risolvere possiamo usare un altro strumento: srm (Secure Remove).

Con srm il processo di cancellazione dei dati è il seguente:

  1. 1 passaggio con 0xff
  2. 5 passaggi casuali. /dev/urandom è utilizzato se disponibile come fonte RNG sicura.
  3. 27 passaggi con valori speciali definiti da Peter Gutmann.
  4. 5 passaggi casuali. /dev/urandom è utilizzato se disponibile come fonte RNG sicura.
  5. Troncamento del file

srm scrive blocchi a 32k allo scopo di avere una maggiore velocità, di riempire i buffer di cache del disco per costringerli a svuotarsi e sovrascrivere i dati vecchi che appartenevano al file.

Le opzioni di srm sono:

  • -d ignora i due file speciali costituiti con i punti . e .. dalla linea di comando. (così si può eseguirlo come “srm -d .* *”)
  • -f fast (ed insicuro): no viene usato /dev/urandom, e non viene utilizzato il modo sincronizzato.
  • -l diminuisce la sicurezza. Solo due passaggi sono scritti: uno con 0xff ed i valori in modalità casuale.
  • -l -l per una seconda volta per abbassare ulteriormanete la sicurezza: viene fatto solo un passaggio casuale.
  • -r modalità ricursiva, cancella le sottodirectory.
  • -v modalità dettagliata
  • -z pulisce l’ultima scrittura con zeri invece che con dati casuali

Come ho già scritto nel corso dell’articolo, con i normali strumenti di recupero file (Recuva per esempio) non è possibile recuperare i file cancellati con gli strumenti visti fino ad ora, mentre si possono recuperare file rimossi con i comandi “semplici” del sistema (es. rm). Tuttavia, in ambito professionale e forense esistono programmi particolari e molto costosi che sono in grado di leggere le impronte magnetiche (nel caso degli HDD) o elettriche (nel caso degli SSD) lasciate da un singolo bit eradicato con la formattazione a basso livello, rendendo possibile il recupero del bit (e del file finale). Tale percentuale si abbassa notevolmente se il processo di formattazione viene ripetuto numerose volte: si consiglia di utilizzare almeno 7 passaggi di dd per cancellare hard disk da ogni traccia di file o dati sensibili; ma se non avete segreti militari da nascondere, un passaggio di dd è più che sufficiente, specie se il disco verrà subito riutilizzato (verranno progressivamente sovra-scritte le impronte ancora presenti).

roghan

[Pillola] Controllare se una partizione usa LVM

In Linux possiamo verificare se una partizione del sistema è fisica oppure se usa LVM in 3 modi diversi, vediamoli.

Il primo è quello di verificare il file fstab, contenente le configurazioni delle partizioni montate al momento del boot del sistema:

# cat /etc/fstab

In particolare, dobbiamo osservare l’inizio di ogni riga nel file e controllare:

  • Se inizia con UUID=abc, la partizione è fisica.
  • Se inizia con /dev/sdaX, la partizione è fisica.
  • Se inizia con /dev/mapper/abx, allora la partizione usa LVM.

Il secondo modo è di usare il comando pvdisplay, che riporterà un risultato simile al seguente:

# pvdisplay
--- Physical volume ---
PV Name /dev/sdc1
VG Name new_vg
PV Size 17.14 GB / not usable 3.40 MB
Allocatable yes
PE Size (KByte) 4096
Total PE 4388
Free PE 4375
Allocated PE 13
PV UUID Joqlch-yWSj-kuEn-IdwM-01S9-XO8M-mcpsVe
Similmente al primo metodo, se il nome della partizione (PV Name in grassetto) indica una partizione reale fisica, tipo /dev/sdaX oppure /dev/sdbX, la partizione sarà ovviamente fisica, altrimenti nel caso in cui sia presente il nome mapper userà LVM, tipo /dev/mapper/abx.
Il terzo modo è di utilizzare il comando pvs, che indicherà o meno l’utilizzo di LVM nel campo con etichetta “Fmt”. Vediamo un output di esempio:
# pvs
 PV               VG        Fmt  Attr PSize   PFree 
 /dev/mapper/sdb3 ubuntu-vg lvm2 a--  446,15g 52,00m
Qui posiamo vedere che il campo “Fmt” riporta “lvm2”, ed è chiaro pertanto che in questo caso la partizione è configurata facendo uso appunto di LVM.
roghan

[Pillola] Calcolatrice con la shell in Linux

Vi è mai capitato di aver bisogno di fare qualche conteggio non proprio banale ma con la “fatica” di cercare e aprire la calcolatrice? Con Linux possiamo usare due semplici comandi per ottenere tutto ciò: echo e bc.

Vi è mai capitato di aver bisogno di fare qualche conteggio non proprio banale ma con la “fatica” di cercare e aprire la calcolatrice? Oppure se siete collegati ad un server Linux a riga di comando, e volete fare dei conti al volo? Con Linux possiamo usare due semplici comandi per ottenere tutto ciò ;-): echo e bc: il primo comando serve per la stampa a video del risultato mentre il secondo è un vero e proprio linguaggio che permette di effettuare calcoli matematici anche complessi. In teoria potrebbe essere usato anche solamente il comando bc per entrare nella modalità di calcolo della calcolatrice, ma unito ad echo è tutto più pratico.

Vediamo alcuni semplici esempi:

$ echo "2+1" | bc

$ echo "(2+1)/3" | bc

$ echo "5.3-1.1"  | bc

$ echo 3^3 | bc

ed alcuni più complessi:

$ echo "(3465.34/23)+23.6" | bc -l

$ echo "scale=4; (3465.34/23)+23.6" | bc

$ echo 3^3 | bc

$ echo "ibase=10; obase=2; 32" | bc

Facciamo attenzione che per calcolare numeri in virgola mobile è necessario usare l’opzione e/o scale, il quale specificherà le cifre significative usate con il decimale (di default scale=20).
L’ultimo esempio permette di convertire un numero da una base ad un’altra, in questo caso da base 10 a base binaria.

Gli esempi visti illustrano solo una minima parte delle funzionalità di bc, per le restanti rimando alla man page ufficiale o a guide più dettagliate tipo questa.

roghan

[Articolo] La guida definitiva per verificare se un server Linux è stato violato e metterlo in sicurezza

Sospettiamo che il nostro server Linux sia stato violato? Abbiamo notato processi o attività strane? Vediamo in questo primo articolo come identificare un server Linux che è stato compromesso, e come cercare di ripristinare la situazione e chiudere fuori gli intrusi.

Difficoltà articolo (0->10): 8

Requisiti: conoscenza intermedia della shell di Linux, e hardening di un sistema.

Sospettiamo che il nostro server Linux sia stato violato? Abbiamo notato processi o attività strane? Vediamo in questo primo articolo come identificare un server Linux che è stato compromesso, e come cercare di ripristinare la situazione e chiudere fuori gli intrusi.

Partiamo dal presupposto che ad essere esposti a questo problema sono soprattutto i server che pubblicano servizi e applicazioni all’esterno (server web, ftp, …), e ancora più presi di mira sono i server messi a disposizioni dai principali provider del settore (Aruba, Register, OVH, …). I server di questi provider sono infatti presi di mira in modo massivo, e quotidianamente sono soggetti a tentativi di attacco su tutti i servizi e porte standard (ssh, http, …). Il motivo è semplice: ogni provider ha a disposizione determinati range di IP, dunque per un attaccante, chiunque esso sia (persona fisica o bot) è sufficiente eseguire degli scan e attacchi su questi range selezionati. Ad esempio, questi sono alcuni range che appartengono al noto OVH:

  • 142.4.192.0/19
  • 149.56.0.0/16
  • 158.69.0.0/16

Inoltre, preciso che buona norma per un server compromesso, sarebbe quello di radere tutto al suolo, reinstallato da zero sistema operativo e servizi. Questa pratica non è tuttavia sempre praticabile, poiché spesso sul server sono eseguiti applicativi fondamentali aziendali o per clienti, e la prima soluzione è invece quella di cercare di ripristinare il sistema ad uno stato consistente e sicuro.

Dunque, veniamo in dettaglio ai controlli da effettuare su un server che ipotizziamo essere stato compromesso.


1. Servizi in ascolto e porte aperte

Controlliamo i servizi attivi e le porte sui quali sono in ascolto:

# netstat -tulpn
# ss -nap

Devono indurre sospetto servizi in ascolto su porte non standard e soprattutto porte alte, tipicamente dalla 40000 in su, ad esempio:

# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
[...]
tcp 0 0 100.100.100.100:51553 0.0.0.0:* LISTEN 410/theerhd
[...]

Per controllare che non ci siano eventuali servizi nascosti usare poi il seguente tool:

# unhide-tcp
Unhide-tcp 20121229
Copyright © 2012 Yago Jesus & Patrick Gouin
License GPLv3+ : GNU GPL version 3 or later
http://www.unhide-forensics.info
Used options: use_fuser
[*]Starting TCP checking
[*]Starting UDP checking

Nel caso sopra, l’output è normale, nel senso che non sono stati rilevati servizi nascosti in ascolto, quindi possiamo stare tranquilli.


2. Processi attivi

Controlliamo tutti i processi in esecuzione:

# ps -ef

e l’albero dei processi attivi con relativi pid:

# pstree -pa

Il comando seguente, come nel punto precedente, può rilevare eventuali processi malevoli nascosti:

# unhide proc
# unhide sys
# unhide brute

Devono indurre sospetto eventuali processi con nomi strani (thweih43, lpevntw, 6oetheq, …), processi di cui non riconosciamo l’origine, o processi nascosti, come:

# unhide sys
[...]
Found HIDDEN PID: 256 Wchan: "[34ljyjil]"

3. Scansioni alla ricerca di malware

Installiamo il software rkhunter, per trovare eventuali trojan o malware in esecuzione.

Possiamo trovare una guida completa e ben fatta a questo link, perché la spiegazione di utilizzo del tool richiederebbe un intero articolo…


4. Ultimi accessi al sistema e utenti collegati

Facciamo un controllo sugli ultimi utenti che si sono collegati al sistema:

# last

e quali sono gli utenti attualmente collegati:

# who

Ovviamente, in questo caso dovrebbero far pensare eventuali connessioni di utenti non riconosciuti, oppure connessioni che sappiamo per certo non essere state fatte da noi.


5. Utenti attivi nel sistema

Controlliamo tutti gli utenti definiti all’interno del sistema:

# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
admin:x:1000:1000:,,,:/home/admin/:/bin/bash
[...]

Indice di sospetto dovrebbe essere la presenza di utenti nuovi non noti, o con nomi sospetti (come ad esempio l’utente admin nell’output precedente). Facciamo attenzione però, perché l’output del comando precedente può essere più o meno lungo, e può contenere anche molti utenti che potrebbero destare sospetti ma che in realtà sono utenti di sistema! Tipicamente, gli ultimi utenti ad essere stati creati sono aggiunti alla fine del file, quindi dobbiamo concentrarci su quelli.


6. Ultimi reboot del sistema

Controlliamo da quanto tempo è in esecuzione il server:

# uptime
 15:47:02 up 143 days, 12:07, 1 user, load average: 0,00, 0,00, 0,00

quando è stato fatto l’ultimo reboot:

# who -b
 system boot 2016-12-15 02:40

e il momento esatto di tutti gli ultimi reboot:

# last reboot
reboot system boot 2.6.15.4 Sun Apr 30 15:08 - 16:22 (01:13)
[...]

7. File modificati recentemente

Verifichiamo quali file sono stati modificati negli ultimi giorni (7-10 giorni):

find / -mtime -7

Facciamo attenzione che l’output del comando seguente potrebbe essere lungo e potrebbe impiegare tempo a essere visualizzato interamente. Eventualmente possiamo diminuire il numero di giorni, se si sospetta che l’attacco sia stato fatto da pochi giorni.


8. Analisi dei file di log

Esaminiamo i principali file di log (come sempre importantissimi), e in particolare i messaggi del kernel:

# dmesg

e gli ultimi log di sistema:

# cat /var/log/syslog

Controlliamo gli accessi falliti su SSH, soprattutto nel caso in cui il server sia esposto direttamente su Internet, verificando il file /var/log/auth.log in Debian e derivate, e /var/log/secure in Red Hat e derivate.

(Debian e derivate)
# cat /var/log/auth.log

(Red Hat e derivate)
# cat /var/log/secure

Potrebbe essere importante esaminare anche i log di eventuali servizi in ascolto, qualora presenti, tipo quelli dei server web (/var/log/apache/error.log e /var/log/apache/access.log per Apache, …).


9. Tool di auditing

Lanciamo un tool completo di auditing, come sysdig, seguendo le istruzioni di una delle seguenti guide:


10. Dump della memoria e analisi approfondita del sistema

Qualora nei punti precedenti avessimo rilevato la presenza reale di una minaccia, o di qualche intrusione, è bene approfondire l’analisi con tool specifici, come ad esempio volatility.

Possiamo trovare una guida ben fatta al seguente link:


11. Controllare cron e crontab

E’ importante controllare che non siano presenti script o comandi non noti schedulati all’interno del sistema tramite il servizio crond. Pertanto, è necessario verificare sia il file crontab, per tutti gli utenti di sistema, non solo per root, con il seguente comando:

# crontab -l

Il comando mostrerà eventuali comandi o script schedulati a giorni oppure ore particolari. Prestare dunque attenzione alla presenza di tutto ciò che non abbiamo apertamente configurato.

Analogamente, sarà necessario controllare all’interno di tutti gli altri percorsi usati dal demone crond, tra cui:

  • /etc/cron.d
  • /etc/cron.daily
  • /etc/cron.weekly
  • /etc/cron.monthly
  • /etc/cron.hourly

roghan

[aggiornamento 16/09/2020]

[Articolo] L’indirizzo IP e la Rete

Ho deciso di scrivere un post che cercherà di spiegare cos’è un indirizzo IP e quale visibilità ha un dispositivo collegato a Internet rispettivamente dietro ad un modem, un router, e un firewall.

Difficoltà articolo (0->10): 3

Requisiti: nessuno in particolare.

Ho deciso di scrivere un post che cercherà di spiegare cos’è un indirizzo IP e quale visibilità ha un computer su Internet, dopo che molte volte mi sono state rivolte domande a riguardo. Buona lettura ;-).

Ogni dispositivo collegato ad Internet (computer, palmare, cellulare, …), e più in generale a qualsiasi rete, è dotato di un proprio indirizzo che lo identifica in modo univoco. Possiamo pensare ai cellulari: ogni cellulare ha un proprio numero univoco, e quindi diverso da tutti gli altri (anche se in realtà il numero viene assegnato alla scheda sim, ma questo è un altro argomento), e questo numero ha una struttura fissa composta da 10 numeri. E’ naturale pensare che non possano esistere due cellulari diversi con lo stesso numero X, altrimenti se entrambi fossero accesi e qualcuno volesse chiamare proprio il numero X cosa succederebbe? La rete telefonica non saprebbe a quale dei due cellulari inoltrare la telefonata! Quello che succede per i cellulari può essere paragonato ai computer e a Internet. Ogni computer, al momento che si collega ad una qualunque rete (sia su Internet che all’interno di una rete locale (LAN)), deve possedere un proprio indirizzo IP, assegnato dal suo Internet Service Provider – ISP (Alice, Tele2, Tiscali, …) ed avente la forma X.X.X.X, dove ogni X può essere un qualsiasi numero da 0 a 255 (con alcune eccezioni). Esempi di indirizzi IP sono 192.168.3.45, oppure 155.123.111.13, ma anche 2.3.4.5 è un indirizzo valido.

indirizzo_ip

Per conoscere il proprio indirizzo è possibile utilizzare un comando specifico da terminale. In caso di windows è necessario aprire il prompt dei comandi e digitare:

ipconfig

e tra i dati visualizzati si potrà vedere proprio l’indirizzo IP. Ovviamente facciamo attenzione a controllare la scheda giusta, se abbiamo più schede di rete all’interno del computer, e solitamente la scheda di rete è identificata come “Ethernet Adapter”, “LAN Adapter”, “Ethernet Wireless Adapter” nel caso di una scheda wireless, ecc. Ecco un esempio (l’indirizzo IP è 192.168.1.2, assegnato appunto alla scheda “Ethernet Adapter”):

ipconfig
ipconfig su Windows

Da notare che aggiungendo l’opzione /all al comando verranno visualizzate tutte le informazioni relative alla rete (server DNS, gateway, …).

Nel caso di Linux invece il comando da digitare all’interno della shell è:

# ifconfig

(per maggiori dettagli vedere l’articolo rete in Linux).

A questo punto, possiamo provare a controllare l’IP visibile da Internet attraverso uno dei tanti siti che si trovano in giro sul web, ad esempio www.ip-adress.com. L’indirizzo visibile sul sito non corrisponde a quello della macchina? Potrebbe essere così, perché c’è il trucco :-). Come ho scritto su, è vero che ogni computer collegato ad Internet riceve un indirizzo univoco, ma solo se questo è collegato direttamente alla Rete. Molto spesso invece un computer si trova dietro ad un router, come nei sistemi casalinghi, o addirittura all’interno di una LAN più o meno complessa e comunque sempre dietro ad un router e/o firewall, come nei sistemi aziendali dove i pc sono molti. Dunque, esistono due tipi di indirizzi IP: pubblici e privati. La figura mostra un esempio tipico di connessione, dove i singoli computer (PC1, PC2, PC2) sono collegati ad Internet attraverso un router. E’ possibile osservare che ogni computer ha assegnato un indirizzo IP privato, e poi tutti sono collegati allo stesso router (passando per un hub/switch) che funge da punto di contatto tra i pc e Internet. A questo punto è naturale pensare che al router venga assegnato un indirizzo IP pubblico, essendo l’unico punto visibile sulla Rete “esterna”.

topologia_rete
Topologia di una rete

Più in generale, ogni computer o dispositivo collegato direttamente ad Internet (come utilizzando un modem, e non un router!) avrà un indirizzo pubblico, altrimenti se è posto dietro ad un router/firewall avrà un IP privato, ossia visibile solo nella rete locale. I motivi per cui viene assegnato un IP diverso ai computer che si trovano dietro ad un router sono molteplici:

  • utilizzando un router è possibile collegare ad Internet un elevato numero di computer o in più in generale dispositivi, altrimenti per ognuno servirebbe un modem diverso. Inoltre il numero di dispositivi collegati ad Internet sta aumentando sempre più, e poiché il numero totale dei possibili indirizzi IP è limitato (ricordiamo la struttura X.X.X.X, con numero massimo 255 per ogni X), un po’ come le targhe delle macchine, ai computer dietro ad un router vengono assegnati degli indirizzi privati, ossia non visibili da Internet. Ciò significa che due computer diversi, che si trovano dietro a router diversi, possono avere lo stesso indirizzo IP privato;
  • i computer collegati ad Internet attraverso un router risultano anche più protetti, in quanto solo il router risulterà visibile sul web, ma non i computer dietro ad esso e con gli indirizzi privati.

Un’altra precisazione, per chi non sapesse la differenza tra modem e router… Il modem (contrazione di modulator-demodulator) è un dispositivo che traduce i dati inviati da un solo computer in modo tale da trasmetterli sulla Rete, quindi un dispositivo un po’ stupido che esegue solamente questo compito. Quindi se avessimo 10 computer da collegare ad Internet avremmo bisogno di 10 modem. Un router invece è una sorta di “mini-computer”, che non solamente trasmette i dati a/da Internet, ma che ha in genere molte altre funzionalità, tipo quella di firewall (per la protezione dalle intrusioni esterne), di access point (per la creazione di una rete wireless), e la possibilità di collegare ad esso più computer. Quindi con un router è possibile collegare ad Internet un numero elevatissimo di dispositivi, ovviamente in base al tipo e qualità del router. Ci possono essere router casalinghi, da poche decine di euro (TP-Link, Netgear, …), o router professionali dal costo di migliaia di euro (Cisco, Juniper, …). Per maggiori approfondimenti (oltre alla consueta wikipedia):

roghan

GPG parte 1 – Generare una chiave

In questo articolo verrà presentato il software GPG/PGP, verrà spiegato come generare una chiave in un ambiente Linux e come registrarla su un key server. Questo è la prima parte di una serie di articoli che spiegano il funzionamento di GPG.

Parte 2: Criptare e decriptare un messaggio con GPG

Parte 3: Importare/esportare chiavi in GPG

Innanzitutto GPG è un software che implementa lo standard OpenPGP, e dunque utilizza un sistema di crittografia a chiave pubblica, anche detta crittografia asimmetrica. E’ possibile trovare una spiegazione dettagliata della crittografia asimmetrica su wikipedia:

http://it.wikipedia.org/wiki/Crittografia_asimmetrica

Fondamentalmente con questa tipologia di algoritmi entrambe le persone coinvolte nella comunicazione devono disporre di 2 chiavi, una pubblica e una privata. La chiave pubblica, come dice il nome, deve essere distribuita pubblicamente, mentre deve restare assolutamente segreta la chiave privata. Lo schema di funzionamento di un algoritmo asimmetrico è quello mostrato nella figura seguente.

Crittografia_asimmetrica_schema
Funzionamento di un algoritmo di crittografia asimmetrica.

GPG inoltre permette anche di firmare i messaggi, e il funzionamento può essere visto nella figura sotto.

digitalsignatures
Funzionamento di firma digitale unita alla cifratura del messaggio.

Dunque per poter inviare un messaggio questo deve essere firmato con la propria chiave privata e criptato con la chiave pubblica del destinatario. In generale, per poter usare correttamente GPG dobbiamo tenere sempre a mente questi schemi, altrimenti presto o tardi probabilmente faremo confusione con le chiavi.

Dopo aver installato il software nella propria distribuzione e aver visto come funziona un algoritmo di cifratura asimmetrico, è possibile passare alla creazione della chiave.

Generare una chiave GPG

Da shell dobbiamo digitare:

# gpg --gen-key

Dunque ci viene richiesto quale algoritmo di cifratura deve essere usato per la generazione della chiave:

Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1

Possiamo scegliere tranquillamente l’opzione default.

Poi ci viene richiesta la dimensione della chiave:

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)

Direi che la dimensione base (2048) è più che sufficiente.

Poi ci viene richiesto il periodo di validità della chiave:

Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)

In questo caso se la chiave verrà usata per lo scambio di informazioni personali, possiamo tranquillamente non farla scadere mai, mentre se verrà usata per lo scambio di informazioni sensibili e/o professionali allora è bene impostare un intervallo temporale adeguato (1 anno, 6 mesi, 1 mese, …).

Poi sono richieste alcune informazioni personali:

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

—————————————
Real name: Paolino Paperino
Email address: paolino.paperino@paperopoli.com
Comment: My GPG key

quindi ci viene mostrato il riepilogo con le informazioni immesse:

You selected this USER-ID:
"Paolino Paperino (My GPG key) <paolino.paperino@paperopoli.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?

Se i dati inseriti sono corretti possiamo digitare “O” per proseguire.

Adesso ci verrà richiesta la passphrase, che dovrà essere sufficientemente robusta:

You need a Passphrase to protect your secret key.
Enter passphrase:

E’ importante, anzi fondamentale, scegliere la passphrase attentamente, perché da essa dipende la sicurezza della chiave GPG! Nel caso in cui dovessimo dimenticarcela non potremo più leggere/inviare messaggi cifrati, mentre se dovesse essere crackata lo scambio di testi cifrati con GPG non sarebbe più sicuro.

Dunque verrà generata la chiave GPG unica:

gpg: key 257BAFD8 marked as ultimately trusted
public and secret key created and signed.

————————————–
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u

————————————–
pub 2048R/257BAFD8 2012-09-05
Key fingerprint = A197 6014 A02F 6AFD 4007 5C02 FCB1 2276 257B AFD8
uid Paolino Paperino (My GPG key) <paolino.paperino@paperopoli.com>
sub 2048R/D156C60B 2012-09-05

Controllare la chiave

Dopo aver generato una nuova chiave, è buona cosa controllarne i dati:

# gpg --list-key
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/257BAFD8 2012-09-05
uid Paolino Paperino (My GPG key) <paolino.paperino@paperopoli.com>
sub 2048R/D156C60B 2012-09-05

dove possiamo vedere i dati fondamentali:

  • Key ID: 257BAFD8
  • Real Name: Paolino Paperino
  • E-mail: paolino.paperino@paperopoli.com
  • Expiration date: 2012-09-05

Generare una chiave pubblica

Il prossimo step è quello di salvare la chiave pubblica GPG per poi poterla inviare ad amici o colleghi, in modo che loro possano inviarci messaggi cifrati. Per esportare la chiave pubblica in un file la sintassi da usare è la seguente:

# gpg --armor --output GPG_public_key --export Real Name

oppure

# gpg --armor --output GPG_public_key --export E-mail

oppure

# gpg --armor --output GPG_public_key --export Key ID

E’ da notare che il risultato dei 3 comandi precedenti è identico.

Nel nostro esempio i comandi precedenti diventeranno:

# gpg --armor --output GPG_public_key --export Paolino Paperino
# gpg --armor --output GPG_public_key --export paolino.paperino@paperopoli.com
# gpg --armor --output GPG_public_key --export 257BAFD8

Inviare la chiave ad un key server

Infine, l’ultimo passo (facoltativo) è di inviare la chiave pubblica ad un key server, un server che raccoglie le chiavi pubbliche. Inserendo la chiave in un key server, chiunque voglia inviarci un messaggio cifrato non avrà il bisogno di chiedere a noi la chiave, ma potrà semplicemente cercarla sul server. Il comando da eseguire è questo:

# gpg --send-keys --keyserver url_server Key ID

Per il nostro esempio abbiamo:

# gpg --send-keys --keyserver hkp://subkeys.pgp.net 257BAFD8

Le altre parti sono disponibili a questi link:

Parte 2: Criptare e decriptare un messaggio con GPG

Parte 3: Importare/esportare chiavi in GPG

roghan

Trucchi per scaricare i video da youtube in Linux

L’argomento di oggi è youtube: vedremo come è possibile scaricare i video con Linux, e quali sono le principali opzioni. Il programma di cui abbiamo bisogno per scaricare i video è youtube-dl, il quale è disponibile nei repository delle principali distribuzioni Linux. Questo software funziona unicamente da linea di comando, e il suo utilizzo è semplice se conosciamo le opzioni giuste da usare ;-), anzi secondo me è anche più semplice di altri software con GUI analoghi! […]

L’argomento di oggi è youtube: vedremo come è possibile scaricare i video con Linux, e quali sono le principali opzioni. Il programma di cui abbiamo bisogno per scaricare i video è youtube-dl, il quale è disponibile nei repository delle principali distribuzioni Linux. Questo software funziona unicamente da linea di comando, e il suo utilizzo è semplice se conosciamo le opzioni giuste da usare ;-), anzi secondo me è anche più semplice di altri software con GUI analoghi!

YouTube-Logo

1 – Scaricare un video da youtube

Il primo passo sarà quello di installare youtube-dl, o tramite repository, oppure scaricando il software dal sito ufficiale.

Dopo averlo installato, al primo avvio occupiamoci di aggiornare il programma alla versione più recente con l’opzione U:

# youtube-dl -U
Updating to latest version...
Updated youtube-dl. Restart youtube-dl to use the new version.

Passiamo subito a vedere come è possibile scaricare i video inclusi di audio.

Scelto il video da scaricare, prima di tutto controlliamo con quali formati è disponibile, in modo da scegliere quello riteniamo più adatto:

$ youtube-dl -F video_da_scaricare

Il comando restituisce un elenco dei formati disponibili, con annessa risoluzione grafica. Vediamo un esempio:

$ youtube-dl -F http://www.youtube.com/watch?v=oyauS1x54hM&feature=fvwrel
Setting language
oyauS1x54hM: Downloading video webpage
oyauS1x54hM: Downloading video info webpage
oyauS1x54hM: Extracting video information
Available formats:
37 : mp4 [1080x1920]
45 : webm [720x1280]
22 : mp4 [720x1280]
35 : flv [480x854]
43 : webm [360x640]
34 : flv [360x640]
18 : mp4 [360x640]
5 : flv [240x400]
17 : mp4 [144x176]

E’ possibile osservare sulla sinistra una serie di numeri, mentre sulla destra vengono mostrati il formato (mp4, webm, …) e la risoluzione. La risoluzione e il formato decretano la qualità generale del video. Nella seguente tabella di wikipedia sono messi a confronto i formati:

http://en.wikipedia.org/wiki/YouTube#Quality_and_codecs

Nel caso in cui siano disponibili più formati (come nell’esempio precedente),è possibile scegliere quello più adatto alle proprie necessità. Se dobbiamo scaricare una grande quantità di video, o se la qualità non è l’elemento principale, possiamo scegliere una risoluzione media, tipo 360×640. Se dobbiamo invece scaricare pochi video e ci interessa l’alta definizione, possiamo optare anche per una risoluzione alta, come 1080×1920. Dobbiamo ricordare che ad una maggior qualità audio/video corrisponde in genere un file di dimensioni maggiori. Nel caso dell’esempio la qualità massima è quella del formato mp4 con numero 37. Laddove possibile, personalmente preferisco il formato mp4 per avere una maggiore portabilità, rispetto ad esempio a flv.

Dunque, dopo aver scelto la qualità procediamo a scaricare il video con questo comando:

$ youtube-dl -t -f formato video_da_scaricare

Tornando all’esempio precedente abbiamo:

$ youtube-dl -t -f 37 http://www.youtube.com/watch?v=oyauS1x54hM&feature=fvwrel

Le opzioni usate in questo comando sono t, che imposta il nome del file scaricato uguale a quello del video youtube, e l’opzione f per specificare il formato da scaricare.

2 – Estrarre l’audio di un video come mp3

Una particolare funzionalità di youtube-dl è quella che permette di estrarre da un video solo la componente audio, ed in formato mp3. Per fare ciò, è necessario avere installato nel sistema ffmpeg, aggiornato all’ultima versione disponibile. Per estrarre l’audio in mp3 il comando da dare è il seguente:

# youtube-dl -t -f formato --extract-audio --audio-format mp3 --audio-quality 256k video_di_youtube

Con un esempio, il comando precedente diventerebbe:

# youtube-dl -t --max-quality 37 --extract-audio --audio-format mp3 --audio-quality 256k http://www.youtube.com/watch?v=mqVMZB5KPjY

3 – Ottenere informazioni audio/video di un file

Un software molto utile è Mediainfo, installabile sia con GUI che senza e in grado di fornire dettagliatissime informazioni audio e video di un file. Se il software non dovesse essere presente all’interno dei repository è possibile recuperarlo, per la maggior parte delle distribuzioni (anche per Windows e Mac OS X), a questo link:

http://mediainfo.sourceforge.net/it

Un esempio di utilizzo di Mediainfo è:

$ mediainfo Loca_Shakira-G5Q9vSXoKQ8.mp4
General
Complete name : Loca_Shakira-G5Q9vSXoKQ8.mp4
Format : MPEG-4
Format profile : Base Media / Version 2
Codec ID : mp42
File size : 14.1 MiB
Duration : 3mn 7s
Overall bit rate mode : Variable
Overall bit rate : 634 Kbps
Encoded date : UTC 2011-07-17 07:38:03
Tagged date : UTC 2011-07-17 07:38:03
gsst : 0
gstd : 187120
gssd : BADC202E5HH1342530140109985
gshh : o-o.preferred.mil01s12.v15.nonxt8.c.youtube.com
----------------------------
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Baseline@L1.3
Format settings, CABAC : No
Format settings, ReFrames : 1 frame
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 3mn 7s
Bit rate : 534 Kbps
Maximum bit rate : 762 Kbps
Width : 400 pixels
Height : 226 pixels
Display aspect ratio : 16:9
Frame rate mode : Constant
Frame rate : 25.000 fps
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.236
Stream size : 11.9 MiB (84%)
Tagged date : UTC 2011-07-17 07:38:03
----------------------------
Audio
ID : 2
Format : AAC
Format/Info : Advanced Audio Codec
Format profile : LC
Codec ID : 40
...

Buon download a tutti!!

roghan

GPG parte 3 – Importare/esportare chiavi

Ho in mente di scrivere una serie di articoli sul funzionamento di GPG (GNU Privacy Guard), per poi raccoglierli all’interno di una guida (magari anche in inglese). Sul web si trovano facilmente guide e howto su GPG e su come usarlo da shell, ma ho la necessità di creare la mia propria documentazione, da usare come punto di riferimento anche in futuro.

Per ora vediamo come fare il backup e il ripristino di una chiave GPG . Tale necessità può esserci se vogliamo usare GPG su sistemi diversi usando ovviamente le stesse chiavi di cifratura, come ad esempio se cifriamo un messaggio con il pc dell’ufficio e dobbiamo decifrarlo con il pc di casa. […]

Ho in mente di scrivere una serie di articoli sul funzionamento di GPG (GNU Privacy Guard), per poi raccoglierli all’interno di una guida (magari anche in inglese). Sul web si trovano facilmente guide e howto su GPG e su come usarlo da shell, ma ho la necessità di creare la mia propria documentazione, da usare come punto di riferimento anche in futuro.

Per ora vediamo come fare il backup e il ripristino di una chiave GPG . Tale necessità può esserci se vogliamo usare GPG su sistemi diversi usando ovviamente le stesse chiavi di cifratura, come ad esempio se cifriamo un messaggio con il pc dell’ufficio e dobbiamo decifrarlo con il pc di casa.

Backup/esportazione di una chiave GPG

Per prima cosa controlliamo le chiavi installate all’interno del sistema:

# gpg --list-keys
/root/.gnupg/pubring.gpg
-------------------------------
pub 2048R/9F508959 2012-07-03
uid Paolino Paperino <paolino.paperino@paperopoli.com>
sub 2048R/2C98FA15 2012-07-03
-------------------------------
pub 2048R/AB2C995F 2012-07-03
uid Zio Paperone <zio.paperone@paperopoli.com>
sub 2048R/D643E356 2012-07-03

Dunque dobbiamo scegliere la chiave di cui vogliamo fare il backup, per poi fare la copia della chiave pubblica e di quella privata. Nell’esempio le chiavi installate sono due: 9F508959 e DC2C775F. Per fare la copia rispettivamente della chiave pubblica e di quella privata la sintassi è la seguente (per maggior chiarezza userò i nomi completi delle opzioni, almeno dove possibile):

# gpg --armor --output <filename> --export <keyname>
# gpg --armor --output <filename> --export-secret-keys <keyname>

L’opzione armor permette di creare un output in caratteri ASCII, simile a questo

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)mQENBE/1likBCACUfcgaiMfznrEQKXV4x0rPpixqEW+m8vXBF5I2BPuzeKUrB9Ot
YZhuZujuheLjj+Quh5rBFntGoPW3rO430Voq5/PJew54P5Smx6K09paB6pGbzmgk
...
INmtEZwlEvYMrINVOKbKXRk=
=8NiR
-----END PGP PUBLIC KEY BLOCK-----

Se l’opzione armor viene invece omessa, l’output prodotto sarà binario.

Supponendo di voler fare il backup della chiave 9F508959 dell’esempio, i comandi sono:

# gpg --armor --output GPG_public_key --export 9F508959
# gpg --armor --output GPG_secret_key --export-secret-keys 9F508959

Infine, per completare la fase di backup è consigliabile generare anche una chiave di revoca con questo comando:

# gpg --output <filename> --gen-revoke <keyname>

Nel caso dell’esempio, il comando precedente diventerebbe:

# gpg --output GPG_revoke_key --gen-revoke 9F508959

Dopo che le chiavi sono state salvate memorizziamo i relativi file in un supporto sicuro, e possibilmente mobile (CD, DVD, …) anziché all’interno dello stesso sistema in cui è installato GPG!

Ripristino/importazione di una chiave GPG

Se vogliamo ripristinare una chiave GPG, o ad esempio importarla su un nuovo sistema (dal pc dell’ufficio a quello di casa), il comando è il seguente:

# gpg --import <filename>

dove <filename> rappresenta il file contenente la chiave (pubblica o privata) precedentemente esportata. Riprendendo l’esempio precedente, i comandi necessari per importare le chiavi sono questi:

# gpg --import GPG_public_key
# gpg --import GPG_secret_key

roghan

Come nascondere in Linux l’output di un comando nella shell

E’ possibile nascondere l’output di un comando o di un’applicazione della shell in questo modo: […]

E’ possibile nascondere l’output di un comando o di un’applicazione della shell in questo modo:

$ command > /dev/null

Ossia l’output del comando non verrà mostrato nella console, ma sarà rediretto a /dev/null e quindi risulterà non visibile. Il comando viene comunque sempre eseguito.

Per nascondere tutto l’output del comando, compresi gli errori, il comando è invece il seguente:

$ command &> /dev/null

roghan

Configurare un proxy da shell in Linux

Oggi vedremo come configurare il sistema per permettere alle applicazioni da linea di comando di utilizzare un proxy. Le applicazioni da linea di comando molto spesso non hanno infatti nativamente l’opzione per veicolare le trasmissioni verso un proxy, diversamente dalle applicazioni grafiche (ad esempio i browser hanno sempre le opzioni per la configurazione di eventuali proxy). Dunque, la soluzione per la linea di comando è quella di configurare i parametri del proxy come variabile d’ambiente, e costringere in questo modo l’applicazione a passare dal proxy. Tramite la shell sono supportati i proxy con protocollo HTTP, HTTPS, e FTP. Vediamo adesso in dettaglio come fare. […]

Oggi vedremo come configurare il sistema per permettere alle applicazioni da linea di comando di utilizzare un proxy. Le applicazioni da linea di comando molto spesso non hanno infatti nativamente l’opzione per veicolare le trasmissioni verso un proxy, diversamente dalle applicazioni grafiche (ad esempio i browser hanno sempre le opzioni per la configurazione di eventuali proxy). Dunque, la soluzione per la linea di comando è quella di configurare i parametri del proxy come variabile d’ambiente, e costringere in questo modo l’applicazione a passare dal proxy. Tramite la shell sono supportati i proxy con protocollo HTTP, HTTPS, e FTP. Vediamo adesso in dettaglio come fare.

Prima di tutto controlliamo tra le variabili d’ambiente che non siano già impostati proxy:

# ENV | grep -i proxy

Se non viene ritornato niente possiamo procedere a configurare il/i proxy:

# export http_proxy=http://<proxy-server-ip>:<port>
# export https_proxy=http://<proxy-server-ip>:<port>
# export ftp_proxy=http://<proxy-server-ip>:<port>

Nel caso in cui ci siano già state definite variabili proxy, è possibile eliminarle e definirle nuovamente:

# unset http_proxy
# export http_proxy=”http://<proxy-server-ip>:<port>”

Ricordo che le variabili d’ambiente definite con i comandi precedenti risultano temporanee, mentre per renderle permanenti è necessario modificare i file .bash_profile o .bashrc, come ho scritto dettagliatamente in questo post:

[GNU/Linux] Come configurare le variabili d’ambiente

Nel caso in cui il proxy richieda l’autenticazione è necessario invece configurare le variabili d’ambiente in questo modo:

# export http_proxy=<username>:<password>@http://<proxy-server-ip>:<port>/

Infine controlliamo di aver correttamente definito le variabili, osservando l’output dei comandi:

# echo $http_proxy
# echo $https_proxy
# echo $ftp_proxy

Ulteriori risorse sui proxy in Linux:

roghan