Cryptfs partíció felcsatolása Debianon USBStick segítségével automatikusan

A HupWiki-ből...

Az alap ötletet a http://www.debian-administration.org/articles/428 adta.

Amit megvalósít:

Debian Etch.

Egy cryptfs-sel titkosított partíciót automatikusan, jelszó kérdezése nélkül, felcsatolni úgy, hogy a kulcs a pendrive-on van ((b)ami akár titkosítva is lehet a számítógépen tárolt kulcs segítségével. Illetve lehetséges a swap terület titkosítása is(/b)).

Tartalomjegyzék

Előfeltételek

A cryptsetup és sharutils csomagokra lesz szükség.

Ellenőrizzük a device mapper működését:

root@test:~# ls -L /dev/mapper/control
/dev/mapper/control

és a titkosító kernel modulok működését:

root@test:~# cat /proc/crypto
[...]
name          : sha256
driver        : sha256-generic
module        : sha256
[...]
name          : aes
driver        : aes-i586
module        : aes_i586
[...]

Amiről a konkrét példa szól

A titkosítandó partíció
/dev/hda5 (/home) (b) /dev/sda1 (pendrive titkosított partíció)(/b)
A könyvtar ahova az adatokat elmentjük a /home-ból
/srv/home
A pendrive partíció neve (label)
secret (b) ha titkosítjuk a pendrive-ot, akkor by-uuid-et fogunk használni. (/b)
A pendrive partíció fájlrendszere
ext2
A titkosításnál használt kulcs
root.key (és a secret kötet gyökerén található) (b)/etc/.penkey (a pendrive partíció titkosításánál használjuk fel) (/b)
Swap terület titkosítása (/dev/hda2)

Minden parancsot root-ként adjunk ki.

Figyelem adatvesztésért felelősséget nem vállalok! Mindenki járjon el kellő elővigyázatossággal!

A partíció előkészítése

Mentsünk le minden információt a partícióról:

cd /home
cp -arvx . /srv/home/

Csatoljuk le a /home partíciót:

umount /home

Majd minden információt tüntessünk el róla:

dd if=/dev/urandom of=/dev/hda5

Swap előkészítése

swapoff -a

Pendrive előkészítése

Figyelem ennél a műveletnél a pendrive-on tárolt adatok elvesznek!

Készítsünk egy ext2-es partíciót a pendrive-ra, ha a fat nem jó nekünk.

cfdisk /dev/sda

Formázzuk meg úgy az eszközt, hogy nevet (label) adunk a partíciónak.

(b) Készítsünk egy kulcsot a pendrive-hoz is:

head -c 2880 /dev/urandom | uuencode -m - | head -n 65 | tail -n 64 > /etc/.penkey

Ezután jöhet a partíció titkosítása:

cryptsetup -c aes-cbc-essiv:sha256 luksFormat /dev/sda1 /etc/.penkey

Nyissuk meg az eszközt:

cryptsetup --key-file /etc/.penkey luksOpen /dev/sda1 pendrive_secre

(/b)

fat
mkfs.vfat -n "secret" /dev/sda1
ext2
mkfs.ext2 -L "secret" /dev/sda1

Jelen esetben:

mkfs.ext2 -L "secret" /dev/sda1

Ez ahhoz kell, hogy később egyszerűen tudja azonosítani az udev az eszközt.

(b) ha a pendrive partíciót titkosítjuk akkor a label nem szükséges (/b)

Csatoljuk fel a pendrive-ot, hogy eleve oda generálhassuk a kulcsot: (Atya tanácsára)

mount /dev/disk/by-label/secret /mnt/usb/pendrive

(b)

mount /dev/mapper/pendrive_secret /mnt/usb/pendrive

(/b)

A partíció titkosítása

Generáljuk le a kulcsot:

head -c 2880 /dev/urandom | uuencode -m - | head -n 65 | tail -n 64 > /mnt/usb/pendrive/root.key

A fenti sor a /mnt/usb/pendrive könyvtár root.key fájljába véletlen karaktersorozatot generál, amit később kulcsként használunk.

Ezután jöhet a partíció titkosítása:

