Дисково криптиране в linux debian. LUKS, EncFS и CryptoFS системи за криптиране на данни за Linux

Дисково криптиране в linux debian.  LUKS, EncFS и CryptoFS системи за криптиране на данни за Linux
Дисково криптиране в linux debian. LUKS, EncFS и CryptoFS системи за криптиране на данни за Linux

В тази статия ще ви кажа как да създадете скрит крипто контейнер. стандартни средства Linux OS (LUKS и cryptsetup). Вградените функции на LUKS (като използване на външни заглавки и поставяне на реални данни при дадено отместване) позволяват на потребителя достъп до данни, скрити в съществуващ контейнер, както и да отричат ​​съществуването на такива данни.

UPD:Тъй като тази публикация беше готова преди месец, тогава дори не можех да си представя толкова странна и неочаквана смърт на проекта. Е, да, може все още да не е умрял напълно, да видим ... Въпреки това в този текст реших да оставя всички препратки към TrueCrypt такива, каквито са.

Какво е "правдоподобно отричане"?

Можете да намерите много дълго и подробно описание на тази концепция в Уикипедия: http://en.wikipedia.org/wiki/Plausible_deniability. Накратко, това означава, че можете да имате нещо (или да сте могли да направите нещо), чието наличие не може да бъде подозирано или доказано от никого (освен ако сами не го признаете, разбира се). И след това можете да отречете съществуването (или факта на извършване) на това нещо, ако някой иска да ви обвини, тъй като (повтарям) този факт е недоказуем. Ами например, ако едно дете ритне братчето си по дупето и братчето тръгне да търси справедливост от родителите си, какво ще стане в този случай?

Ами... Сякаш нищо не се случва. Защото този пич ще откаже и родителите, формално погледнато, няма да могат да го хванат за ръка (защото, първо, глупаво няма свидетели, и второ, по-малкият брат може да си играе мръсната игра). Така никой няма да бъде наказан. Е, или ще накажат и двамата за всеки пожарникар. Това беше само пример за използване на възможността за правдоподобно отричане от дете, склонно към агресия. Но вие и аз, разбира се, сме бели и пухкави и ще използваме скрити контейнери единствено, за да защитим личните си данни от лоши момчета. Толкова правилно? Разбира се, „какво е „добро“ и кое е „лошо““ е отделен въпрос ... Но по-точно.

Обща идея за изпълнение

Да предположим, че искаме да съхраним някои важни данни в криптиран файл. Като цяло ще използваме някаква програма за криптозащита, която ще свърши цялата мръсна работа вместо нас. Може да искаме да третираме шифрования файл като виртуален диск и това значително стеснява броя на потенциалните кандидати. Има обаче едно „но“. Почти всички подобни програми работят с файл като с едно парче криптирани данни. Нека обясня: потребителят обикновено има единпарола (и може би няколко "резервни") за всичкоданни вътре в контейнера. Това означава, че има поне една слаба връзка: паролата на контейнера. Не искам да споменавам, че паролата трябва да е криптографски силна, защото това е обща истина. Имам предвид, че ако потребителят се откаже от тази парола по някаква причина (например по принуда), всички данни ще бъдат прочетени. И този факт ми се струва тъжен и напълно погрешен ...

Обаче като цяло надежда има. :) Например, има програма като , която е доста умна. Потребителят може да създаде два контейнера в един файл: единият е "фалшив" с определен брой "забранени", но относително безопасни файлове, а другият е истински, с данни, които не трябва да се разкриват при никакви обстоятелства. Така TrueCrypt изисква две различни пароли, когато потребител иска да създаде такъв „двоен“ контейнер. По време на работа потребителят въвежда само една парола за "истинската" част и работи с нея. В случай, че под натиск от външни обстоятелства потребителят е принуден да разкрие съдържанието на контейнера на трети страни, той просто въвежда различна парола и TrueCrypt отваря „фалшивата“. Подчертавам (и това е наистина важно), че няма начин да се докаже наличието на скритата част, ако изследователят не знае съответната парола.

