Visualizzazione post con etichetta linux. Mostra tutti i post
Visualizzazione post con etichetta linux. Mostra tutti i post

mercoledì 11 febbraio 2009

Recupero accesso di amministratore

Recupero dell'accesso di amministratore (root) in un sistema linux Ubuntu e riflessione sulla sicurezza dei dati.
Vi racconto un'altra esperienza di "recupero" di un danno dovuto, questa volta, ad un errore umano e non ad un guasto hardware. Non è nulla di particolarmente "innovativo" ma spero possa servire a qualcuno che si dovesse trovare nella stesa situazione. Cercherò di spiegarlo con parole semplici, senza dare nulla per scontato.
Premessa. In un sistema linux esiste un "super utente" che ha la possibilità di vedere e modificare ogni file, si chiama "root". L'utente con cui normalmente si accede al sistema è, invece, generalmente, meno privilegiato e può modificare solo alcuni file. Per le operazioni di configurazione del sistema o l'installazione dei programmi è necessario connettersi con l'utente root.
Veniamo ora ad un altro concetto: i "gruppi". Ogni utente può appartenere a uno o più gruppi. Un gruppo non è altro che un modo per assegnare ad un insieme di utenti i permessi per certi file relativi ad un unico ambito. Esempio: il gruppo "lp" permette di utilizzare tutte le funzionalità relative alla porta parallela: tutti gli utenti che appartengono al gruppo lp possono usare la porta parallela. Mi scusino gli esperti per questa descrizione ultra-semplificata ma è necessaria per capire quanto segue.
Le distribuzioni Ubuntu hanno, per impostazione predefinita, l'utente "root" disabilitato, nel senso che non ha una password impostata per cui non è possibile accedere direttamente al sistema come "root" ma solo con il proprio utente definito in fase di installazione. Come è possibile allora effettuare le operazioni di configurazione ed installazione? Risposta: con il comando sudo (Super User DO). In pratica un utente "normale" può scrivere sul terminale "sudo" seguito da un qualsiasi comando ed esso verrà eseguito come se fosse l'utente root. Sudo prevede generalmente, come misura di sicurezza, il reinserimento della password dell'utente. Anche se non utilizzate il terminale dei comandi in Ubuntu vi sarete certamente imbattuti nella versione "grafica" dello stesso comando che vi richiede la password ogni volta che tentate di eseguire una operazione "riservata". Chi può usare il comando sudo? Certo non chiunque, altrimenti non ci sarebbe la possibilità di impostare dei livelli di sicurezza. Gli utenti che abilitati a sudo sono quelli definiti nel file /etc/sudoers (che ovviamente può essere modificato solo da un utente che possa già, a sua volta, effettuare sudo). In Ubuntu sudo è configurato in modo da dare la possibilità di utilizzarlo a tutti gli utenti del gruppo "admin" e generalmente, in una installazione standard, viene creato un solo utente con il proprio nome e che appartiene anche al gruppo admin (se cè solo un utente non può essere che lui l'amministratore!).
Cosa succederebbe se inavvertitamente (o meglio stupidamente) un utente si auto-eliminasse dal gruppo admin? Ebbene, è proprio quello che ho fatto. Ovviamente è sempre possibile togliersi dal gruppo ma solo un utente amministratore può aggiungere qualcuno allo stesso. Siccome l'unico utente ero io non c'era più (quasi) niente da fare: è stato un po' come chiudersi fuori casa lasciando le chiavi dentro!
La soluzione? La chiavetta USB che ho usato per il recupero dati (vedi post precedente). Avviando Ubuntu "live" dalla chiavetta, il disco rigido è leggibile e scrivibile, quindi è possibile ripristinare i gruppi modificando il file /etc/group (è il file dove vengono salvate tutte le impostazioni dei gruppi). Procedura pratica:
Aprire un terminale
Digitare
sudo mkdir -p /mnt/disco
(crea una directory "disco" dove monteremo l'hard disk; notare che "sudo" funziona perché ora stiamo lavorando nel sistema caricato dalla chiavetta e non su quello installato)
sudo mount /dev/sda1 /mnt/disco
(monta la partizione del disco nella directory appena creata. Attenzione:  sda1 è la prima partizione del primo disco scsi (o SATA), per un disco IDE la prima partizione del primo disco sarà hda1, se il disco è sul secondo canale IDE sarà hdb1, se la partizione non è la prima sarà hda2, hda3, ecc...)
sudo cp /mnt/disco/etc/group- /mnt/disco/etc/group
Ho visto che il vecchio file dei gruppi (contenente la versione in cui il mio utente apparteneva al gruppo admin) è stato salvato in un file con un "-" alla fine. Quindi al posto di modificare il file /etc/group l'ho semplicemente sovrascritto con la versione vecchia.
Riavviare e togliere la chiavetta in modo che parta il sistema dal disco rigido: se tutto è andato bene il problema dovrebbe essere risolto.
Una riflessione finale. Notate come sia semplice leggere dati da un computer anche con un sistema sicuro come linux e protetto da password. Se è impostato il boot da usb (oppure se il BIOS non è protetto da password, quindi chiunque può modificarlo) è sufficiente inserire una chiavetta con Ubuntu, avviare il PC e montare il disco: tutti i dati sono leggibili!
Mettere una password al BIOS potrebbe già essere una sicurezza in più ma è sempre possibile che qualcuno stacchi fisicamente l'hard-disk collegandolo ad un altro PC e montandolo come descritto. Probabilmente la soluzione più sicura sarebbe quella di utilizzare filesystem criptati ma il loro uso al momento è decisamente poco frequente in ambito casalingo.

giovedì 10 gennaio 2008

Macchina virtuale per VMware "da zero" (parte II)

Provo ora a costruire un hard disk virtuale. La prima buona notizia è che, a differenza del file di configurazione vmx, il file vmdk, che definisce i dischi, ha una documentazione ufficiale scaricabile dal sito di VMware. Mi sembra abbastanza chiara. Prima di tutto viene definito cosa è un disco virtuale. In generale un disco può essere composto da una catena di link dove il primo elemento è il disco base e tutti i successivi (collegati in catena) sono i delta link che vengono creati ogni volta che viene generato uno snapshot (cioè una foto istantanea) del disco. Questa architettura permette di avere quindi delle istantanee in momenti precisi e poter eventualmente ripristinare il disco a questi punti. A me per ora interessa creare solamente un "disco base", quindi cercherò di evitarmi complicazioni in questo senso. Ogni link è composto da uno o più extent, un extent è uno spazio "fisico" nel quale sono memorizzati i dati e generalmente è un file del sistema "reale" (ma potrebbe essere anche un hard disk reale o una partizione di un hard disk reale)
  • il link può utilizzare un singolo extent oppure l'insieme di più piccoli extent
  • lo spazio utilizzato può essere allocato tutto in fase di creazione del disco, oppure può crescere dinamicamente nel momento in cui c'è l'esigenza di archiviare i dati.
La struttura di link di un disco virtuale è definita in un file di configurazione ("descriptor file", cioè un file di testo con estensione .vmdk) Dopo questa premessa (essenziale per capire) inizio a creare il file di configurazione (xubuntu.vmdk) secondo le specifiche. Prima di tutto la versione che è 1:
version = 1
Successivamente devono essere inseriti due parametri che definiscono un identificativo univoco del link (CID) e l'identificativo del link padre (parentCID). Gli identificativi sono valori casuali a 32bit e nel file di configurazione sono espressi in forma esadecimale. Nel mio caso il disco base non ha un link padre, quindi parentCID deve essere impostato ad un valore predefinito che da specifiche è (~0x0) (cioè la negazione di uno zero che nella rappresentazione esadecimale diventa ffffffff). In pratica i parametri da impostare sono:
CID=fffffffe
parentCID=ffffffff
Il parametro successivo consente di definire il tipo di disco. Tra le varie opzioni possibili scelgo "twoGbMaxExtentSparse" che genera, per ogni link, diversi extent (con una dimensione massima di 2Gb ciascuno) e alloca lo spazio dinamicamente (così non ho bisogno di occupare effettivamente tutto lo spazio del disco virtuale. Scrivo quindi: createType="twoGbMaxExtentSparse" Ora devono essere definiti i singoli extent. Vorrei un disco da 10Gb, quindi lo costruisco con 5 extent di 2Gb l'uno. La sintassi per definire un extent è la seguente:
modalità dimensione tipo nome
modalità
indica se è in scrittura o in sola lettura, imposto RW (lettura e scrittura)
dimensione
è la dimensione dell'extent espressa in settori, 1 settore = 512 byte. Se voglio un extent da 2 Gb scrivo 2 * 1024 * 1024 * 1024 / 512 = 4194304
tipo
uso SPARSE che indica che lo spazio viene allocato solo quando serve
nome
è il nome del file che contiene i dati. Utilizzando la sintassi consigliata lo chiamo xubuntu-s0001.vmdk la "s" indica che è di tipo SPARSE mentre 0001 è un numero progressivo. Riassumendo scrivo:
RW 4194304 SPARSE "xubuntu-s0001.vmdk"
RW 4194304 SPARSE "xubuntu-s0002.vmdk"
RW 4194304 SPARSE "xubuntu-s0003.vmdk"
RW 4194304 SPARSE "xubuntu-s0004.vmdk"
RW 4194304 SPARSE "xubuntu-s0005.vmdk"
L'ultima parte del file di descrizione del disco definisce come sarà visto l'hardware dalla macchina virtuale. È necessario definire il tipo di interfaccia (adapterType) che imposto a "ide" e la geometria del disco; uest'ultima mi risulta un po' più complessa da capire, e deve essere coerente con la dimensione effettiva del disco. Un'altra volta proverò ad approfondire il significato dei parametri, per ora mi limito ad utilizzare questa tabella. Quindi, copiando, scrivo:
ddb.adapterType = "ide"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "16"
ddb.geometry.cylinders = "16383"
Ora il file di configurazione dovrebbe essere completo. Mi resta solo un dubbio. I file del disco (xubuntu-s0001.vmdk) vengono generati direttamente da VMPlayer all'avvio o devono già esistere? Proviamo a partire senza. Niente: non parte! Proviamo a partire generando dei file vuoti... non parte! Probabilmente è necessario generare i file degli extent già nel formato corretto. La cosa è diventata un po' più complessa del previsto. Ma penso che questa sarà un'altra puntata!

sabato 5 gennaio 2008

Macchina virtuale per VMware "da zero" (parte I)

Mi trovo ad aver bisogno di un PC con linux ma non possiedo un hardware sul quale installarlo. Ho però un bel portatile con Windows Vista 1G di RAM e molto spazio sull'HD: vorrei provare ad installare Ubuntu su un server virtuale con VMWare. Nulla di particolare: ci sono molte guide in rete per questo tipo di operazione ma proviamo in diretta. Gli ingredienti sono:
  • VMWare Player (scaricabile dal sito di VMWare)
  • Immagine ISO del CD di installazione di XUbuntu Linux (Ho scelto la distribuzione Xubuntu al posto della "sorella maggiore" Ubuntu poiché è più leggera.
Prima di tutto è necessario generare una macchina virtuale da utilizzare per installare il sistema operativo. Su internet esiste un ottimo sito (EasyVMX) che permette di configurare online la propria macchina virtuale e scaricarla. Purtroppo, sebbene l'avessi già usato con buoni risultati altre volte, la macchina generata da EasyVMX non ne vuole sapere di funzionare: sembra che vada tutto bene ma poi dopo alcuni secondi l'applicazione non risponde più. Tempo sprecato. Decido di tentare un'altra strada: creare a mano i file di configurazione! Dopotutto è sufficiente un file di testo contenente la configurazione ed eventualmente i file di descrizione degli hard disk virtuali. È l'occasione per sperimentare qualcosa di nuovo! Per fortuna qualcuno ha già pensato di scrivere qualcosa sulla sintassi dei file di configurazione vmx! Seguirò le regole suggerite dall'autore del sito: "i file di configurazione piccoli sono meglio di quelli grandi" e "fatto in casa è meglio". Iniziamo. Creo il file xubuntu.vmx contenente il minimo indispensabile:
config.version = "8"
virtualHW.version = "6"
guestOS = "ubuntu"
Provo a far partire la macchina: non farà nulla ma almeno vediamo se parte. Tutto OK: mi dice che non trova il sistema operativo :). Dopo aver eseguito VMware Player con la configurazione creata, vengono aggiunte automaticamente alcune righe al file .vmx: in particolare
floppy0.fileName = "A:"
Questa non mi piace: ha impostato di default un lettore floppy mappato sul drive A: del mio PC reale, siccome non ho il floppy, per evitare problemi la sostituisco con:
floppy0.present = "false"
Inizio ad aggiungere "pezzi" alla macchina. Per la scheda di rete scelgo la modalità NAT che permette di condividere semplicemente la connessione a internet del PC reale e imposto "e1000" come modello di scheda siccome è consigliato per sistemi operativi "moderni":
ethernet0.present= "true"
ethernet0.startConnected = "true"
ethernet0.virtualDev = "e1000"
ethernet0.connectionType = "nat"
La RAM (deve essere un multiplo di 4) la imposto a 256 Mb... meglio non esagerare, altrimenti mi occupa tutta quella reale!
memsize = "256"
La scheda audio (impostazioni minimali consigliate):
sound.autodetect = "TRUE"
sound.fileName = "-1"
sound.present = "TRUE"
Ora aggiungo il lettore CD-ROM mappandolo sull'immagine ISO di Xubuntu:
ide1:0.present = "true"
ide1:0.deviceType = "cdrom-image"
ide1:0.filename = "xubuntu-7.10-desktop-i386.iso"
ide1:0.startConnected = "TRUE"
Provo di nuovo ad avviare la macchina: manca ancora l'hard disk ma il CD di Xubuntu parte anche come "live CD" e posso comunque vedere se funziona. Anche questa volta la fortuna mi assiste: funziona perfettamente, compreso l'accesso a internet. Ora viene la parte che mi sembra più difficile: aggiungere un hard-disk. Nella configurazione aggiungo
ide0:0.present = "TRUE"
ide0:0.deviceType = "disk"
ide0:0.filename = "xubuntu.vmdk"
e dovrebbe essere sufficiente. Ora devo costruire il file di configurazione del disco (.vmdk)... ma meglio rimandare alla prossima puntata!