Titkosítás userspaceben

A Unix/Linux szerverek üzemeltetése wikiből

Ez az oldal WORK IN PROGRESS. Légyszíves ne módosíts rajta.

Írta: Sallai Tamás, 2009.12.09.

Titkosítás segítségével bizalmas adatokat tudunk megbízhatatlan közegen keresztül átküldeni és tárolni anélkül, hogy közben bárki hozzáférhetne. Digitális aláírással pedig biztosíthatjuk azt, hogy a kódolt adatokat senki sem változtatta meg.

Ebben a cikkben bemutatom a titkosítás lehetséges felhasználási területeit, valamint hozzájuk egy-egy konkrét programot.

Tartalomjegyzék

1 Nyilvános kulcsú titkosítás GPG-vel

1.1 Áttekintés

A nyilvános kulcsú titkosítás egy kulcspárra épül, a privát és a publikus kulcsra. Előállításkor ezek párban keletkeznek, és a publikusból nehéz előállítani a privátot. Egy üzenet lekódolásához a publikus kulcsot kell használni, visszaállítása azonban csak a priváttal lehetséges. Ezáltal biztonságos kommunikáció valósítható meg megbízhatatlan közegen keresztül az alábbi módon:

A szeretne küldeni egy bizalmas üzenetet B-nek. Ehhez elkéri B publikus kulcsát, ezzel kódolva pedig elküldi az üzenetet. Ezzel a bizalmas adatot csak B tudja kiolvasni.

Általában erőforrástakarékosabb a gyakorlatban, ha a nyilvános kulcsú titkosítást csak addig használják a felek, ameddig megegyeznek egy közös kulcsban a kommunikáció további részére.

1.2 Kulcskezelés

A GPG egy olyan program, amely kulcsokat tud tárolni, az állapotaikat kezelni, valamint velük műveleteket végezni, például titkosítást vagy visszafejtést. Bizonyos programok támogathatják a használatát, ezáltal lehet például email-eket a gpg-vel tárolt kulcsokkal aláírni.

A GPG az ismert kulcsokat nevekhez tárolja, ezzel nagyban megkönnyíti a használatát. Ezeket a ~/.gnupg könyvtárban találhatjuk meg. Ezen kulcsokat kezelhetjük grafikusan is pl. Seahorse-szal, vagy a gpg segítségével terminálból. Ezen cikkben az utóbbi módszert mutatom be. Egy kulcspár létrehozásához a

gpg --gen-key

parancsot használhatjuk, amely megkérdezi a kulcs adatait, majd meg kell adnunk egy jelszót is. Ezután generálja a kulcspárt, amelyet elhelyez a fenti könyvtárba.

Az ismert kulcsokat a

gpg --list-keys

paranccsal kérdezhetjük le.

A nyilvános kulcsunkat általában meg szeretnénk osztani másokkal, ezért lehetőség van fájlba exportálni, a

gpg --export <keyneve> -o <file>

paranccsal. A -o kapcsoló nélkül fájl helyett a standard out-ra fog írni. Ezzel az utasítással csak a publikus kulcsot lehet lemásolni, titkosat nem, de annak általában nincs is sok értelme. Ha mégis szeretnénk, akkor a

gpg --export-secret-keys

utasítással tehetjük meg. A publikus kulcsot bárkinek elküldhetjük, az nem képvisel biztonsági kockázatot. Amennyiben kapunk egyet, azt a

gpg --import <file>

paranccsal tudjuk betölteni.

1.3 Titkosítás

Most, hogy már rendelkezünk kulcsokkal a keyringben, tudunk titkosítani és kikódolni fájlokat. Ehhez a

gpg --encrypt <befájl> --output <kifájl>

és a

gpg --decrypt <befájl> --output <kifájl>

szolgál. A titkosított fájl bármilyen megbízhatatlan csatornán is küldhető, csak a titkos kulcs tulajdonosa fogja tudni visszafejteni. Ezért is fontos ennek a megfelelő védelme.

1.4 Azonosítás

