Sei sulla pagina 1di 13

CFS, montiamo un filesystem criptato su un cluster SUN

ing. R. Turco (rosario_turco@virgilio.it)

A volte nei sistemi Unix/Linux si fa uso di account machine to machine in SFTP per
ricevere file che possono contenere dati sensibili; Tali file ottenuti tramite un flusso
batch dovranno essere rielaborati ulteriormente da un ETL, da un Dispatcher o da un
sistema ESB per ricavare informazioni da inserire in un database o produrre un flusso
on-line in una architettura SOA.

In termini di sicurezza occorre fare attenzione al duplice problema del transito dei
dati con protocolli sicuri (SFTP, SSH, etc) e della permanenza dei file sul file system
stesso per un certo periodo.

Possibili soluzioni alla permanenza dei file potrebbero essere:


 Un database in cui memorizzare i file dopo la elaborazione, in colonne BLOB o
CLOB o crittate e mantenerli lì finché una procedura di svecchiamento possa
eliminarli dopo un certo tempo; questa soluzione semplice ha l’inconveniente che
i file non sono facilmente leggibili se occorre una operazione di ritrasmissione o
rielaborazione
 Usare un file system crittato, accessibile solo da un amministratore autorizzato

Nel panorama file system crittato con buoni algoritmi di cifratura appare CFS, un
prodotto Open Source.

I vantaggi nell’uso di CFS sono diversi:


o capace di rendere un filesystem criptato e, quindi, a cifratura automatica

o Trust con uso di smart-card e in modalità base

o senza generazione di chiavi, nè residenza della stessa su filesystem

o senza necessità di Key Management, distribuzione chiavi e conservazione chiavi


o con generazione dell'utente solo della password (passphrase) di utilizzo del
filesystem criptato con lunghezza minima di 16 caratteri. Essa è la passphrase
di utilizzo del filesystem e non di una chiave di crittaggio e deve essere nota
all'operatore autorizzato all'accesso ai dati criptati e all'applicativo
(configurabile).

o ad algoritmo simmetrico con combinazione ricorsiva di almeno due DSA


codebook (64 bit-> 2x64=128 bit) e stream cipher (256 Kbyte) fino al
raggiungimento del 3-DES

o pochissime vulnerabilità

Esiste anche una versione per Windows ( vedi il link:


http://cfs.umbi.umd.edu/cfs/software/download.htm )

Lo svantaggio/croce e delizia dei fai da sè:


- occorre compilarselo sulla piattaforma Unix/Linux che si dispone
- se si ha un cluster occorre configurarlo in modo opportuno

Nel seguito si suppone di usare una versione cfs-1.4.1,tar ma voi userete l’ultima
versioni disponibile sul sito.

Ecco gli step necessari, da verificare in base alla propria piattaforma:

#Step 0 – Procurarsi il tar

#Step 1 – Starare da root il pacchetto tar (es: cfs-1.4.1,tar)

#Step 2 - Leggersi il README.install e verificare cosa modificare del Make

Generalmente servono questi sotto-step:


- Assegnare da root la variabile nel seguente modo:
PATH=/usr/ucb:$PATH;export PATH
- Verificare la directory dove è il compilatore cc sul sistema per inserirla nel
Makefile
- Accedere alla directory cfs-1.4.1 e modificare Makefile come in allegato
- Effettuare i comandi:
make clean
make installa_cfs

Il make installa il tutto in /usr/local/etc il daemon cfsd e in /usr/local/bin


tutti gli eseguibili necessari. Make e script sono mostrati in APPENDICE.

#Step 3 - Installazione in produzione

In produzione non si può fare compilazione, né conviene portare sul versionatore del
software (SVN, PVCS, CVS o altro) i sorgenti e il Makefile per una questione di
sicurezza. Per cui si creerà solo un tar degli eseguibili.

Da root
portare nella $home il tar CFS-TAR.tar (che conserva anche i privilegi).

effettuare i seguenti comandi:


tar xvf CFS-TAR.tar
cd cfs-tar
./install-cfs.sh

Lo script provvede a distribuire i file sul nodo del root. Lo script deve essere lanciato
Per ogni nodo del cluster da root.

Note
1) è il file secrets che cresce di dimensioni.
2) Lo script si attende un filesystem gfs denominato da root /null e con protezioni
chmod 0 /null.

Lo script provvede a:

aggiungere in /etc/exports:
/null localhost

aggiungere in /etc/dfs/dfstab
share -F nfs -o rw=localhost -d "cfs directory" /null

eseguire il comando:
shareall

effettuare in / (su ogni nodo del cluster) le seguenti operazioni:


mkdir /null
chmod 0 /null
mkdir /crypt
copiare gli eseguibili nelle directory opportune
chiedere la passprhase che crea in /ftp_input/secrets (un gfs se si è su cluster)
creare in rc3.d il file S99cfs-rclocal
eseguire il file S99cfs-rclocal in modalità nohup.

3) Prima di un UPGRADE del prodotto CFS (cambio versione CFS) si richiede che
da root, su ogni nodo del cluster, si effettuano i seguenti comandi:

umount /crypt
ps -efa | grep cfsd

Dal pid del processo individuato effettuare il comando:


kill -9 <pid>

starare il nuovo tar con gli eseguibili ed effettuare i seguenti comandi:


tar xvf CFS-TAR.tar
cd cfs-tar
./upgrade-cfs.sh

l'upgrade non fa altro che ricopiare in modo forzato gli eseguibili.

Eseguire il RESTART di CFS. E' sufficiente effettuare il comando:

nohup /etc/rc3.d/S99cfs-rclocal

Prerequisiti
L’installazione presume:
- l’esistenza di un gfs (global-file-system) con mount point /ftp_input.
- La possibilità di usare NFS in localhost

Avvertenza: Se il filesystem gfs non è denominato come /ftp_input occorre


modificare almeno due shell di seguito mostrate in APPENDICE: installa-cfs.sh e
myattach.sh.

Installazione Cluster nodo 1


Per l’installazione Cluster nodo 1 quindi ad esempio facciamo:
Effettuare i seguenti passi:
1. collegarsi come root sul nodo in questione
2. effettuare il comando:
 mkdir –p /applicativi/CFS-INSTALL
3. posizionarsi nella sottodirectory col comando:
 cd /applicativi/CFS-INSTALL
4. scaricare da PVCS il tar CFS-TAR.tar nella directory precedentemente
creata
5. scompattare il tar col comando:
 tar xvf CFS-TAR.tar
6. effettuare i seguenti comandi:
 cd cfs-tar
 ./install-cfs.sh

Avvertenza: la procedura di installazione (install-cfs.sh) chiede una


passphrase, di almeno 16 caratteri. Tale passphrase viene creata in
/ftp_input/secrets.

Installazione Cluster nodo 2


Se l’installazione di CFS è avvenuta sul nodo 1 è sufficiente rieseguire in
sequenza soltanto i punti 3 e 6.

Nelle installazioni successive alla prima non viene richiesta la passphrase, in


quanto essa è creata su un gfs che è visibile da tutti i nodi del cluster.

Verifica dell’installazione CFS


L’installatore può effettuare le verifiche di seguito descritte.
Da root, su ogni nodo del cluster (DB cluster), effettuare i seguenti due
comandi:
 ps -efa | grep cfsd
Da root o da utente unix diverso da root effettuare il comando:
 /usr/local/bin/myattach.sh <alias_utente> <passphrase>
 cd /crypt
 ls
In seguito al comando ls, l’installatore troverà una directory temporanea
corrispondente ad <alias_utente>.

E’ necessario scollegarsi a fine utilizzo col comando:


 /usr/local/bin/mydetach.sh <alias_utente>

Utilizzo CFS
Da utente applicativo unix per operare con il filesystem criptato occorre fare
l’attach con i due comandi:
 sh /usr/local/bin/myattach.sh <alias_utente> <passphrase>
 cd /crypt
 ls

In seguito al comando ls, l’operatore troverà una directory temporanea


corrispondente ad <alias_utente>.

Una volta eseguito il comando di attach il filesystem è utilizzabile come un


filesystem normale con relative operazioni.

Avvertenze: In generale l’alias è univoco; ovvero uno stesso alias, da due


sessioni diverse o stessa sessione o da due utenti diversi, non è possibile
usarlo; tuttavia lo script myattach.sh controlla se l’alias è già usato non lo
crea e permette di accedere. Per convenzione un operatore dovrebbe usare un
alias: matricola-utente. Lo script myattach.sh ha un delay di 30 minuti, oltre
ai quali sgancia l’operatore dal filesystem criptato. Se, invece, l’operatore ha
bisogno di non essere limitato nel tempo deve usare una sintassi diversa ovvero:
 /usr/local/bin/cattach /ftp_input/secrets <alias_utente>

Questa istruzione richiede obbligatoriamente il detach a fine operazioni.

A fine utilizzo del filesystem criptato è necessario scollegarsi da esso col


comando:
 /usr/local/bin/cdetach <alias_utente> oppure con il commando:
 sh /usr/local/bin/mydetach.sh <alias_utente>