И сега нека бързо да разберем как работи този боклук ... Всъщност всичко е много просто. Софтуерът разделя контейнерния файл на две (най-общо казано, неравни) части. Първата част, която може да е относително малка, съдържа специално подготвени данни; второто е истинско. Съответно програмата трябва да може да работи с два различни хедъра (конфигурации) за двама различни части, както и да можете да избирате коя част да дешифрирате в зависимост от паролата, въведена от потребителя. И това, трябва да кажа, не е най-тривиалната част от работата. Е, просто защото "официално" трябва да се вижда само една "фалшива" конфигурация: ако контейнерът има стандартен хедър, той трябва да е само "фалшив" хедър; ако параметрите на контейнера се съхраняват в отделна конфигурация, тази конфигурация трябва да позволява дешифриране само на "фалшивата" част. И след дешифрирането на "фалшивата" част не трябва да има нито един намек за наличието на истинската. Те трябва да са абсолютно независими. Освен това, когато се отвори „фалшивата“ част, софтуерът трябва да покаже пълния капацитет на крипто контейнера, дори ако обемът на тази част е много по-малък.

И така, какво да кажем за LUKS?

Е, тук имаме добри новини и... ъъъъ... още добри новини.

Добрата новина е, че cryptsetup може да дешифрира и монтира томове, създадени от TrueCrypt ". Само за четене обаче, но това е глупост. Тъй като има по-добри новини. А именно, можем да създаваме "скрити" контейнери изключително с помощта на . Освен това тази помощна програма ви позволява да създавате произволен брой "скрити" части. Естествено, в разумни граници. И ето как може да стане.

Но преди да продължите,

ОГРОМНО СТРАШНО ПРЕДУПРЕЖДЕНИЕ!!!

  • Всичко, описано по-долу, може да причини необратима загуба на данни.
  • Във вашата страна използването на силна криптография може да е забранено, така че може да бъдете затворени не за истинска информация, а просто за това, че имате крипто контейнер, който ще бъде намерен на вашия винт.
  • Криптографията може да защити вашите данни, но няма да ви защити от мъчения. Скритият контейнер може да ви помогне да запазите ценна информация, но не можете да отречете присъствието му в случай на предателство или донос.
  • Момчетата, които се интересуват от вашите криптирани данни, може да не са толкова тъпи, колкото очаквахте. Дори и да не могат да докажат наличието на скрита част от контейнера, те могат да ви заключат в една клетка с опитни престъпници и след няколко дни ще запомните всички пароли за всички скрити данни.
  • Ако имате близки хора (приятелка/гадже, роднини, приятели), те също могат да станат мишена за силен натиск. И това със сигурност ще ви помогне да запомните всичко като цяло много по-бързо, включително това, което дори не сте знаели.

Така че е по-добре да се замислите колко информация е по-ценна от вашия живот и живота на вашите близки. И направете резервно копие. За всеки случай.

Е, man cryptsetup може да ни каже много интересни подробности за параметрите на командния ред на тази помощна програма. Е, например, нека да разгледаме опцията --header:

Ми добре. Това означава, че вече можем да имаме обем от данни, пълен с произволни боклуци, без абсолютно никакви значими подписи. Описанието на тази опция съдържа малко повече информация, предупреждения и предупреждения, но в крайна сметка това е всичко, което се изисква. Въпреки това силно препоръчвам да прочетете това отлично ръководство.

Друга много полезна опция е --align-payload, която ви позволява да позиционирате реалните данни на определено отместване спрямо началото на тома:

И това също е страхотно, защото сега можем свободно да преместваме нашите данни към всяка част от обема. Схванахте идеята, нали?

  1. Инициализираме тома за криптиране: напълно го презаписваме с произволни данни.
  2. Правим „официален“ криптиран том и намаляваме малко заразена вареза, навита музла, пронполезен безплатен софтуер, записи от вашата любителска рок група, любовни филми и т.н., като цяло, за които ще получите не повече от две години пробация.
  3. Използвайки горните езотерични опции за настройка на криптиране, ние създаваме скрит том (вътре в „официалния“) и прехвърляме заглавието му на външен носител.Тук можете да съхранявате наистина опасна информация (като вашите снимки от детската градина или планове за завладяване на света).

