Fájlrendszer-titkosítás, LUKS

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
15. sor: 15. sor:
 
* Titkosítandó adat: P
 
* Titkosítandó adat: P
 
* Titkosított adat: C.
 
* Titkosított adat: C.
* Kódoló függvény: <math>C = E(P,K)</math>
+
* Kódoló függvény: [[Fájl:1.jpg]]<math>C = E(P,K)</math>
* Dekódoló függvény: P = D(C,K)
+
* Dekódoló függvény: [[Fájl:2.jpg]]P = D(C,K)
 
=== Blokktitkosító és üzemmódjai ===
 
=== Blokktitkosító és üzemmódjai ===
 
A titkosításhoz blokktitkosítót használhatunk, mivel a merevlemezen úgyis blokkokban tárolódik az adat. A blokktitkosító egy blokknyi adatot vár bemenetként, és ezt a kulcs segítségével kódolja. Ezek az üzemmódok fontosak az alább tárgyalt kérdések tárgyalásakor:
 
A titkosításhoz blokktitkosítót használhatunk, mivel a merevlemezen úgyis blokkokban tárolódik az adat. A blokktitkosító egy blokknyi adatot vár bemenetként, és ezt a kulcs segítségével kódolja. Ezek az üzemmódok fontosak az alább tárgyalt kérdések tárgyalásakor:
23. sor: 23. sor:
   
 
Képlet
 
Képlet
:<math> C_i = E_K(P_i) </math>
+
:<math> C_i = E_K(P_i) </math>[[Fájl:1.jpg]]
 
==== CBC (Cipher Block Chaining) ====
 
==== CBC (Cipher Block Chaining) ====
 
A kódolt kimenetet hozzáadja a következő blokkhoz annak kódolása előtt, ezzel egy láncot hozva létre. Az első blokkhoz egy IV (inicializáló vektor) értéket adunk hozzá.
 
A kódolt kimenetet hozzáadja a következő blokkhoz annak kódolása előtt, ezzel egy láncot hozva létre. Az első blokkhoz egy IV (inicializáló vektor) értéket adunk hozzá.
   
 
Képlet
 
Képlet
:<math>C_i = E_K(P_i \oplus C_{i-1})
+
:<math>C_i = E_K(P_i \oplus C_{i-1})[[Fájl:2.jpg]]
 
==== Counter ====
 
==== Counter ====
 
: IV helyett egy számlálót használunk bemenetként, ezt titkosítjuk a kulccsal, majd XOR-oljuk a titkosítandó adattal. Blokkonként léptetjük a számlálót.
 
: IV helyett egy számlálót használunk bemenetként, ezt titkosítjuk a kulccsal, majd XOR-oljuk a titkosítandó adattal. Blokkonként léptetjük a számlálót.
35. sor: 35. sor:
 
===Content leak attack ===
 
===Content leak attack ===
 
A nagy ciphertext-ből (több TB is lehet) következik, hogy valószínűleg vannak azonos értékek. Ha
 
A nagy ciphertext-ből (több TB is lehet) következik, hogy valószínűleg vannak azonos értékek. Ha
: c_i = c_j
+
: c_i = c_j[[Fájl:3.jpg]]
   
 
, valamint tudjuk, hogy
 
, valamint tudjuk, hogy
: c_i = E_K(p_i \oplus c_{i-1})
+
: c_i = E_K(p_i \oplus c_{i-1})[[Fájl:4.jpg]]
: c_j = E_K(p_i \oplus c_{j-1})
+
: c_j = E_K(p_i \oplus c_{j-1})[[Fájl:5.jpg]]
   
 
, akkor a két egyenletet behelyettesítve és Ek-val egyszerűsítve
 
, akkor a két egyenletet behelyettesítve és Ek-val egyszerűsítve
: p_i \oplus c_{i-1} = p_j \oplus c_{j-1}
+
: p_i \oplus c_{i-1} = p_j \oplus c_{j-1} [[Fájl:6.jpg]]
   
 
. Ebből
 
. Ebből
: p_i \oplus p_j = c_{i-1} \oplus c_{j-1}
+
: p_i \oplus p_j = c_{i-1} \oplus c_{j-1}[[Fájl:7.jpg]]
   
 
adódik. Próbasejtést alkalmazva
 