Amennyiben a publikus kulcs küldőjében megbízunk, hogy azt tényleg ő küldte nekünk, akkor azt aláírhatjuk. Ezáltal később is tudni fogjuk, hogy megbízható, valamint ha másnak elküldjük, akkor ő is látni fogja, hogy mi megbízunk az illetőben. Aláírásra a

gpg --edit-key <kulcsneve>
sign

parancs szolgál. Lehetőségünk van meghatározni, hogy az illető aláírásaiban mennyire bízunk meg. Erre a

gpg --edit-key <kulcsneve>
trust

parancs való, amelynek során meg kell határozni a bizalom fokát. Ha nem bízunk benne, akkor az aláírásait nem vesszük figyelembe, ha csak egy kicsit, akkor egy kulcsban akkor bízunk, ha sok ilyen kicsit megbízható személy aláírta, valamint megbízhatunk teljesen, ekkor minden kulcsot elfogadunk, amit aláírt. Mivel ezek az aláírások a kulcs exportálásával továbbmennek, ezért ebből egy bizalmi háló épül fel.

1.5 Fájlok aláírása

A digitálisan aláírt fájlok ellenőrzéséhez elég a publikus kulcs, ezáltal ellenőrizhető, hogy senki nem módosította azt. Az aláírás előállításához a

gpg --sign <befájl> --output <kifájl>

utasítást, az ellenőrzéshez pedig a

gpg --verify <aláírás>

való.

2 Egykulcsos titkosítás Ccrypt-el

A nyílt kulcsú titkosítás megoldás nyújt az azonosításra és a megbízható és lehallgathatatlan kommunikációra, azonban sok esetben nincs szükség ilyen bonyolult megoldások használatára. Egyszerű fájlátküldéshez elegendő egy szimmetrikus jelszóval kódolt fájl és valamilyen más úton továbbított kódszó eljuttatása a címzetthez, aki utána már vissza tudja nyerni az eredeti adatot. Erre a feladatra alkalmazható a Ccrypt nevű program. Ezzel a titkosítást és a kikódolást az alábbi parancsokkal tehetjük meg:

ccencrypt <fájl>
ccdecrypt <fájl>

Ezek szimbolikus linkek a ccrypt-re, de így nem kell paraméterezni a művelet kiválasztásához. Használatakor figyeljünk arra, hogy helyben dolgozik, tehát a megadott fájl le fog törlődni.

Az algoritmusa 256 bites Rijndael, amely elég biztonságos mindenféle használatra. Egy véletlenszámot is beleír a fájl elejére titkosításkor, ezáltal egy fájl többszöri lekódolása különböző eredményeket produkál.

3 Fájlrendszer-titkosítás EncFs-el

A FUSE (Filesystem in Userspace) lehetőséget nyújt fájlrendszerek felcsatolására userspaceből. Ezzel a technológiával működik az EncFS is, amely egy titkosított könyvtárat képes felcsatolni egy másik mappába, amelyben a kikódolt tartalom lesz megtalálható.

A FUSE használatához fel kell lennie telepítve a fuse-utils -nak, majd be kell tölteni a szükséges kernelmodult a

sudo modprobe fuse

paranccsal. Ezután azt a felhasználót, akinek engedélyezni akarjuk a felcsatolást hozzá kell adjuk a fuse csoporthoz.

Az EncFS használatához 2 könyvtárra van szükségünk. Az egyik az alatta levő fájlrendszeren tárolja a titkosított adatokat, a másik pedig egy pont, ahova az előzőt felcsatoljuk, és a kikódolt tartalomhoz hozzáférünk. Amit itt módosítunk, az az elsőbe vissza fog kerülni. Ezáltal amikor le van csatolva a rendszer, akkor nem férhetünk hozzá a tartalmához, a felcsatoláshoz pedig szükségünk van egy jelszóra, amelyet a parancs kiadása után kell begépelnünk.

Miután létrehoztuk a könyvtárakat, az

encfs <titkosított> <kikódolt>

paranccsal tudjuk felcsatolni, és a

