Fájlrendszer-titkosítás, LUKS
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: [[Fájl:1.jpg]]<math>C = E(P,K)</math> |
+ | * Kódoló függvény: |
− | * Dekódoló függvény: [[Fájl:2.jpg]]P = D(C,K) |
+ | : '''C = E(P,K)''' |
+ | * Dekódoló függvény: |
||
+ | : '''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>[[Fájl:1.jpg]] |
+ | :[[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})[[Fájl:2.jpg]] |
+ | :[[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[[Fájl:3.jpg]] |
+ | :[[Fájl:3.jpg]] |
, valamint tudjuk, hogy |
, valamint tudjuk, hogy |
||
− | : c_i = E_K(p_i \oplus c_{i-1})[[Fájl:4.jpg]] |
+ | :[[Fájl:4.jpg]] |
− | : c_j = E_K(p_i \oplus c_{j-1})[[Fájl:5.jpg]] |
+ | :[[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} [[Fájl:6.jpg]] |
+ | : [[Fájl:6.jpg]] |
. Ebből |
. Ebből |
||
− | : p_i \oplus p_j = c_{i-1} \oplus c_{j-1}[[Fájl:7.jpg]] |
+ | : [[Fájl:7.jpg]] |
adódik. Próbasejtést alkalmazva |
adódik. Próbasejtést alkalmazva |
||
− | : p_j = 0[[Fájl:8.jpg]] |
+ | : [[Fájl:8.jpg]] , |
− | , így megkapjuk p_i [[Fájl:14.JPG]]-t. |
+ | így megkapjuk |
+ | :[[Fájl:14.JPG]] -t. |
||
: Egy alternatívát jelent, ha |
: Egy alternatívát jelent, ha |
||
− | : c_i = c_j , és c_{i+1} = c_{j+1} [[Fájl:9.jpg]]. |
+ | : [[Fájl:9.jpg]]. |
Ekkor a fenti gondolatmenetet alkalmazva |
Ekkor a fenti gondolatmenetet alkalmazva |
||
− | : p_{i+1} = p_{j+1}[[Fájl:10.jpg]] adódik. |
+ | : [[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. |
||
=== Watermarking támadás === |
=== 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. |
: 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} [[Fájl:11.jpg]]i. és j. szektorban, |
+ | Ha [[Fájl:11.jpg]] i. és j. szektorban, |
− | : E(p_{i,1} \oplus c_{i,0}) = E(p_{j,1} \oplus c_{j,0})[[Fájl:12.jpg]] |
+ | : [[Fájl:12.jpg]] |
− | : p_{i,1} = p_{j,1} \oplus IV_i \oplus IV_j ,[[Fájl:13.jpg]] |
+ | : [[Fájl:13.jpg]], |
− | ebből IV-k ismertek, így p_{i,1}[[Fájl:15.jpg]] és p_{j,1}[[Fájl:16.jpg]] közötti összefüggés ismert. Ha pedig p_{j,1}[[Fájl:16.jpg]] -t a támadó állította elő, ezzel megtudja p_{i,1}[[Fájl:15.jpg]] -t is. |
+ | ebből IV-k ismertek, így [[Fájl:15.jpg]] és [[Fájl:16.jpg]] közötti összefüggés ismert. Ha pedig [[Fájl:16.jpg]] -t a támadó állította elő, ezzel megtudja [[Fájl:15.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:52-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:
- C = E(P,K)
- Dekódoló függvény:
- P = 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
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
2.2.3 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ó.
3 Elméleti támadások
3.1 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
, valamint tudjuk, hogy
, akkor a két egyenletet behelyettesítve és Ek-val egyszerűsítve
. Ebből
adódik. Próbasejtést alkalmazva
így megkapjuk
Ekkor a fenti gondolatmenetet alkalmazva
adódik.
3.2 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.
3.3 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.
ebből IV-k ismertek, így és közötti összefüggés ismert. Ha pedig -t a támadó állította elő, ezzel megtudja -t is.
- A watermarking támadás különösen más támadásokkal ötvözve hasznos.
3.4 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.
4 Titkosító szoftverek
4.1 PGPdisk
- windows-os titkosító, fizetős és ingyenes változata is létezik.
4.2 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. 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
4.3 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
4.4 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:
0 <sector count> crypt <sector format> <key> <IV offset> <real device> <sector offset>
- 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)
4.5 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 FreeOTFE programban)
- „entropy weak” felhasználói jelszavak védelme szótáralapú brute-force támadás ellen
- megvalósítja a TKS1 biztonságos kulcskezelési eljárás-ajánlást
- adatformátum:
|LUKS partíció fejrész |KM1 | KM2 |… | KM8 | nagy mennyiségű titkosított adat |
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: aes , [www.schneier.com/paper-twofish-paper.pdf twofish] , serpent, cast5, cast6
- támogatott üzemmódok: ebc, cbc-plain, cbc-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: sha-1, sha-256, sha-512, 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.
4.5.1 LUKS használata 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.
5 Hivatkozások
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