cryptsetup -c aes-cbc-essiv:sha256 luksFormat /dev/hda5 /mnt/usb/pendrive/root.key

Nyissuk meg a titkosított home kötetet:

cryptsetup --key-file /mnt/usb/pendrive/root.key luksOpen /dev/hda5 home

Ezzel létrejön egy /dev/mapper/home kötet.

Most már megformázhatjuk az eszközt a kedvenc fájlrendszerünkre:

mkfs.ext3 /dev/mapper/home

Ezután fel lehet csatolni és visszamásolni az adatokat.

mount /dev/mapper/home /home
cd /srv/home
cp -axrv . /home


Swap titkosítása

A swap területet is elkészíthetjük:

cryptsetup -c aes-cbc-essiv:sha256 luksFormat /dev/hda2 /mnt/usb/pendrive/root.key

Szerkesszük meg a /etc/fstab-ot az új swap eszköznek megfelelően:

/dev/mapper/swap       none            swap    sw              0       0

A titkosított swap használatához nyissuk meg a titkosított kötetet:

cryptsetup --key-file /mnt/usb/pendrive/root.key luksOpen /dev/hda2 swap
swapon -a

Pendrive leválasztása

Ha akarjuk lecsatolhatjuk a pendrive-ot:

umount /mnt/usb/pendrive

(b) Zárjuk le a pendrive titkosított partícióját:

cryptsetup luksClose pendrive_secret

(/b)

UDEV tanítása

Ehhez a /etc/udev/rules.d/z20_persistent.rules fájlt kell szerkeszteni:

# UUID and volume label
KERNEL=="*[!0-9]", ATTR{removable}=="1", GOTO="no_volume_id"
IMPORT{program}="vol_id --export $tempnode"
ENV{ID_FS_UUID}=="?*",          ENV{ID_FS_USAGE}=="filesystem|other|crypto", \
       SYMLINK+="disk/by-uuid/$env{ID_FS_UUID}"
ENV{ID_FS_LABEL_SAFE}=="?*",    ENV{ID_FS_USAGE}=="filesystem|other", \
       SYMLINK+="disk/by-label/$env{ID_FS_LABEL_SAFE}"

sor után, ez a fájl vége felé van, közvetlenül írjuk be:

ENV{ID_FS_LABEL_SAFE}=="secret", ENV{ACTION}=="add", RUN+="/usr/local/sbin/cpmount"

(b)ENV{ID_FS_UUID}=="36AC-8D27", ENV{ACTION}=="add", RUN+="/usr/local/sbin/cpmount2"(/b) Ennek a sornak a lényege:

ENV{ID_FS_LABEL_SAFE}=="secret"
a program akkor fog lefutni, ha a partíció neve megegyezik secret-tel
ENV{ACTION}=="add"
és csak akkor ha éppen most lett csatlakoztatva a pendrive
RUN+="/usr/local/sbin/cpmount"
ha az előző két feltétel teljesül, akkor lefuttatja a /usr/local/sbin/cpmount scriptet.

(b)

ENV{ID_FS_UUID}=="36AC-8D27"
a program akkor fog lefutni, ha a partíció uuid-je 36AC-8D27 (ezt a /dev/disk/by-uuid könyvtárban találjuk, meg kell nézni, hogy ha kihúzzuk a pendrive-ot, melyik uuid tűnik el:)
ENV{ACTION}=="add"
és csak akkor ha éppen most lett csatlakoztatva a pendrive
RUN+="/usr/local/sbin/cpmount2"
ha az előző két feltétel teljesül, akkor lefuttatja a /usr/local/sbin/cpmount2 scriptet.

(/b)

Ha a swap-et is titkosítottuk, akkor az UDEV megfelelő fájljába a

ENV{ID_FS_UUID}=="36AC-8D27", ENV{ACTION}=="add", RUN+="/usr/local/sbin/cpmount3"

sort kell beírni. A lényeg, hogy a cpmount3-at kell használni. Ehhez a (b) variációt kell megvalósítani (tehát a cpmount3 script feltételezi, hogy a pendrive-on a kulcs egy titkosított köteten van).

cpmount beszerzése

Letölthető: cpmount .asc

A script elején a