Stop CFS
Da root, su ogni nodo del cluster (DB cluster), effettuare i seguenti due
comandi:
 umount /crypt (necessaria a non mandare in crisi nfs)
 ps -efa | grep cfsd
Dal pid del processo individuato col comando precedente:
 kill -9 <pid>

Start CFS
Da root, su ogni nodo del cluster (DB cluster), effettuare il seguente comando:
nohup /etc/rc3.d/S99cfs-rclocal

Nelle situazioni di upgrade del prodotto verrà fornito un ulteriore kit di


installazione ovviamente diverso dal presente.

Cambio password
Da root, su un qualsiasi nodo del cluster, effettuare il seguente comando:
/usr/local/bin/cpasswd /ftp_input/secrets
Old passphrase:
New passphrase:
Again:

Avvertenza: richiede una password di almeno 16 caratteri

Utilizzo file system criptato da applicativo

Utilizzo filesystem criptato da applicativo

Attach
E’ possibile fare un attach nel seguente modo:

sh /usr/local/bin/myattach.sh <alias o pid> <passphrase>

Avvertenze: Lo script è solo eseguibile e prevede un detach dopo 30 minuti. Tale


valore, se necessario, è modificabile da root. L’alias è univoco; ovvero uno
stesso alias, non è possibile usarlo né come stessa sessione, né due sessioni
diverse. Per convenzione si suggerisce di usare come alias: <pid>. Lo script
myattach.sh controlla se l’alias è già usato non lo crea e permette di accedere.

Una volta eseguiti i due comandi di attach il filesystem è utilizzabile come un


filesystem normale con relative operazioni.

Detach
E’ possibile fare il detach nel seguente modo:

sh /usr/local/bin/mydetach.sh <alias o pid>

APPENDICE

Shell startPaTH.sh

Serve a settare il PATH prima di lanciare il Make e contiene:


#!/bin/sh
PATH=/usr/ucb:$PATH;export PATH
echo $PATH

Shell install-cfs.sh
Installa il prodotto in un mount-point /ftp_input/secrets

#!/bin/sh

# Configurazione CFS

clear

echo " "


echo "Checkpoint A: controlli pre-installazione x Solaris 2.9 ..."
echo " "

user=`who am i|awk '{print $1}'`


export user

if [ $user -ne "root" ]


then
echo "Verifica NOK: user = $user"
echo "Abort: l'installazione va fatta da utente root"
exit 1
else
echo "Verifica OK: user = $user"
echo "Prosegue l'installazione ... "
fi

if [ -d /usr/local/etc ]
then
echo " "
echo "OK: /usr/local/etc esistente"
echo " "
else
mkdir /usr/local/etc
fi

echo " "


echo "Installazione del software ..."
echo " "

cp -f cattach /usr/local/bin/.
cp -f cdetach /usr/local/bin/.
cp -f cfssh /usr/local/bin/.
cp -f cmkkey /usr/local/bin/.
cp -f cpasswd /usr/local/bin/.
cp -f ccat /usr/local/bin/.
cp -f cmkdir /usr/local/bin/.
cp -f cname /usr/local/bin/.
cp -f myattach.sh /usr/local/bin/.
cp -f secureattach.sh /usr/local/bin/.
cp -f mydetach.sh /usr/local/bin/.
cp -f cfsd /usr/local/etc/.

chmod g-x,o-x /usr/local/bin/cmkdir


chmod g-x,o-x /usr/local/bin/cpasswd
chmod g-w+x,o-w+x /usr/local/bin/myattach.sh
chmod g-w+x,o-w+x /usr/local/bin/secureattach.sh
chmod g-w+x,o-w+x /usr/local/bin/mydetach.sh

echo " "


echo "Inizio configurazione /etc/dfs/dfstab"
echo " "

if [ -f /etc/dfs/dfstab ]
then
echo "##" >> /etc/dfs/dfstab
echo "## Non toccare: sono per CFS (Cryptographic Filesystem)" >>
/etc/dfs/dfstab
echo "##" >> /etc/dfs/dfstab
echo "share -F nfs -o rw=localhost -d \"cfs filesystem\" /null" >> /etc/dfs/dfstab
else
echo "##" > /etc/dfs/dfstab
echo "## Non toccare: sono per CFS (Cryptographic Filesystem)" >>
/etc/dfs/dfstab
echo "##" >> /etc/dfs/dfstab
echo "share -F nfs -o rw=localhost -d \"cfs filesystem\" /null" >> /etc/dfs/dfstab
fi

echo " "


echo "Creazione del filesystem virtuale /crypt"
echo " "

