Системы шифрования данных LUKS, EncFS и CryptoFS под Linux. Шифрование дисков в Linux Debian шифрование диска

В этой статье я расскажу вам, как создать скрытый криптоконтейнер стандартными средствами ОС Linux (LUKS и cryptsetup). Встроенные фишки LUKS"а (такие, как использование внешних заголовков и размещение реальных данных по заданному смещению) позволяют пользователю получить доступ к данным, скрытым внутри существующего контейнера, а также отрицать существование подобных данных.

UPD: Поскольку этот пост был готов ещё месяц назад, тогда я даже не мог представить настолько странную и неожиданную смерть проекта . Ну да, возможно, он ещё не совсем помер , посмотрим… Тем не менее, в этом тексте я решил оставить все ссылки на TrueCrypt как есть.

Что такое «правдоподобное отрицание»?

Вы можете найти весьма длинное и подробное описание этого понятия в Википедии: http://en.wikipedia.org/wiki/Plausible_deniability . Если коротко, это значит, что вы можете обладать чем-то (или могли сделать что-то), наличие чего не может быть никем заподозрено или доказано (если в этом не признаться самостоятельно, конечно). И впоследствии вы можете отрицать наличие (или факт совершения) этого чего-то, если кто-то захочет вас обвинить, поскольку (повторюсь) этот факт недоказуем. Ну например, если ребёнок пнул под зад своего маленького брата, и брат пошёл искать справедливости у родителей, что в этом случае произойдёт?

Ну… Как бы ничего не произойдёт. Потому что этот чувак будет отнекиваться, а родители, формально говоря, не смогут его поймать за руку (поскольку, во-первых, тупо нет свидетелей, а во-вторых, младший братец может вести свою грязную игру). Таким образом, никого не накажут. Ну или накажут обоих на всякий пожарный. Это как раз был пример использования возможности правдоподобного отрицания ребёнком, склонным к агрессии. Но мы-то с вами, безусловно, белые и пушистые, и будем использовать скрытые контейнеры исключительно в целях защиты своих персональных данных от плохих парней. Так ведь? Безусловно, «что такое „хорошо”, и что такое „плохо”» - это отдельный вопрос… Однако, ближе к делу.

Общая идея реализации

Предположим, мы хотим сохранить некие важные данные внутри зашифрованного файла. В общем случае мы будем использовать какую-то программу криптозащиты, которая будет делать за нас всю грязную работу. Возможно, мы захотим работать с зашифрованным файлом как с виртуальным диском, и это значительно сужает число потенциальных кандидатов. Однако, есть одно «но». Практически все подобные программы работают с файлом как с одним куском зашифрованных данных. Поясню: у пользователя обычно есть один пароль (и, быть может, несколько «запасных») для всех данных внутри контейнера. Это означает наличие как минимум одного слабого звена: пароля на контейнер. Я не хочу упоминать о том, что пароль должен быть криптографически надёжным, поскольку это прописная истина. Я имею в виду, что если пользователь по какой-то причине сдаст этот пароль (например, под давлением), все данные будут прочитаны. И этот факт мне кажется печальным и совершенно неправильным…

Хотя вообще-то надежда есть. :) Например, существует такая программа, как , которая является достаточно умной. Пользователь может создать в одном файле два контейнера: один «подставной» с некоторым количеством «запрещённых», но относительно безопасных файлов, а другой - настоящий, с данными, которые не должны засветиться ни в коем случае. Таким образом, TrueCrypt запрашивает два разных пароля, когда пользователь хочет создать подобный «двойной» контейнер. При работе пользователь вводит только один пароль для «настоящей» части и работает с ней. В том случае, если под давлением внешних обстоятельств пользователь вынужден раскрыть содержимое контейнера третьим лицам, он просто вводит другой пароль, и TrueCrypt открывает «фальшивку». Я подчёркиваю (и это действительно важно), что не существует возможности доказать наличие скрытой части, если исследователь не знает соответствующего пароля.

А теперь давайте быстренько разберёмся, как работает это барахло… На самом деле всё очень просто. Софт делит файл-контейнер на две (вообще говоря, неравные) части. Первая часть, которая может быть относительно небольшой, содержит специально подготовленные данные; вторая - настоящие. Соответственно, программа должна уметь работать с двумя различными заголовками (конфигурациями) для двух разных частей, а также уметь выбирать, какую часть расшифровывать в зависимости от введённого пользователем пароля. А это, надо сказать, не самая тривиальная часть работы. Ну просто потому, что «официально» должна быть видна только одна, «фальшивая», конфигурация: если у контейнера есть стандартный заголовок, это должен быть только «фальшивый» заголовок; если параметры контейнера хранятся в отдельном конфиге, этот конфиг должен позволять расшифровать только «фальшивую» часть. И после расшифровки «фальшивой» части не должно появиться ни одного намёка на наличие реальной. Они должны быть абсолютно независимыми. Более того, когда открыта «фальшивая» часть, софт должен показывать полную ёмкость крипто-контейнера, даже в том случае, когда объём этой части намного меньше.