Всъщност, хора, това е всичко. Без магия. Естествено, не можете да напълните "официалния" криптиран диск докрай поради простата причина, че част от мястото му е предоставено на скрит контейнер. И, както казах в началото, можете, ако искате, да създадете множество скрити устройства, следвайки същата логика.

Тук ... И ако все още имате нужда от подробности, тогава специално за вас -

Разходка

внимание!

Следните команди ще унищожат вашите данни, ако бъдат изпълнени без включване на мозъка. Загубената информация не може да бъде възстановена, защото помощните програми като dd работят на ниско ниво (т.е. под нивото на файловата система). Следователно няма да е възможно да върнете назад промените или да отмените ефекта им, дори ако прекъснете веднага след стартирането.

Накратко, не правете това, освен ако не можете да измислите смислено обяснение за това как всяка стъпка е свързана с вашите цели. И направете резервно копие. Сега.

Да кажем, че имаме устройство с множество дялове. Нека бъде например /dev/sdb. И нека /dev/sdb1 е сравнително малък (8GB) дял, предназначен за криптиране. Ще го разделим на 5 към 3, като частта от 5 GB ще бъде "официална", а частта от 3 GB ще бъде скрита. Нека приемем също, че ще запазим ключа за криптирания диск в /etc/keys, а хедъра на скрития контейнер съответно на външно USB устройство, което ще монтираме в /media/user/ExtUSBStick. Предполагам, че вече знаете какви разрешения трябва да зададете за хранилището за ключове, как да конфигурирате encfs / ecryptfs за сигурно съхраняване на поверителни данни на незащитени устройства и че има смисъл да копирате истински секретни ключове и да ги съхранявате в няколко географски разделени сейфа.

Е, добре, връзвам мрънкането и преминавам към същината на въпроса.

    Инициализация на устройството /dev/sdb1:

    Dd if=/dev/urandom of=/dev/sdb1 bs=16M

    Изработваме ключ за криптиран том. 512 бита (64 байта) за нашите цели през покрива:

    Dd if=/dev/urandom bs=64 count=1 >/etc/keys/secret.key 2>/dev/null

    Шифровайте тома с помощта на новосъздадения ключ:

    Cryptsetup luksFormat /dev/sdb1 /etc/keys/secret.key

    Отворете криптираното устройство и конфигурирайте картографирането в secretdata:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key \ /dev/sdb1 secretdata

    Създайте върху криптиран том файлова система(напр. btrfs):

    Mkfs.btrfs -L SecretData /dev/mapper/secretdata

    ... и го монтирайте:

    Монтирайте /dev/mapper/secretdata /var/secretdata/

    Като имате предвид ограничението от 5 гигабайта, задайте квотата за субобем:

    Btrfs квота активира /var/secretdata/

    Тъй като квотите на btrfs се прилагат само за подтомове, нека създадем едно такова нещо:

    brfs subtom създава /var/secretdata/workingvolume

    ... и приложете определената квота към него (имайте предвид, че btrfs подтомовете могат да бъдат монтирани като обикновени файлови системи, така че може да е по-удобно за вас да монтирате този конкретен подтом вместо целия fs по-късно):

    btrfs qgroup limit 5G /var/secretdata/workingvolume

    Попълваме го с някои данни:

    debootstrap --variant=buildd тестване /var/secretdata/workingvolume

    Това е всичко, сега можете да забравите за тази част:

    Демонтирайте /var/secretdata cryptsetup luksClose secretdata

    Сега нека създадем "риба" за заглавката и да напъхаме произволен боклук в нея:

    Dd if=/dev/urandom of=/media/user/ExtUSBStick/hidden.head bs=4M count=1

    И сега идва моментът, в който започва истинската магия. (Какво? Казах ли, че няма магия? Значи излъгах.) Използваме същия таен ключ, но не целия, а само половината (от отместване от 32 байта). Въпреки това, останалите 256 произволни бита са напълно способни да направят добър ключ. След това ще отделим хедъра и ще го поставим на флашката. И накрая, казваме на cryptsetup "y", че искаме да компенсираме нашия скрит контейнер с 5GB (т.е. 10485760 512-байтови блокове) от началото на тома:

    Cryptsetup --keyfile-offset 32 ​​​​-header /media/user/ExtUSBStick/hidden.head \ --align-payload 10485760 luksFormat /dev/sdb1 /etc/keys/secret.key

    Да, толкова е просто. Сега нека отворим ново криптирано устройство:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key --keyfile-offset 32 ​​​​\ --header /media/user/ExtUSBStick/hidden.head /dev/sdb1 realsecretdata

    Нека хвърлим каквито fs искаме:

    Mkfs.btrfs /dev/mapper/realsecretdata

