Encrypted Server

maggio 18, 2010
By

Oggi inizio la migrazione di un server linux x86 in ambiente x86_64 e su filesystem criptato. Ci metterò un po’ di tempo in più del dovuto perché documenterò tutti i passaggi sia per mia futura memoria che per utilità altrui.

L’obiettivo è avere un server con una partizione criptata per i dati, ma con la possibilità di fare un ciclo di boot autonomamente in caso di mancanza di corrente, attivando ssh dando quindi la possibilità di rimontare la partizione criptata anche da remoto.
È chiaramente una soluzione a metà fra una reale e completa cifratura e la possibilità di avere un sistema remoto unmanaged in grado di riprendersi.
La soluzione in assoluto più sicura sarebbe quella di mettere la /boot su una chiave usb e di montare la / criptata inserendo la chiave in fase di boot.
In questo modo però in caso di reboot sarebbe necessaria la presenza di un operatore e dei necessari dispositivi di input.

Il punto di partenza è un server con processore Atom. /proc/cpuinfo dice quanto segue:

processor       : 1
vendor_id       : GenuineIntel
cpu family      : 6
model           : 28
model name      : Intel(R) Atom(TM) CPU  230   @ 1.60GHz
stepping        : 2
cpu MHz         : 1595.843
cache size      : 512 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 1
apicid          : 1
initial apicid  : 1
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm constant_tsc arch_perfmon pebs bts pni dtes64 monitor ds_cpl tm2 ssse3 cx16 xtpr pdcm movbe lahf_lm
bogomips        : 3191.83
clflush size    : 64
power management:

La configurazione di servizi e kernel viene migrata dalla vecchia macchina a quella nuova.
Per la parte del kernel bisogna sincerarsi di abilitare le seguenti voci nel kernel della macchina target:

 File systems  --->
   <*> Second extended fs support
   <*> The Extended 4 (ext4) filesystem
 Device Drivers  --->
   Block devices  --->
     <*> Loopback device support
   Multiple device driver support (RAID and LVM)  --->
     <*>   Device mapper support
     <*>   Crypt target support
 Cryptographic options  --->
    <*>   SHA224 and SHA256 digest algorithm
    <*>   AES cipher algorithms
    <*>   AES cipher algorithms (x86_64)

Il passaggio di architettura da 32 a 64bit verrà effettuato in ambiente chroot, in modo da limitare al massimo il downtime.
Come macchina “nutrice” userò il desktop che monta un core2 duo su cui gira al momento una Gentoo x86_64 e che quindi mi permetterà di andare in una chroot 64bit senza problemi.
Il drawback di questo approccio è che bisognerà dire al compilatore di creare codice per x86_64 generici, ma essendo l’obiettivo un server che deve andare in produzione non avrei comunque spinto il compilatore a cercare particolari ottimizzazioni a rischio di instabilità.

Il layout delle partizioni sarà come segue:
/boot (70MB) ext2
/ ( 50GB ) ext4 non criptata
/var ext4 criptata
Lo swap sarà su un file da 4GB e non su partizione dedicata

Dato che si parla di un server le /home (compresa /root) saranno contenuto in /var/home per beneficiare della cifratura del server stesso, senza differenziare le passwortd fra un utente e l’altro, del resto non ci saranno praticamente utenti. La /etc resterà per la maggior parte nella / non criptata, tranne per le configurazioni dei servizi che prevedono qualche dato che si vorrà tenere al sicuro; in quel caso le cartelle saranno in /var/enc_etc/ e in /etc metteremo dei symlink
Come passo opzionale creeremo un runlevel per quando avremo montato la partizione criptata, in modo da non cercare di far partire i servizi che necessitano di dati che teniamo criptati prima che la partizione sia disponibile.

Il primo passo è la creazione delle partizioni. Tenendo conto che il disco che ospiterà il sistema nel mio caso è /dev/sde bisognerà fare quanto segue:

#fdisk /dev/sde
n
p
1
(invio)
+70M
n
p
2
(invio)
+50GB
n
p
3
(invio)
(invio)
a
1
w

In questa maniera abbiamo creato le partizioni per come definito poco sopra, abbiamo marcato la prima come bootabile e abbiamo scritto il tutto sulla tabella delle partizioni dell’unità.
Chiaramente bisogna prestare molta attenzione al fatto che stiamo operando sul disco che realmente ci interessa: modificare le partizioni del disco di sistema è una pessima cosa, se poi inoltre non si ha un backup si entra diretti nella catastrofe 🙂

Fatto questo bisogna attivare la cifratura sulla partizione che andrà criptata e creare il filesystem su tutte
Per prima cosa attiviamo la cifratura:

#cryptsetup -y -s 256 luksFormat /dev/sde3
Rispondiamo YES
Inseriamo due volte la password
#cryptsetup luksOpen /dev/sde3 altraVar
#mkfs.ext4 /dev/mapper/altraVar

Con gli ultimi comando decifriamo il volume e lo mappiamo in /dev/mapper/altraVar e lo formatteremo (luks sta sotto al filesystem). Lo monteremo successivamente sulla /var nell’ambiente chrootato.
Formattiamo anche le altre partizioni e siamo pronti per entrare nella chroot, dopo avere scompattato uno stage3 appropriato.

#mkfs.ext4 /dev/sde2
#mkfs.ext2 /dev/sde1
#mount /dev/sde2 /mnt/gentoo
#mkdir /mnt/gentoo/boot && mount /dev/sde1 /mnt/gentoo/boot
#mkdir /mnt/gentoo/var && mount /dev/mapper/altraVar /mnt/gentoo/var

A breve la seconda parte

Tags: , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


*