Так что там про LUKS-то?

Ну тут у нас есть хорошие новости и… эм… ещё боле хорошие новости.

Хорошие новости заключаются в том, что cryptsetup умеет расшифровывать и монтировать тома, созданные TrueCrypt"ом. Только для чтения, впрочем, но это ерунда. Поскольку есть новости и получше. А именно, мы можем создавать «скрытые» контейнеры исключительно средствами cryptsetup "а. Более того, эта утилита позволяет создать любое количество «скрытых» частей. Естественно, в разумных пределах. И вот каким образом это можно сделать.

Но перед тем, как продолжить,

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

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

Так что лучше дважды подумайте, насколько информация ценнее вашей жизни и жизни ваших близких. И сделайте бэкап. Просто на всякий случай.

Так вот, man cryptsetup способен рассказать нам множество интересных подробностей о параметрах командной строки этой утилиты. Ну например, давайте глянем на опцию --header :

Ну и ладненько. Это значит, что теперь у нас может иметься в наличии том данных, забитый случайным мусором, причём совершенно без всяких осмысленных сигнатур. Описание этой опции содержит несколько больше информации, предостережений и предупреждений, однако в сухом остатке это всё, что требуется. И тем не менее, я настоятельно рекомендую прочитать это отличное руководство.

Ещё одна весьма полезная опция - это --align-payload , которая позволяет расположить настоящие данные по определённому смещению относительно начала тома:

И это тоже классно, потому что теперь мы свободно можем сдвигать наши данные в любую часть тома. Идею улавливаете, да?

  1. Инициализируем том для шифрования: полностью перезаписываем его случайными данными.
  2. Делаем «официальный» зашифрованный том и скидываем на него немножко заражённого вареза, спираченного музла, прона полезных свободных программ, записей вашей любительской рок-группы, фильмов про любовь и т.п., в общем, того, за что вам дадут не больше двух лет условно.
  3. Используя указанные выше эзотерические опции cryptsetup "а, создаём скрытый том (внутри «официального») и выносим его заголовок на внешний носитель. Здесь вы можете хранить по-настоящему опасную информацию (типа ваших детсадовских фоток или планов по завоеванию мира).

Собственно, народ, это всё. Никакой магии. Естественно, нельзя забивать «официальный» шифрованный диск под завязку по той простой причине, что часть его пространства отдана под скрытый контейнер. И, как я уже сказал в начале, вы можете, если хотите, создать несколько скрытых дисков, следуя той же логике.

Вот… А если вам всё же нужны подробности, то специально для вас -

Пошаговое руководство

Внимание!

Следующие ниже команды приведут к уничтожению ваших данных, если выполнить их, не включая мозги. Утерянную информацию невозможно будет восстановить, поскольку утилиты типа dd работают на низком уровне (то есть, ниже уровня файловой системы). Поэтому невозможно будет откатить изменения или отменить их действие, даже если вы прервёте выполнение сразу же после запуска.

Короче, не делайте этого, если не можете придумать осмысленного объяснения тому, как каждый шаг соотносится с вашими целями. И сделайте бэкап. Сейчас же.

Итак, предположим, у нас есть некое устройство с несколькими разделами. Пусть это будет, например, /dev/sdb. И пусть /dev/sdb1 будет относительно небольшим (8ГБ) разделом, предназначенным для шифрования. Мы разделим его 5 к 3, где 5-гиговая часть будет «официальной», а 3-гиговая - скрытой. Положим также, что ключ для зашифрованного диска мы будем держать в /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

    … и монтирум её:

    Mount /dev/mapper/secretdata /var/secretdata/

    Памятуя о 5-гиговом ограничении, устанавливае квоту для подтомов:

    Btrfs quota enable /var/secretdata/

    Поскольку квоты btrfs действуют только для подтомов, давайте создадим одну такую штуку:

    Brfs subvolume create /var/secretdata/workingvolume

    … и применим к нему указанную квоту (обратите внимание, что подтома btrfs могут быть смонтированы как обычные файловые системы, так что, возможно, впоследствии вам будет удобнеее монтировать именно этот подтом вместо всей фс):

    Btrfs qgroup limit 5G /var/secretdata/workingvolume

    Заполняем его какими-то данными:

    Debootstrap --variant=buildd testing /var/secretdata/workingvolume

    Ну и всё, теперь об этой части можно забыть:

    Umount /var/secretdata cryptsetup luksClose secretdata

    Сейчас создадим «рыбу» для заголовка и напихаем в неё случайного мусора:

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

    А вот теперь наступает тот самый момент, когда начинается настоящая магия. (Что? Я сказал, что никакой магии нет? Значит я наврал.) Мы используем тот же самый секретный ключ, однако, не целиком, а только половину (со смещения в 32 байта). Тем не менее, оставшиеся 256 случайных бит вполне способны стать хорошим ключом. Затем мы отделим заголовок и положим его на флэшку. И наконец, мы скажем cryptsetup "у, что хотим сместить наш скрытый контейнер на 5ГБ (т.е. на 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

    Накатим любую фс, какую захотим:

    Mkfs.btrfs /dev/mapper/realsecretdata