полезни връзки

За тези, които искат да знаят малко повече, ето някои допълнителни източнициинформация:

  • криптиране на диска, обща информация за дисково криптиране: https://wiki.archlinux.org/index.php/Disk_encryption
  • Отказано шифроване, понятието е малко по-тясно от „правдоподобно отричане“, отнасящо се само до областта на криптографията: https://en.wikipedia.org/wiki/Deniable_encryption
  • TrueCrypt

В тази статия ще се опитам да сравня производителността на различни системи за криптиране под Linux. На теория, разбира се, се знае коя система е по-производителна и се опитва да изчисли производителността различни системибяха (). Truecrypt дори съдържа вграден бенчмарк (който обаче показва производителността на RAM, може да се използва само за оценка на скоростта на различни алгоритми за криптиране). Ще направя нещо различно - ще измеря скоростта на файлова система, криптирана с различни средства, като процент в сравнение с конвенционална некриптирана файлова система.


Ние ще шифроваме отделен дял на отделен HDD, който не съдържа основна файлова система с алгоритъма, използван по подразбиране във всеки конкретен случай. как редовен потребител, не разбирам нюансите на стандартите за криптиране (например как хеширането на RIPEMD-160 се различава от Whirpool, кой от тези режими е по-бърз, кой осигурява по-висока защита), така че просто разчитаме на факта, че производителите на всеки софтуерен продуктизбра достатъчно устойчиви на крипто параметри по подразбиране. Може би това не е съвсем правилно, защото производителността на различните алгоритми за криптиране не е еднаква. Ако желаете, разбира се, можете да промените вида на криптирането, но не съм сигурен, че във всички тествани продукти има абсолютно идентичен набор от алгоритми. Ще тестваме:

3) eCryptfs е системата по подразбиране, предлагана на потребителите на Ubuntu за криптиране на домашни директории, поради което е включена в този тест. Работи върху съществуваща файлова система. Криптира всеки файл поотделно, така че всеки може да види правата, датите на модификация, броя на криптираните файлове; по подразбиране имената на файловете също се виждат, въпреки че има опция за криптиране. Най-малко функционалният инструмент.

4) EncFS - приблизителен аналог на eCryptfs, но използва FUSE.

И така, за тестове беше избрана отделна машина на доста напреднала възраст в следната конфигурация: CPU - Intel Celeron 2000Mhz, RAM - 512 Mb DDR PC2700, системен HDD - WD Caviar SE 5400 RPM 80Gb, тестов HDD - WD Caviar SE 7200 RPM 80Gb.
OS - Ubuntu 12.04 LTS, версиите на целия софтуер са подходящи за хранилищата на тази операционна система към момента на писане (Truecrypt 7.1a-linux-x86 не е от хранилищата).

Ще тестваме файловата система по подразбиране ext4 за повечето дистрибуции. За тестване на производителността ще използваме помощната програма iozone3 и шел скрипт, написан „на коляно“, за да измерим процентната разлика в тестовете.

Скрипт за броене. Не беше обърнато специално внимание на чистотата на кода, единственият критерий за писане беше наличието на правилен резултат.