fusermount -u <kikódolt>

-al le. Ezután minden, a kikódolt könyvtárba tett fájlhoz megjelenik egy titkosított pár a fájlrendszerre író mappában. Lecsatolásnál addig nem fogja engedni a rendszer, ameddig van rajta megnyitott fájl, ezáltal nem minden esetben tudjuk hirtelen hozzáférhetetlenné tenni az adatokat.

Nem árt megjegyezni, hogy csak a fájlok tartalmát és nevét titkosítja, attól még a méretük nagyjából az eredetivel fog egyezni, és az időbélyegek is.

3.1 Egyéb beállítások

FUSE-val felcsatolt fájlrendszereket csak a felcsatoló felhasználó láthatja alapesetben, így a kikódolt mappához is csak ő férhet hozzá. Amennyiben azt szeretnénk, hogy rendes fájlrendszerként csatolódjon, használhatjuk a --public kapcsolót.

Beállítható az --idle=MINUTES kapcsolóval, hogy bizonyos idő után lecsatolja a nem használt fájlrendszert. Emellett beállítható az --ondemand is, amely egz timer lejárata utáni első használatkor újra bekéri a jelszót.

Alapvetően a titkosított könyvtárat csatoljuk fel, hogy hozzáférjünk az eredeti tartalomhoz. Azonban ha például titkosított mentést akarunk róla készíteni, akkor el tudunk készíteni egy könyvtárról egy kódolt nézetet a

encfs --reverse <könyvtár> <titkosított nézet>

paranccsal.

Felcsatoláskor alapértelmezésként promptról kéri be a jelszót, ezt a viselkedést az --extpass=PROGRAM, és a --stdinpass kapcsolókkal tudjuk felülírni, előbbi esetben a megadott programot fogja elindítani és annak stdout-ját használni, utóbbi esetben pedig az stdin-ről olvassa be.

3.2 Titkosítási jellemzők

Létrehozáskor ki kell választani a titkosítási jellemzőket, amelyek közül a legfontosabb az algoritmus és a kulcsméret. Ki kell választani még a fájlrendszer blokkméretét.

A fájlok és könyvtárak neveinek titkosítása történhet karakterenként vagy blokkonként. Előbbi esetben rövidebbek lesznek, viszont jó közelítéssel megmondható, hogy milyen hosszú volt eredetileg, utóbbi esetben azonban nem. Minden alapértelmezés blokkszintűt alkalmaz.

3.2.1 Inicializációs vektorok

Az inicializációs vektor olyan adat, amely determinisztikusan befolyásolja a titkosítás eredményét, ezáltal azonos vektor azonos adatokra azonos eredményeket ad, különböző pedig általában eltérőt.

Alapesetben azonos nevű fájloknak azonos lesz a titkosított formája is, és egy megfigyelő ezt észreveheti a könyvtárstruktúrában. Ezért a fájlnevek a tartalmazó könyvtár vektorával lesznek titkosítva.

Ugyanez fennáll a fájlok tartalmára is, miszerint különböző fájlokban azonos blokkok azonos titkosított adatot eredményeznek. Ennek elkerülésére minden fájl titkosításakor véletlenszerűen kiválasztott számmal lesz inicializálva az algoritmus.

Alkalmazható az a megoldás is, hogy a fájlnévből készüljön a fájlok inicializációs vektora, ekkor azonban ha megváltozik a titkosított könyvtárban a fájl neve, akkor nem lehet visszafejteni. Ennek használatával csak az tudja átnevezni a fájlokat, aki tudja írni is őket. Alapértelmezésként ki van kapcsolva.

3.2.2 Integritásellenőrzés

Bekapcsolható, hogy minden egyes blokkhoz eltárolódjon egy hibaellenőrző kód, amely segítségével ellenőrizhető az adat integritása. Ennek jelentős teljesítményigénye van, ugyanakkor enélkül nem lehetséges az adatok ellenőrzése.

4 Kapcsolódó irodalom

GPG

EncFS

GPG Manual

EncFS beállítás

Személyes eszközök