Полезные ссылки

Для тех, кто хочет знать несколько больше, вот некоторое количество дополнительных источников информации:

  • Disk encryption , общая информация по шифрованию дисков: https://wiki.archlinux.org/index.php/Disk_encryption
  • Отрицаемое шифрование , концепция несколько более узкая, нежели «правдоподобное отрицание», относящаяся только к области криптографии: https://ru.wikipedia.org/wiki/Отрицаемое_шифрование
  • TrueCrypt

Безопасность и конфиденциальность очень важны, для тех, кто хранит важные данные на компьютере. Ваш домашний компьютер находится в безопасности, но с ноутбуком или другими переносными устройствами ситуация очень сильно меняется. Если вы носите свой ноутбук с собой почти везде и к нему могут иметь доступ посторонние лица, возникает вопрос - как защитить свои данные от чужого вмешательства. Именно от физических атак, где каждый желающий может попытаться получить данные из USB накопителя или жесткого диска ноутбука просто забрав устройство или в случае ноутбука, вытянув жесткий диск и подключив его к другой операционной системе.

Многие предприятия и даже простые пользователи используют шифрование дисков в linux чтобы защитить конфиденциальную информацию, такую как: сведения о клиенте, файлы, контактную информацию и многое другое. В операционной системе Linux поддерживается несколько криптографических методов для защиты разделов, отдельных каталогов или полностью всего жесткого диска. Все данные, в любом из этих способов автоматически зашифровываются и расшифровываются на лету.

Шифрование на уровне файловой системы:

  • 1. eCryptfs - это криптографическая файловая система Linux. Она хранит криптографические метаданные для каждого файла в отдельном файле, таким образом, что файлы можно копировать между компьютерами. Файл будет успешно расшифрован, если у вас есть ключ. Это решение широко используется для реализации зашифрованной домашней директории, например, в Ubuntu. Также ChromeOS прозрачно встраивает эти алгоритмы при использовании сетевых устройств для хранения данных (NAS).
  • 2. EncFS - обеспечивает шифрованную файловую систему в пространстве пользователя. Она работает без каких-либо дополнительных привилегий и использует библиотеку fuse и модуль ядра для обеспечения интерфейса файловой системы. EncFS - это свободное программное обеспечение и она распространяется под лицензией GPL.

Блочное шифрование на уровне устройства:

  • Loop-AES - быстрая и прозрачная файловая система, а также пакет для шифрования раздела подкачки в Linux. Исходный код программы давно не изменялся. Она работает с ядрами 4.x, 3.x, 2.2, 2.0.
  • TrueCrypt - это бесплатное решение с открытым исходным кодом для шифрования диска в операционных системах Windows 7 / Vista /XP / Mac OS X, а также в Linux.
  • dm-crypt+LUKS - dm-crypt - это прозрачная подсистема для шифрования диска в ядре 2.6 и более поздних версиях. Поддерживается шифрование целых дисков, съемных носителей, разделов, томов RAID, программного обеспечения, логических томов и файлов.

В этой инструкции мы рассмотрим шифрование жесткого диска на Linux с помощью алгоритма Linux Unified Key Setup-on-disk-format (LUKS).

Как работает LUKS?