#!/bin/sh gendifffile () ( #процедурата генерира файл, който е удобен за анализиране. Първо, редовете, които не могат да бъдат анализирани, се съкращават; второ, първите две числа във всеки ред се съкращават, което показва #размера на файла и записа размер, съответно; трето, целият файл се извежда ред по ред - #един тестов резултат на ред cat $1 | докато чете LINE; do echo $LINE| grep "^[[:space:]]*[[:digit:] ]" | awk "(за (i=3;i<=NF;i++) {print $i}}" done > > $2 ) getline () ( #procedure извежда ред номер $2 на файл $1 head -n $2 "$1" | tail -n 1 ) compare () ( #procedure сравнява файл $1 и $2 ред по ред, изчислявайки процентната разлика на всеки двойка тестове #след това изчислява средно аритметично, с колко процента по-бързо или по-бавно #файл, съдържащ първата група тестове, файлът, съдържащ втората група P=0 MAX=0 L1=`cat "$1" | wc -l` #номер на тестове във файла L2=`cat "$2" | wc -l` if [ $L1 -ne $L2 ]; тогава #ако файловете съдържат различен брой тестове, тогава няма да ги сравняваме echo error return fi СТЪПКА =$(($L1*5/100)) J=0 за I в `seq 1 $L1`; направете J=$(($J+1)) ако [ $J -eq $STEP ]; тогава J= 0 echo "$((100*$I/$ L1))% завършено ($I от $L1)" fi A=`getline "$1" $I` B=`getline "$2" $I` if [ `echo $A \> $B|bc -l` - eq 1 ]; след това D=`echo "100-($B*100/$A)"|bc -l` if [ `echo $D \> $MAX| bc -l` -eq "1" ]; след това MAX=$D sleep 5 fi else D=`echo "100-($A*100/$B)"|bc -l` if [ `echo $D \> $MAX| bc -l` -eq "1" ]; след това MAX=$D sleep 5 fi D="-$D" #ако стойността има знак "-", този тест е изпълнен по-бързо #във втория файл отколкото в първия fi P=`echo "$P+ $D"| bc -l`готово P=`ехо $P/$L1| bc -l` #изчисляване на средната аритметична стойност echo PERCENT=$P MAX_PERCENT=$MAX ) genaverage () ( #процедурата за генериране на файл, подготвен за анализ, всеки ред от който е #средната аритметична стойност на съответните редове на целия отчет файлове, намиращи се в анализираната директория AVG=` mktemp` F=`ls "$1"|wc -l` #брой файлове с отчети в посочената директория #при условие, че там се съхраняват само такива файлове и нищо друго #няма да проверяваме коректността на това предположение, ако [ ! -d " $1" -o $F -lt 2 ]; тогава ехо грешка >/dev/stderr #в тази процедура ще изведем всички съобщения към stderr, тъй като #stdout е заменен с друг procedure rm -f $AVG exit fi TMP=` mktemp` find "$1" -type f| докато четете ФАЙЛА; направете #за всеки файл с отчет за iozone в дадената директория I=`mktemp` #gendifffile "$FILE" "$I " #names записва всички такива файлове в "TMP" ред по ред echo "$I">>$TMP done L=`cat \`getline "$TMP" 1\`|wc -l` cat "$TMP"| докато четете LINE; направете #малко проверка е добра L1=`cat "$LINE"| wc -l` #съдържат ли всички файлове еднакъв брой тестове, ако [ $L -ne $L1 ]; след това ехо грешка >/dev/stderr exit fi done STEP=$(($L*5/100)) J=0 за I в `seq 1 $L`; do J=$(($J+1)) if [ $J -eq $STEP ]; then J=0 echo "$((100*$I/$L))% done ($I of $L)" >/dev/stderr fi SUMFILE=`mktemp` #по този начин получавам стойността на променливата SUM от вложен цикъл SUM=0 cat "$TMP"| докато четете LINE; do SUM=$((`getline "$LINE" $I`+$SUM)) echo $SUM > "$SUMFILE" done echo `tail -n 1 "$SUMFILE"`/$F|bc -l >> $ AVG #вземете средното аритметично #и го запишете на подходящото място #на AVG файла rm -f "$SUMFILE" done cat "$TMP"| докато четете LINE; do #delete temporary files rm -f "$LINE" done rm -f "$TMP" echo $AVG ) printf %b "\\033)