adódik. Próbasejtést alkalmazva
: p_j = 0
+
: p_j = 0[[Fájl:8.jpg]]
 
, így megkapjuk p_i-t.
 
, így megkapjuk p_i-t.
   
 
: Egy alternatívát jelent, ha
 
: Egy alternatívát jelent, ha
: c_i = c_j , és c_{i+1} = c_{j+1} .
+
: c_i = c_j , és c_{i+1} = c_{j+1} [[Fájl:9.jpg]].
   
 
Ekkor a fenti gondolatmenetet alkalmazva
 
Ekkor a fenti gondolatmenetet alkalmazva
: p_{i+1} = p_{j+1} adódik.
+
: p_{i+1} = p_{j+1}[[Fájl:10.jpg]] adódik.
 
=== Lavina támadás (adatmódosítási támadás) ===
 
=== Lavina támadás (adatmódosítási támadás) ===
 
Támadó célja, hogy megtalálja, hogy hova írt. Ezt úgy lehet megtenni, hogy másolatot készítünk a lemezről, majd kierőszakoljuk a változást az eredeti adatokon, aztán összehasonlítjuk a régi és az új adatot. Így megtaláljuk, honnan módosul a szektor.
 
Támadó célja, hogy megtalálja, hogy hova írt. Ezt úgy lehet megtenni, hogy másolatot készítünk a lemezről, majd kierőszakoljuk a változást az eredeti adatokon, aztán összehasonlítjuk a régi és az új adatot. Így megtaláljuk, honnan módosul a szektor.
61. sor: 61. sor:
 
: Feltételezés: CBC módot használó titkosítás, IV minden szektor 0. blokkjában, IV generáló algoritmus ismert a támadó előtt.
 
: Feltételezés: CBC módot használó titkosítás, IV minden szektor 0. blokkjában, IV generáló algoritmus ismert a támadó előtt.
 
Ha c_{i,1} = c_{j,1} i. és j. szektorban,
 
Ha c_{i,1} = c_{j,1} i. és j. szektorban,
: E(p_{i,1} \oplus c_{i,0}) = E(p_{j,1} \oplus c_{j,0})
+
: E(p_{i,1} \oplus c_{i,0}) = E(p_{j,1} \oplus c_{j,0})[[Fájl:11.jpg]]
: p_{i,1} = p_{j,1} \oplus IV_i \oplus IV_j ,
+
: p_{i,1} = p_{j,1} \oplus IV_i \oplus IV_j ,[[Fájl:12.jpg]]
   
ebből IV-k ismertek, így p_{i,1} és p_{j,1} közötti összefüggés ismert. Ha pedig p_{j,1} -t a támadó állította elő, ezzel megtudja p_{i,1} -t is.
+
ebből IV-k ismertek, így p_{i,1} és p_{j,1} [[Fájl:13.jpg]]közötti összefüggés ismert. Ha pedig p_{j,1}[[Fájl:13.jpg]] -t a támadó állította elő, ezzel megtudja p_{i,1}[[Fájl:13.jpg]] -t is.
   
 
: A watermarking támadás különösen más támadásokkal ötvözve hasznos.
 
: A watermarking támadás különösen más támadásokkal ötvözve hasznos.

A lap 2009. november 16., 00:39-kori változata

Tartalomjegyzék

1 Bevezető

Adataink biztonságos kezelése mindig is nagyon fontos szerepet töltött be, mióta az informatika fejlődésnek indult. Háttértáron tárolt adatok biztonságát működés közben különféle jogosultság-beállításokkal szavatoljuk, ez a módszer nem elégséges, ha az adatokhoz valaki fizikailag hozzáfér. Ekkor a merevlemez (vagy más adattároló eszköz) tartalmát védő szoftvereket könnyű kikapcsolni (például egy másik gépbe helyezéssel), így a tartalom hozzáférhetővé válik. A merevlemez-titkosítás ezek ellen véd.