mkdir /crypt

echo " "


echo "Creazione del filesystem da montare /null"
echo " "

mkdir /null
chmod 0 /null

echo " "


echo "Esecuzione del shareall"
shareall
echo " "

echo " "


echo "Configurazione di S99cfs-rclocal"
cp S99cfs-rclocal /etc/rc3.d/.
echo " "

echo " "


echo "Lancio di S99cfs-rclocal"
chgrp sys /etc/rc3.d/S99cfs-rclocal
chmod u+x /etc/rc3.d/S99cfs-rclocal
nohup /etc/rc3.d/S99cfs-rclocal

echo " "


echo "Installazione terminata correttamente sul nodo $hostname"
echo " "

if [ -d /ftp_input/secrets ]
then
echo " "
echo "Passprhase è in /ftp_input/secrets"
echo " "
else
echo "-Prima Area- "
echo "Creazione Passprhase in /ftp_input/secrets (almeno 16 caratteri)"
/usr/local/bin/cmkdir /ftp_input/secrets
echo " "
echo "Conservare la prima password "
echo " "
fi

chmod -R 775 /ftp_input/secrets

if [ -d /ftp_input/mysecure ]
then
echo "-Seconda Area- "
echo "Passprhase è in /ftp_input/mysecure"
echo " "
else
echo " "
echo "Inserisci la password iniziale di seguito indicata: xyz20m06busbu0rcs0"
/usr/local/bin/cmkdir /ftp_input/mysecure
echo " "
fi

chmod -R 775 /ftp_input/mysecure

echo "Attività ancora da svolgere:"


echo "1. Ripetere il tutto anche sull'altro nodo del cluster"
echo " "

Shell makeDBcryptfs.sh

Serve a creare 3 directory (di esempio nell’articolo) e di appoggio sul file system
crittato a cui accedere successivamente da operatore, quando egli sposterà
manualmente i file oppure anche da applicativo.

#!/bin/sh
if [ $# = 0 ]
then
echo "Errore: Inserire anche la passphrase operatore!!"
exit 0
fi

sh /usr/local/bin/myattach.sh creafsdb $1

var=0
while [ $var -lt 1 ]
do
echo ".........."

if [ -d /crypt/creafsdb ]
then
var=2
echo "Attach eseguito"
sleep 5
fi
done
echo "posizionamento su /crypt"
cd /crypt/creafsdb
mkdir -p migrazione
mkdir -p dbspecchio
mkdir -p recovery
echo "Creazione directory eseguita"
sh /usr/local/bin/mydetach.sh creafsdb

shell S99cfs-rclocal

#!/sbin/sh
#
# Configurazione per CFS
#
if [ -x /usr/local/etc/cfsd ]; then
/usr/local/etc/cfsd && \
/etc/mount -o port=3049,vers=2,proto=udp,intr localhost:/null /crypt
Fi

Shell myattach.sh

#!/bin/sh
#
# $1 alias di attach a CFS
# $2 password di attach a CFS
#
#

#
# Controlla se l'alias è già attaccato
# Se e' gia' attaccato l'alias viene restituito 1 con exit
#
#
if [ $# = 0 ]
then
echo "Usage: myattach.sh <alias> <passphrase>"
exit 1
fi

if [ $# != 2 ]
then
echo "Usage: myattach.sh <alias> <passphrase>"
exit 1
fi

if [ -d /crypt/$1 ]
then
exit 0
fi

#
# L'attach ha un timeout di 30 minuti
#

/usr/local/bin/cattach -i 30 -- /ftp_input/secrets $1 << EOF


$2
EOF
exit $?

Shell mydetach.sh
#!/bin/sh
#
# $1 alias di attach a CFS
#
if [ $# = 0 ]
then
echo "Usage: mydetach.sh <alias>"
exit 0
fi
/usr/local/bin/cdetach $1 << EOF
exit $?
Shell secureattach.sh
#!/bin/sh
#
# $1 alias di attach a CFS
# $2 password di attach a CFS
#
#

#
# Controlla se l'alias è già attaccato
# Se e' gia' attaccato l'alias viene restituito 1 con exit
#
#
if [ $# = 0 ]
then
echo "Usage: secureattach.sh <alias> <passphrase>"
exit 1
fi

if [ $# != 2 ]
then
echo "Usage: secureattach.sh <alias> <passphrase>"
exit 1
fi

if [ -d /crypt/$1 ]
then
exit 0
fi

#
# L'attach ha un timeout di 30 minuti
#

/usr/local/bin/cattach -i 30 -- /ftp_input/mysecure $1 << EOF


$2
EOF
exit $?