LUKS (Linux Unified Key Setup - протокол шифрования блочного устройства. Но мы забежали далеко наперед, чтобы понять как это работает, нужно скачала разобраться с другими технологиями, используемыми в этом способе.

Чтобы выполнить шифрование диска linux используется модуль ядра dm-crypt. Этот модуль позволяет создавать в каталоге /dev/mapper виртуальное блочное устройство с прозрачным для файловой системы и пользователя шифрованием. Фактически все данные лежат на зашифрованном физическом разделе. Если пользователь пытается записать данные на виртуальное устройство, они на лету шифруются и записываются на диск, при чтении с виртуального устройства, выполняется обратная операция - данные расшифровываются с физического диска и передаются в открытом виде через виртуальный диск пользователю. Обычно для шифрования используется метод AES, потому что под него оптимизированы большинство современных процессоров. Важно заметить, что вы можете шифровать не только разделы и диски, но и обычные файлы, создав в них файловую систему и подключив как loop устройство.

Алгоритм LUKS определяют какие действия и в каком порядке будут выполняться во время работы с шифрованными носителями. Для работы с LUKS и модулем dm-crypt используется утилита Cryptsetup. Ее мы и рассмотрим далее.

Утилита Cryptsetup

Утилита Cryptsetup позволят облегчить шифрование раздела Linux с помощью модуля dm-crypt. Давайте сначала ее установим.

В Debian или Ubuntu, для этого используйте такую команду:

apt-get install cryptsetup

В дистрибутивах, основанных на Red Hat это будет выглядеть так:

yum install cryptsetup-luks

Синтаксис запуска команды такой:

$ cryptsetup опции операция параметры_операции

Рассмотрим основные операции, которые можно сделать с помощью этой утилиты:

  • luksFormat - создать зашифрованный раздел luks linux
  • luksOpen - подключить виртуальное устройство (нужен ключ)
  • luksClose - закрыть виртуальное устройство luks linux
  • luksAddKey - добавить ключ шифрования
  • luksRemoveKey - удалить ключ шифрования
  • luksUUID - показать UUID раздела
  • luksDump - создать резервную копию заголовков LUKS

Параметры операции зависят от самой операции, обычно это либо физическое устройство, с которым нужно произвести действие, либо виртуальное или и то и другое. Еще не все понятно, но на практике, я думаю, вы со всем разберетесь.

Шифрование диска Linux

Теория пройдена, все инструменты готовы. Теперь рассмотрим шифрование раздела linux. Перейдем к настройке жесткого диска. Обратите внимание, что это удалит все данные из диска или раздела, который вы собираетесь зашифровать. Так что если там есть важные данные, лучше скопируйте их в более надежное место.

Создание раздела

В этом примере мы будем шифровать раздел /dev/sda6, но вместо него вы можете использовать целый жесткий диск или просто один файл, заполненный нулями. Создаем шифрованный раздел:

cryptsetup -y -v luksFormat /dev/sda6

WARNING!
========
This will overwrite data on /dev/sda6 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.

Эта команда выполнит инициализацию раздела, установит ключ инициализации и пароль. Указывайте такой пароль, чтобы его потом не забыть.

Выполните такую команду чтобы открыть только что созданный раздел с помощью модуля dm-crypt в /dev/mapper, для этого понадобится ввести пароль, с которым выполнялось шифрование luks linux:

Enter passphrase for /dev/sda6

Теперь вы можете увидеть новое виртуальное устройство /dev/mapper/backup2 созданное с помощью команды luksFormat:

ls -l /dev/mapper/backup2

Чтобы посмотреть состояние устройства выполните:

cryptsetup -v status backup2

/dev/mapper/backup2 is active.
type: LUKS1
cipher: aes-cbc-essiv:sha256
keysize: 256 bits
device: /dev/sda6
offset: 4096 sectors
size: 419426304 sectors
mode: read/write
Command successful.

А с помощью следующей команды вы можете сделать резервную копию заголовков LUKS на всякий случай:

cryptsetup luksDump /dev/sda6

Ну, можно сказать, раздел готов. И что самое интересное, теперь вы можете им пользоваться так же, как и любым другим обычным разделом в каталоге /dev. Его можно форматировать с помощью стандартных утилит, записывать на него данные, изменять или проверять файловую систему и т д. Нельзя только изменить размер. То есть все полностью прозрачно, как и сказано в начале статьи.

Форматирование раздела

Давайте для начала отформатируем диск. Для надежности, чтобы стереть все данные, которые были в этом месте раньше, перезапишем наш шифрованный раздел linux нулями. Это уменьшит вероятность взлома шифрования, через увеличение количества случайной информации. Для этого выполните:

dd if=/dev/zero of=/dev/mapper/backup2

Работа утилиты может занять несколько часов, чтобы иметь возможность наблюдать за процессом, используйте pv:

pv -tpreb /dev/zero | dd of=/dev/mapper/backup2 bs=128M

Когда процесс завершится мы можем отформатировать устройство в любую файловую систему. Например, отформатируем в ext4:

mkfs.ext4 /dev/mapper/backup2

Как видите, все команды cryptsetup применяются к физическому разделу, в то время как остальные команды для работы с дисками - к нашему виртуальному.

Монтирование раздела

Теперь можно примонтировать только, что созданную файловую систему:

$ mount /dev/mapper/backup2 /backup2

Отключение раздела

Все работает, но как отключить устройство и защитить данные. Для этого выполните:

cryptsetup luksClose backup2

Повторное монтирование

Чтобы снова получить возможность работать с зашифрованным разделом с помощью LUKS linux необходимо опять его открыть:

cryptsetup luksOpen /dev/sda6 backup2

Теперь можем монтировать:

mount /dev/mapper/backup2 /backup2

Проверить файловую систему luks

Поскольку после открытия раздела с помощью luks linux, этот раздел воспринимается системой, как и все другие, вы можете просто использовать утилиту fsck:

sudo umount /backup2

$ fsck -vy /dev/mapper/backup2

$ mount /dev/mapper/backup2 /backu2

Изменить парольную фразу luks

Шифрование дисков Linux выполняется с определенной парольной фразой, но вы можете ее изменить. Даже больше, вы можете создать до восьми разных парольных фраз. Для изменения выполнив следующие команды. Сначала сделаем резервную копию заголовков LUKS:

cryptsetup luksDump /dev/sda6

Затем создадим новый ключ:

cryptsetup luksAddKey /dev/sda6

Enter any passphrase:

Enter new passphrase for key slot:
Verify passphrase:

И удалим старый:

cryptsetup luksRemoveKey /dev/sda6

Сейчас вам придется ввести еще старый пароль.

Выводы

Вот и все теперь вы знаете как зашифровать раздел в Linux, а также понимаете как все это работает. Кроме того, шифрование дисков в Linux по алгоритму LUKS открывает широкие возможности для полного шифрования устанавливаемой системы.

Плюсы:

  • LUKS шифрует все блочное устройство, и поэтому очень хорошо подходит для защиты содержимого переносных устройств, таких как мобильные телефоны, съемные носители или жесткие диски ноутбуков.
  • Вы можете использовать на серверах NAS для защиты резервных копий
  • Процессоры Intel и AMD с AES-NI (Advanced Encryption Standard) имеют набор команд, которые могут ускорить процесс шифрования на основе dm-crypt в ядре Linux начиная с 2.6.32.
  • Работает в том числе и с разделом подкачки, так что ваш ноутбук может использовать функцию спящего режима, или гибернации полностью безопасно.

Сегодня хранить важные данные в открытом виде стало как никогда опасно. И даже не столько из-за государственной слежки (захотят - найдут, к чему придраться, и так), сколько из-за желающих эти данные похитить. В принципе, для защиты информации имеется множество методов, но в статье будет описаны именно криптографические средства.


В отличие от некоторых других операционных систем, в Linux имеется множество средств для криптографической защиты информации - от шифрования почтовых переписок до шифрования файлов и блочных устройств. Нас интересует именно шифрование на уровне файловых систем, файлов и блочных устройств. Для начала стоит разобраться, в чем разница. Шифрование на уровне файловых систем предполагает наличие прослойки между основной файловой системой (если, конечно, файловая система сама по себе не поддерживает шифрование) и пользователем.

Преимущество у данного типа шифрования - то, что ключи для всех пользователей разные. Недостаток же - если включить шифрование имен файлов, длина допустимого имени уменьшится, кроме того, пользователь может сохранить файл в иное место на диске, что автоматически нивелирует пользу. И еще одно но - даже если включено шифрование имен, временные метки останутся прежними. Шифрование блочных устройств происходит на более низком уровне, под файловой системой. При этом сама файловая система, разумеется, не знает, что она находится на шифрованном томе.

Преимущества у данного способа противоположны недостаткам предыдущего. Недостаток же в том, что придется каждый раз при загрузке/монтировании вводить пароль. Второй же недостаток в том, что если в рантайме злоумышленник получит доступ к файлам на криптокон-
тейнере, все - пиши пропало. Это именно что защита от офлайновых атак. Кроме того, в абсолютном большинстве случаев сохранения криптоконтейнера в облако придется заливать его целиком заново.

В статье будет описана настройка следующих методов криптозащиты:
dm-crypt/LUKS - создание криптоконтейнера с помощью device-mapper и CryptoAPI ядра;
eCryptfs - шифрование на уровне файловых систем;
EncFS - аналогично описанному выше, но не требует загрузки модулей ядра.

DM-CRYPT/LUKS
Существует два вида настройки dm-crypt - plain и LUKS. Отличие в том, что в случае использования LUKS в начале криптотома присутствуют метаданные, позволяющие использовать несколько ключей и изменять их. В то же время наличие подобного заголовка в некоторых случаях само по себе компрометирующе - впрочем, в большинстве подобных случаев будет компрометирующей и область с высокой степенью энтропии. Настройка plain dm-crypt с файлом ключа и парольной фразой Посмотрим, как настроить комбинацию из тома plain dm-crypt, зашифрованного с помощью ключевого файла, в свою очередь содержащегося в LUKS-контейнере. Для начала стоит определиться, как именно будут размещаться разделы. Существует три основных варианта:
просто крипто-том;
сперва крипто-том, затем поверх него LVM;
сперва крипто-том, затем RAID, затем LVM.

И всяческие комбинации. Давай попробуем второй вариант. Первым делом создадим контейнер LUKS для хранения ключевого файла, чтобы использовать этот файл вместе с ключевой фразой. В этом случае вероятность криптоанализа тома, зашифрованного с помощью plain dm-crypt, снижается:

# dd if=/dev/zero of=/root/key.luks bs=512 count=2057

# cryptsetup --align-payload=1 luksFormat /root/key.luks

# cryptsetup luksOpen /root/key.luks cryptokey

# dd if=/dev/urandom of=/dev/mapper/cryptokey

Первая команда подготавливает файл контейнера, вторая этот контейнер создает, третья подключает, четвертая генерирует ключевую информацию. Стоит заметить, что опция –align-payload=1 нужна для того, чтобы размер метаданных LUKS составлял не 4096 512-байтовых блоков, а всего лишь 2056. Таким образом, на собственно ключевую информацию остается 512 байт.
Затем переходим к созданию криптотома. На этом этапе по желанию можно также заполнить диск псевдослучайными данными, чтобы затруднить криптоанализ, если он будет. Затем уже можно создавать криптотом. Команда для этого выглядит следующим образом (естественно, в иных случаях идентификаторы могут отличаться, так что нужно быть внимательным):

# cryptsetup --cipher=serpent-xts-plain64 --offset=0--key-file=/dev/mapper/cryptokey --key-size=512 open --type=plain/dev/disk/by-id/ata-VBOX_HARDDISK_VB05eadebe-f25e8d59 crypto0


При необходимости надо повторить аналогичную команду и на других устройствах, для которых требуется шифрование. Затем создадим на криптотомах LVM и ФС на нем:

Создадим файл /etc/initramfs-tools/hooks/cryptokeys примерно следующего содержания (служебная часть скрипта опущена):

И файл /etc/initramfs-tools/scripts/local-top/cryptokeys (служебная часть опять
же опущена):

# <...>

modprobe - b dm_crypt

while ! (/ sbin / cryptsetup luksOpen / etc / crypto / key . luks cryptokey

/ dev / disk / by - id / ata - VBOX_HARDDISK_VB05eadebe - f25e8d59 crypto0

&& / sbin / cryptsetup plainOpen -- key - file = / dev / mapper / cryptokey

/ dev / disk / by - id / ata - VBOX_HARDDISK_VBc2414841 - cfeccde5 crypto1

&& / sbin / cryptsetup luksClose cryptokey

) ; do

echo “Try again . . . ”

done

Эти два файла должны быть исполняемыми. Затем создаем initrd:

# update-initramfs -u -k all -v

При следующей перезагрузке будет запрошен пароль для LUKS-контейнера. В случае использования plain dm-crypt есть еще одна возможность - общий нижний слой, что позволяет сделать нечто наподобие скрытых томов TrueCrypt. Проще привести пример:

# cryptsetup --cipher=serpent-xts-plain64 --offset=0--size=2097152 --shared open --type=plain/dev/disk/by-id/ata-VBOX_HARDDISK_VBcda8398f-f1f1deec crypto

# cryptsetup --cipher=serpent-xts-plain64 --offset=2097152--size=2097152 --shared open --type=plain/dev/disk/by-id/ata-VBOX_HARDDISK_VBcda8398f-f1f1deec crypto_shared

Размер и смещение указываются в 512-байтовых блоках.


Расширенные возможности LUKS
Давай посмотрим также и на расширенные возможности использования LUKS-контейнеров. К ним можно отнести смену ключей. Это необходимо при компрометации или создании политики смены ключей. Первым шагом для этого будет создание резервной копии заголовка контейнера. Если все
нормально, после смены ключа ее можно уничтожить. Делаем мы ее, понятно, на нешифрованный раздел:

Наконец, добавляем новый ключ в систему:

Рассмотрим и процедуру восстановления томов LUKS. Самый простой вариант, разумеется, когда есть копия заголовка. В этом случае для восстановления требуется всего одна команда:

Самая длинная непрерывная строчка и будет мастер-ключом. Ее нужно скопировать в файл на нешифрованный том и после этого преобразовать в бинарную форму (перед этим следует убедиться, что в данном файле нет никаких
символов конца строки):

ENCFS
Посмотрим, как настроить EncFS для автоматического монтирования при входе в систему. Для начала поставим нужные пакеты:

При настройке в режиме эксперта будет задан ряд вопросов: тип шифра (доступны только AES и Blowfish), размер ключа, размер блока, как шифровать имена файлов - блочное шифрование (которое полностью скрывает имя файла, в том числе длину), потоковое (которое шифрует с максимально близкой длиной, что иногда удобно, если имена чересчур длинные и при использовании блочного шифра есть достаточно большая вероятность превысить максимально допустимую длину) или вовсе будет отсутствовать… В конце будет запрошен пароль, он должен совпадать с используемым для входа, в противном случае автомонтирование работать не будет.

Следом нужно отредактировать файл /etc/security/pam_encfs.conf:

И файл /etc/fuse.conf:

И добавим пользователя в группу fuse:

$ sudo usermod - a - G fuse $ USER

После выхода-входа каталог private можно будет использовать как хранилище для личных данных. Стоит, однако, отметить, что аудит выявил некоторые (достаточно серьезные) проблемы с безопасностью, из-за чего данную систему крайне не рекомендуется использовать для хранения действительно важных данных.

ECRYPTFS
Известно, что eCryptFS применяется в Ubuntu как средство по умолчанию для защиты домашних каталогов. Посмотрим, как оно работает, - создадим шифрованный каталог вручную. Установим пакеты:

СозданиеeCryptFS

И смонтируем ФС (при первом монтировании создаются все необходимые метаданные):

$ sudo mount - t ecryptfs / home / rom / . secret / home / rom / secret

Будет запрошена парольная фраза (всего один раз, повторный ввод не реализован, что выглядит не очень хорошим решением, учитывая, что она должна быть длинной), затем будет запрошен тип шифра (AES, Blowfish, 3DES, Twofish, CAST6 и CAST5), размер ключа, задан вопрос, разрешить или запретить нешифрованные файлы в каталоге с зашифрованными, шифровать ли имена файлов… и в финале спросит, действительно ли желаем подмонтировать и сохранить ли сигнатуру в определенный файл. Вопрос не настолько глупый, как может показаться сначала: в данном ПО при отсутствии сигнатуры не существует возможности отличить правильный пароль от неправильного.

Шифрование домашнего каталога пользователя

Во время первого запуска может понадобиться завершить несколько процессов. После шифрования необходимо немедленно зайти под пользователем, при этом будет предложено записать или распечатать парольную фразу, сгенерированную для шифрования и защищенную, в свою очередь, пользовательским паролем. Это необходимо для восстановления в случае нештатной ситуации.


Предупреждение о необходимости запомнить парольную фразу

Посмотрим, как его восстанавливать. Предположим, что парольная фраза не записана и восстановление идет с Live CD. Подразумевается, что ФС подмонтирована. Переходим в каталог home/.ecryptfs/rom/.ecryptfs и набираем команду:

dm-verify
Модуль dm-verify предназначен для проверки целостности блочных устройств. Верификация ведется с помощью hash tree, где «листья» - хеш-суммы блоков, а «ветви» - хеш-суммы наборов «листьев». Таким образом, для верификации блочного устройства (будь то раздел или диск) достаточно проверить всего одну контрольную сумму.
Этот механизм (вкупе с цифровой подписью) применяется в некоторых Android-устройствах для защиты от модификации системных разделов, а также в Google Chromium OS.

ЗАКЛЮЧЕНИЕ
Linux содержит действительно немало средств для криптографической защиты информации. Из трех описанных средств как минимум одно присутствует во всех современных дистрибутивах Linux. Но что же выбрать?
dm-crypt/LUKS стоит применять в тех случаях, когда есть возможность быстро отключить зашифрованный том и когда резервные копии либо не нужны, либо засекречиваются иным путем. В этом случае данное решение более чем эффективно, особенно с учетом того, что шифровать можно каскадом произвольной вложенности и типа (например, AES-Twofish-AES), - настоящий рай
для параноиков.
eCryptFS подходит в тех случаях, когда нужно шифрованные данные куда-то сохранять - к примеру, в облако. Она обеспечивает довольно надежноешифрование (хотя в 128-битном варианте, используемом по умолчанию, есть возможность снижения криптостойкости на два бита) и для конечного пользователя прозрачна.
EncFS же - старичок примерно десятилетней давности, базирующийся на еще более древних работах. К настоящему времени не рекомендован к использованию из-за потенциальных дыр в безопасности, но может применяться в качестве кросс-платформенного средства для защиты несенситивных данных в облаках.

При необходимости использования подобных средств всегда нужно помнить, что защита должна быть комплексной.

Каждый из нас хранит на жестком диске изрядное количество конфиденциальной информации. Для кого-то это всего лишь пароли от различных сетевых сервисов, другие ответственны за хранение важной документации, третьи уже не первый год занимаются разработкой инновационной программы. В любом случае, данные необходимо беречь от посторонних, что в нашем мобильном мире сделать довольно проблематично без использования систем шифрования.

Взглянув на список шифрующего ПО для Linux и проанализировав степень популярности и актуальности каждого из них, мы придем к выводу, что есть только четыре безопасные и поддерживаемые криптосистемы для шифрования жестких дисков и других носителей информации на лету:

WARNING

В целях безопасности индексацию зашифрованных разделов лучше отключить, отредактировав конфигурационный файл /etc/updatedb.conf. Файлы, зашифрованные EncFS, не могут иметь жестких ссылок, так как система шифрования привязывает данные не к inode, а к имени файла.

Шифрование домашнего каталога обеспечивает надежную защиту данных, хранящихся на жёстком диске или ином носителе. Шифрование особенно актуально на переносных ПК, на компьютерах с множественным доступом, а также в любых других условиях. Шифрование домашнего каталога предлагается при установке Linux Mint.

Основная загвоздка при полном шифровании домашнего каталога состоит в том, что необходимо «вынести» каталог с зашифрованными данными за пределы точки монтирования.

Производительность снижается незначительно, по крайней мере пока не пользуется SWAP. SWAP – это специальный раздел на диске или файл в который операционная система перемещает отдельные блоки оперативной памяти в случае когда оперативной памяти не хватает для работы приложений. SWAP тоже шифруется, если в инсталляторе выбрать шифрование домашнего каталога, и при этом перестает работать спящий режим.

Не шифровать SWAP при шифрованном домашнем каталоге – потенциально опасно, так как там могут оказаться данные из шифрованных файлов в открытом виде – весь смысл шифрования теряется. Начиная с 14-ой версти Linux Mint, при установке есть возможность выбрать вариант шифрования всего диска. Этот вариант наиболее подходит для сохранения персональных данных на переносных устройствах (у которых, как правило, только один пользователь).

1.3 Шифрование в gnome – Seahorse

В Linux Mint есть встроенная утилита «Пароли и ключи» или же Seahorse. Используя её возможности пользователь может оперировать всеми ключами, паролями, а также сертификатами которые имеются в данной ОС.

По сути Seahorse – это приложение для GNOME (GNOME – свободная среда рабочего стола для Unix-подобных операционных систем), являющееся фронтэндом к GnuPG (свободная программа для шифрования информации и создания электронных цифровых подписей) и предназначенное для управления ключами шифрования и паролями. Пришел на замену GNOME Keyring, которого полностью заменил в GNOME 2.22, хотя был анонсирован еще в GNOME 2.18. Позволяет производить все операции которые ранее необходимо делать в командной строке и объединяя их под едиными интерфесом:

    управлять безопасностью своей рабочей среды и ключами OpenPGP и SSH;

    шифровать, расшировывать и проверять файлы и текст;

    добавлять и проверять цифровые подписи к документам;

    синхронизировать ключи с ключевыми серверами;

    создавать и публиковать ключи;

    резервировать ключевую информацию;

    добавлять к изображениями в любом поддерживаемом GDK как OpenGPG photo ID;

1.4 TrueCrypt

TrueCrypt обладает достаточно удобным графическим интерфейсом, но, к сожалению, разработчики жестко зашили в код интеграцию с файловым менеджером Nautilus.

Для шифрования данных можно использовать разные методы.

Для начала нужно создать так называемый контейнер, в котором будут содержаться файлопапки, предназначенные для шифрования. Контейнером может служить файл с произвольным названием или даже целый раздел диска. Для доступа к контейнеру необходимо указать пароль, а также можно сделать файл ключа (необязательная опция), с помощью которого будет шифроваться информация. Размер контейнера ограниченный.

Создание зашифрованных разделов/файлов

Создание файл ключа:

truecrypt -create-keyfile /home/user/test/file , где file – название файла-ключа.

Создание контейнера, в данном случае раздела:

sudo truecrypt -k /home/user/test/file -c /dev/sda9

Вместо раздела /dev/sda9 вполне можно указать и файл, например /home/user/test/cryptofile, но в этом случае необходимо будет указать его размер, это делается параметром -size=5G до параметра -c. В указанном примере создастся файл cryptofile размером 5 Гбайт. Иногда TrueCrypt принимает размер только в байтах, для 5 Гбайт можно или высчитать значение заранее и указать -size=5368709120, или же записать следующим образом: -size=`echo 1024^3*5 | bc`.

Для шифрования будет использоваться сделанный уже файл-ключ.

При создании будет предложен выбор типа контейнера (нормальный / скрытый), файловой системы (FAT, ext2/3/4 или без ФС), в данном примере был выбран режим без использования ФС. Также будет предложен выбор алгоритма шифрования (например, AES), а так же hash-алгоритм (например, SHA-1) для шифрования потоков данных.

TrueCrypt используется для шифрования данных налету, то есть можно, подмонтировав контейнер, работать с находящимися в нём файлами как обычно (открывать/редактировать/закрывать/создавать/удалять), что очень удобно.

Шифрованный раздел/файл был создан. Теперь, если необходимо его внутреннюю файловую систему (далее ФС) отформатировать под нужную, следует сделать следующее.

Выбрать необходимый раздел используя Truecrypt:

truecrypt -k /home/user/test/file /dev/sda9

По умолчанию будет задействован созданный Truecrypt девайс /dev/mapper/truecrypt0. По обращению к этому девайсу, можно менять, например ФС в шифрованном контейнере. В данном случае это нужно сделать.

sudo mkfs.ext4 -v /dev/mapper/truecrypt0

Этим самым была сделана ФС ext4 внутри данного шифрованного контейнера.

Далее, так как данный контейнер уже «прикреплён» к девайсу /dev/mapper/truecrypt0, то осталось его просто примонтировать к какой-нибудь директории. Эта директория для монтирования должна уже существовать в системе.

sudo mount /dev/mapper/truecrypt0 /mnt/crypto , где /mnt/crypto – директория, к которой примонтирован шифрованный контейнер.

truecrypt -d

Теперь без знания файла-ключа и пароля никто не сможет прочесть спрятанную информацию.