Biztonsági célok:

  • A rejtett adat legyen titkos.
  • Integritásvédelem, módosítás észrevehető legyen.
  • Elérhető legyen
  • Támadó ne tudjon vízjelezni, rejtett csatornát használni.
  • Egyéb: legyen hatékony, ne foglaljon extra tárhelyet.

2 A megvalósítás módja

Szimmetrikus kulcsú titkosítást használunk, mert sokkal gyorsabb, mint az aszimmetrikus, ráadásul nincs szükség külön kódoláshoz használt és dekódoláshoz használt kulcsra, hanem elég egy kulcs.

2.1 Jelölések

  • Kulcs: K
  • Titkosítandó adat: P
  • Titkosított adat: C.
  • Kódoló függvény: 1.jpgÉrtelmezés sikertelen (PNG-vé alakítás sikertelen; ellenőrizd, hogy a latex és dvipng (vagy dvips + gs + convert) helyesen van-e telepítve): C = E(P,K)
  • Dekódoló függvény: 2.jpgP = D(C,K)

2.2 Blokktitkosító és üzemmódjai

A titkosításhoz blokktitkosítót használhatunk, mivel a merevlemezen úgyis blokkokban tárolódik az adat. A blokktitkosító egy blokknyi adatot vár bemenetként, és ezt a kulcs segítségével kódolja. Ezek az üzemmódok fontosak az alább tárgyalt kérdések tárgyalásakor:

2.2.1 ECB (Electronic Codebook)

A legegyszerűbb változat, mely egy blokknyi adatot vár bemenetként, és ezt a kulcs segítségével kódolja. Minden blokkhoz ugyanazt a kulcsot használja. Hátránya, hogy homogén adatok (például egy kép, melyen nagy egybefüggő területek vannak) a kódolás elenére felismerhetőek maradnak.

Képlet

Értelmezés sikertelen (PNG-vé alakítás sikertelen; ellenőrizd, hogy a latex és dvipng (vagy dvips + gs + convert) helyesen van-e telepítve): C_i = E_K(P_i)

1.jpg

2.2.2 CBC (Cipher Block Chaining)

A kódolt kimenetet hozzáadja a következő blokkhoz annak kódolása előtt, ezzel egy láncot hozva létre. Az első blokkhoz egy IV (inicializáló vektor) értéket adunk hozzá.

Képlet