DEBUG=1                               # legyen-e loggolas
DISK="/dev/disk/by-label/secret"      # itt kell megadni, hogy mi a kulcsot
                                      # tartalmazo disk particio neve (label)
FS_TYPE="ext2"                        # a pendrive fajlrendszere
MOUNT="/mnt/usb/pendrive"             # ahova ideiglenesen fel lesz csatolva
KULCS="root.key"                      # a kulcs neve, relativ a MOUNT-tol nezve
DEV="/dev/hda5"                       # annak az eszkoznek a neve, ami
                                      # titkositva lett
DEV_NAME="home"                       # itt lehet megadni, hogy a cryptosetup
                                      # milyen neven hozza letre a pszeudo-
                                      # eszkozt
DEV_MOUNT="/home"                     # vegso soron hova legyen felmountolva
                                      # a titkositott particio
USB_WAIT=1                            # ennyi masodpercet var amig megprobalja
                                      # felcsatolni az usb eszkozt

változókat kell átnézni, hogy megfelelnek-e a saját rendszerünk paramétereinek. Minden javítást a scripthez szívesen fogadok!

Másoljuk a letöltött cpmount scriptet a /usr/local/sbin könyvtárba és ellenőrizzük, hogy rajta van-e a futtatási jogosultság.

(b)

cpmount2 beszerzése

Letölthető: cpmount2.asc

DEBUG=1                               # legyen-e loggolas
DISK="/dev/disk/by-uuid/36AC-8D27"    # itt kell megadni, hogy mi a kulcsot
                                      # tartalmazo disk particio neve (label)
FS_TYPE="ext2"                        # a pendrive fajlrendszere
MOUNT="/mnt/usb/pendrive"         # ahova ideiglenesen fel lesz csatolva
KULCS="root.key"                      # a kulcs neve, relativ a MOUNT-tol nezve
DEV="/dev/hda5"                       # annak az eszkoznek a neve, ami
                                      # titkositva lett
DEV_NAME="home"                       # itt lehet megadni, hogy a cryptosetup
                                      # milyen neven hozza letre a pszeudo-
                                      # eszkozt
DEV_MOUNT="/home"           # vegso soron hova legyen felmountolva
                                      # a titkositott particio
USB_WAIT=1                            # ennyi masodpercet var amig megprobalja
                                      # felcsatolni az usb eszkozt
PEN_KEY="/etc/.penkey"                # a pendrive-on levo particio dekodolasahoz
PEN_NAME="pendrive_kulcs"             # a pendrive particio $DIR_MAPPER neve
PRG_CRYPTSETUP="/sbin/cryptsetup"     # cryptsetup program
PRG_MOUNT="/bin/mount"                # mount program
PRG_UMOUNT="/bin/umount"              # umount program
DIR_MAPPER="/dev/mapper"

cpmount3 beszerzése

Letölthető: cpmount3.asc

Számítógép felébresztése hibernációból titkosított swap terület és pendrive segítségével Debian Etch-en

(/b)

A mechanizmus kipróbálása

Csatoljuk le a pendrive-ot, ha még nem tettük meg, és húzzuk ki.

umount /mnt/usb/pendrive

Csatoljuk le a /home -ot.

umount /home

Zárjuk be a titkosított eszközt:

cryptsetup luksClose /dev/mapper/home

Vegyünk egy mély levegőt és dugjuk vissza a pendrive-ot.

Ha a script-ben a DEBUG változót 1-re állítottuk, a syslog-ban megjelennek az üzenetek, amik megmutatják, hogy sikerült-e a /home felcsatolása vagy nem.

A syslog-ban valami hasonlót kell látnunk:

mount_home: Megvan a pendrive...
mount_home: Pendrive felcsatolasa: [/dev/disk/by-label/secret] -> [/mnt/usb/pendrive]
moria mount_home: Crypto device inicializalasa megtortent.
mount_home: [/home] felcsatolva
mount_home: [/mnt/usb/pendrive] lecsatolva

Ha itt hibát nem látunk, valószínűleg a /home kötetünk a helyére került, minden adatunkkal. :)

Ha akarjuk a pendrive-ot eltávolíthatjuk.

FIXME