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
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
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
(/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