Értelmezés sikertelen (lexikai hiba): C_i = E_K(P_i \oplus C_{i-1})[[Fájl:2.jpg]] ==== Counter ==== : IV helyett egy számlálót használunk bemenetként, ezt titkosítjuk a kulccsal, majd XOR-oljuk a titkosítandó adattal. Blokkonként léptetjük a számlálót. : A blokktitkosítókat a merevlemez-titkosítás speciális esetére használva használhatjuk mindhárom említett üzemmódot. A CBC üzemmódhoz szükséges IV értékét származtathatjuk például szektorazonosítóból, vagy tehetjük minden szektor első blokkjába az IV értéket. Ezen kívül használhatunk CTR üzemmódot, ahol a szektoron belüli blokkazonosító lehet a szükséges számláló. == Elméleti támadások == ===Content leak attack === A nagy ciphertext-ből (több TB is lehet) következik, hogy valószínűleg vannak azonos értékek. Ha  : c_i = c_j[[Fájl:3.jpg]] , valamint tudjuk, hogy  : c_i = E_K(p_i \oplus c_{i-1})[[Fájl:4.jpg]] : c_j = E_K(p_i \oplus c_{j-1})[[Fájl:5.jpg]] , akkor a két egyenletet behelyettesítve és Ek-val egyszerűsítve : p_i \oplus c_{i-1} = p_j \oplus c_{j-1} [[Fájl:6.jpg]] . Ebből  : p_i \oplus p_j = c_{i-1} \oplus c_{j-1}[[Fájl:7.jpg]] adódik. Próbasejtést alkalmazva : p_j = 0[[Fájl:8.jpg]] , így megkapjuk p_i-t.  : Egy alternatívát jelent, ha  : c_i = c_j , és c_{i+1} = c_{j+1} [[Fájl:9.jpg]]. Ekkor a fenti gondolatmenetet alkalmazva : p_{i+1} = p_{j+1}[[Fájl:10.jpg]] adódik. === Lavina támadás (adatmódosítási támadás) === Támadó célja, hogy megtalálja, hogy hova írt. Ezt úgy lehet megtenni, hogy másolatot készítünk a lemezről, majd kierőszakoljuk a változást az eredeti adatokon, aztán összehasonlítjuk a régi és az új adatot. Így megtaláljuk, honnan módosul a szektor. === Watermarking támadás === : Feltételezés: CBC módot használó titkosítás, IV minden szektor 0. blokkjában, IV generáló algoritmus ismert a támadó előtt. Ha c_{i,1} = c_{j,1} i. és j. szektorban,  : E(p_{i,1} \oplus c_{i,0}) = E(p_{j,1} \oplus c_{j,0})[[Fájl:11.jpg]] : p_{i,1} = p_{j,1} \oplus IV_i \oplus IV_j ,[[Fájl:12.jpg]] ebből IV-k ismertek, így p_{i,1} és p_{j,1} [[Fájl:13.jpg]]közötti összefüggés ismert. Ha pedig p_{j,1}[[Fájl:13.jpg]] -t a támadó állította elő, ezzel megtudja p_{i,1}[[Fájl:13.jpg]] -t is.  : A watermarking támadás különösen más támadásokkal ötvözve hasznos. === Cut and paste (vagy copy-paste) támadás === : Néhány blokk átrendezésével lehetséges olyan támadást intézni a titkosítás ellen, hogy a visszafejtés során a helyes adatokat kapjuk, a blokkok kicserélésének megfelelő sorrendben. Fontos adatot tartalmazó blokkokat helyettesít a támadó előkészített blokkjaival, így egyrészt felülírhatja a fontos adatokat általa megadottal, másrészt az eredeti adatokat átmásolva elérhető helyre (például /etc/shadow fájlt a home könyvtárába) elérhetővé teheti a védett adatokat. A támadás CBC vagy EBC üzemmódú titkosítás esetén működhet. == Titkosító szoftverek == === [http://www.pgpi.org/products/pgpdisk/ PGPdisk] === * windows-os titkosító, fizetős és ingyenes változata is létezik. === [http://loop-aes.sourceforge.net/loop-AES.README loop-AES] === * AES algoritmust használja, 128-192-256 bites kulcsokkal * 2.0.x kernel verziótól működik. * CBC módot használ, 512 byte-os chain egységekkel * három működési mód van: ** single-key: egy kulcsot használ titkosításra, egyszerűen szektor IV-vel. ** multi-key-v2: 64 különböző kulcsot használ, szektoronként különbözőt. [http://www.kleinschmidt.com/edi/md5.htm MD5] IV-t használ, mely az inicializáló vektort titkosítja. ** multi-key-v3: hasonlít a v2-höz, ráadásként egy 65. kulcsot használ az MD5 IV bemeneteként. * érdekesség: 20 (!) karakteres jelszót ajánlanak elég biztonságosnak === [http://tldp.org/HOWTO/Cryptoloop-HOWTO/ cryptoloop] === * a linux kernel része, nem szükséges patch-et használni * Crypto API-ban felkínált titkosításokat tudja használni * nincs karbantartója, régóta nem fejlesztik, ezért hamarosan kikerül a hivatalos kernelből (vagy már ki is vették) * watermarking támadás alkalmazható rajta, ezért nem ajánlott === [http://www.saout.de/misc/dm-crypt/ dm-crypt] === * a hivatalos kernel része * a 2.6.4-es kernel óta ez az alapértelmezett titkosítási mechanizmus * ugyanúgy, mint a cryptoloop, a Crypto API által elérhető algoritmusokat használja * device mapperrel használható, így [[RAID]], [[LVM]], partíciók vagy akár fájlok titkosítására is alkalmazható * dmsetup és cryptsetup (inkább felhasználóbarát) programokkal használható * a cryptsetup ezeket a műveleteket támogatja: create, remove, status, reload, resize * dm-crypt adattábla, ilyen formában tárol metaadatokat a titkosított adatokról: <pre> 0 <sector count> crypt <sector format> <key> <IV offset> <real device> <sector offset> </pre> * nagy hiányosság: felhasználói jelszó cseréje csak a TELJES tartalom dekódolásával és az új jelszóval való kódolással lehetséges (enyhíti a fájdalmat, hogy ez menet közben is lehetséges a szerző szerint) === [http://cryptsetup.googlecode.com/svn-history/r42/wiki/LUKS-standard/on-disk-format.pdf LUKS] (Linux Unified Key Setup) platformfüggetlen formátum === * létrejöttét az azonos algoritmusokon alapuló, de különféle titkosítóprogramok (vagy programok különböző verzióinak) inkompatibilitása motiválta * segítségével szabványos, platformfüggetlen leírást adhatunk meg a partíció fejrészében * az adatok mozgatása, más rendszerbe integrálása problémamentesen végbevihető * biztonságos keretek között kezel több felhasználóhoz tartozó jelszavakat/kulcsokat is * a LUKS csak egy formátumot ír le, a dm-crypt cryptsetup programjában megvalósított működése tekinthető referenciának (másik megvalósítás Windows alatt a [http://www.freeotfe.org/ FreeOTFE] programban) * „entropy weak” felhasználói jelszavak védelme szótáralapú brute-force támadás ellen * megvalósítja a [http://clemens.endorphin.org/TKS1-draft.pdf TKS1] biztonságos kulcskezelési eljárás-ajánlást * adatformátum: <pre> |LUKS partíció fejrész |KM1 | KM2 |… | KM8 | nagy mennyiségű titkosított adat | </pre> LUKS partíció fejrész információi: verziószám, használt titkosító algoritmus, blokktitkosító üzemmódja, kulcs hossza, hash függvény salt és iterációs paraméter, partíció id, master key ellenőrző összeg. ** támogatott algoritmusok: [http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf aes] , [www.schneier.com/paper-twofish-paper.pdf twofish] , [http://www.cl.cam.ac.uk/~rja14/Papers/serpent.pdf serpent], cast5, [http://www.ime.usp.br/~rt/cast256/CAST-256.pdf cast6] ** támogatott üzemmódok: ebc, cbc-plain, cbc-[http://article.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt/472 essiv] (Encrypted Sector Salt Initialization Vector, sha-256-ot használ az IV-k előállítására) ** támogatott hash függvények: [http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf sha-1], [http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf sha-256], [http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf sha-512], [http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html ripemd160] ** A KMx kulcsmezők a master key-t tartalmazzák különböző felhasználói jelszavak által titkosítva. Metaadat-mező formátuma egy kulcsmezőre: aktív/passzív, iterációs paraméter, salt. ==== LUKS használata [http://code.google.com/p/cryptsetup cryptsetup] programmal ==== * A cryptsetup LUKS kiegészítéssel ellátva a következő akciókat képes még végrehajtani: ** luksFormat <eszköz> <kulcs-fájl> – inicializál egy LUKS partíciót ** luksOpen <eszköz> <név> [ --key-file, –readonly ] – megnyit egy partíciót ** luksClose <név> - ugyanaz, mint az eredeti remove ** luksAddKey <eszköz> [<új kulcs fájl>] – új jelszót ad hozzá ** luksDelKey <szám> - töröl egy jelszót ** luksUUID <eszköz> - kiírja az id-t. ** isLuks <eszköz> - igaz, ha a megadott eszköz LUKS partíció ** luksDump <eszköz> - lementi a teljes fejrészt * Érdekes probléma a luksDelKey használata. Ha ugyanis kitöröljük az összes kulcsot, nem férhetünk hozzá többet az adatokhoz. Bár egy adatromboló támadás egyszerűbben végrehatható a dd paranccsal. == Hivatkozások == <references/> http://cryptsetup.googlecode.com/svn-history/r42/wiki/LUKS-standard/on-disk-format.pdf http://www.saout.de/tikiwiki/tiki-index.php?page=LUKS Előző szerint és die.net-en talált hivatalos, de most nem érhető el: http://luks.endorphin.org/ Clemens Fruhwirth. New methods in hard disk encryption. http://clemens.endorphin.org/nmihde/nmihde-A4-os.pdf, 2005
Személyes eszközök