Содержание статьи
Каждый из нас хранит на жестком диске изрядное количество конфиденциальной информации. Для кого-то это всего лишь пароли от различных сетевых сервисов, другие ответственны за хранение важной документации, третьи уже не первый год занимаются разработкой инновационной программы. В любом случае, данные необходимо беречь от посторонних, что в нашем мобильном мире сделать довольно проблематично без использования систем шифрования.
Взглянув на список шифрующего ПО для Linux и проанализировав степень популярности и актуальности каждого из них, мы придем к выводу, что есть только четыре безопасные и поддерживаемые криптосистемы для шифрования жестких дисков и других носителей информации на лету:
- loop-aes (http://loop-aes.sourceforge.net) – модификация стандартного Linux-драйвера loop.ko, которая не только подключает устройства и образы в loopback-режиме, но и позволяет производить их шифрование на лету.
- LUKS/dm-crypt – система шифрования, основанная на стандартной подсистеме шифрования Linux-ядра под названием dm-crypt и следующая рекомендациям TKS1/TKS2.
- TrueCrypt – кроссплатформенная система шифрования жестких дисков и образов с графическим интерфейсом.
- EncFS – файловая система уровня пользователя, выполняющая шифрование данных на уровне файлов, а потому способная работать поверх любой ФС.
Каждая из этих систем имеет свои преимущества и недостатки, поэтому споры о том, что именно использовать, не прекращаются до сих пор. Драйвер loop-aes отличается простотой реализации, непревзойденной производительностью и стойкостью к взлому, однако метод его установки настолько нетривиален, что может отпугнуть даже продвинутых пользователей (мы не будем рассматривать loop-aes, ему была посвящена целая статья в одном из предыдущих номеров). LUKS/dm-crypt, с другой стороны, опирается на стандартную подсистему шифрования носителей, появившуюся еще в ядре версии 2.5 и поддерживающую десятки различных криптоалгоритмов. LUKS/dm-crypt доступен в любой Linux-системе, но, в отличие от loop-aes, до сих пор страдает от некоторых неисправленных проблем и менее производителен. TrueCrypt, пришедший в Linux из мира Windows-систем, медленнее LUKS/dm-crypt, но, в отличие от последнего, предоставляет по-настоящему кроссплатформенное решение (тома TrueCrypt могут быть прочитаны в Windows и Mac OS X), обладает встроенным графическим интерфейсом и позволяет создавать так называемые скрытые тома (невидимые зашифрованные тома внутри зашифрованных томов). EncFS – самое медленное, наиболее уязвимое, но настолько притягательно простое и удобное решение, что его нельзя обойти стороной.
Если говорить о стойкости шифрования и пригодности для повседневного применения, то здесь все в порядке, по крайней мере, у первых трех претендентов. Все три системы производят шифрование на лету и находятся ниже файловой системы, поэтому взломщик не имеет ни единого шанса узнать какие-либо подробности о хранящихся внутри тома данных. Каждая система защищена от так называемой Watermark-атаки, с помощью которой можно определить наличие в томе определенных типов файлов (dm-crypt до сих пор использует режим шифрования CBC (Сipher Block Chaining), уязвимый для этой атаки, но его легко можно изменить на устойчивый ESSIV, LRW или XTS). Все системы могут использовать различные алгоритмы шифрования, такие как, например, AES-256, Serpent или Twofish. Для получения доступа к данным все системы позволяют использовать зашифрованный ключ, хранящийся на USB-брелке или смарт-карте.
В стороне от loop-aes, LUKS/dm-crypt и TrueCrypt стоит простая и с виду незамысловатая программа EncFS. В отличие от своих тяжеловесных собратьев, она работает поверх уже существующей файловой системы и поэтому раскрывает злоумышленнику кучу самой разнообразной информации, включая всю структуру каталогов файловой системы, время создания и модификации файлов, их владельца и размер. EncFS шифрует каждый файл индивидуально, поэтому скрытыми от посторонних остаются только сами данные, хранящиеся внутри файлов, и их имена. Такая особенность делает EncFS неприменимой для хранения серьезных данных, но наделяет ее несколькими достоинствами: файловая система может динамически расти, инкрементальные системы бэкапа будут правильно обрабатывать файлы, зашифрованные EncFS, другие виртуальные файловые системы также могут быть зашифрованы (например, ты можешь подключить curlftpfs, создать каталог, подключить к нему encfs, и все заливаемые в него данные сохранятся на сервере в зашифрованном виде).
LUKS/dm-crypt
Система криптозащиты дисков LUKS/dm-crypt, как нетрудно догадаться, состоит из двух основных компонентов:
- dm-crypt – стандартная подсистема шифрования дисков Linux-ядра версии 2.6, которая опирается на подсистему Device Mapper (dm), способную отображать дисковые устройства друг на друга, и криптографическое API (Crypto API), так же предоставляемое ядром и предназначенное для выполнения различных криптографических функций.
- LUKS (Linux Unified Key Setup) – стандарт шифрования дисковых устройств для Linux, который описывает дисковый формат для зашифрованных данных.
Благодаря LUKS производители дистрибутивов и разработчики ПО, работающего с дисковыми устройствами, получают возможность встроить в свои продукты средства для однозначного определения шифрованных дисков и работы с ними. Например, подсистема HAL, которая сегодня используется большинством дистрибутивов в качестве прослойки для работы с оборудованием, уже давно умеет определять LUKS-диски, поэтому, если в комп будет вставлена флешка, зашифрованная с помощью LUKS/dm-crypt, пользователь увидит сообщение с просьбой ввести пароль, после чего флешка будет благополучно смонтирована. Именно в этой стандартизации заключается главное достоинство LUKS/dm-crypt перед всеми остальными решениями.
Для создания LUKS-совместимых шифрованных дисков предназначена утилита под названием cryptsetup-luks, которая в отдельных дистрибутивах (например, Ubuntu) ловко замаскирована под обычную cryptsetup. Поэтому для ее установки достаточно выполнить простую команду:
$ sudo apt-get install cryptsetup
Больше ничего инсталлировать не нужно, dm-crypt и все необходимые криптомодули уже есть в дистрибутиве. Но перед тем как начать шифрование, их придется загрузить:
$ sudo modprobe dm-crypt
$ sudo modprobe sha256
$ sudo modprobe aes
Чтобы модули загружались во время инициализации ОС, добавим их имена в файл /etc/modules:
$ sudo -i
# echo "dm-crypt\nsha256\naes" >> /etc/modules
Далее выбираем дисковый раздел, который хотим подвергнуть шифрованию, и забиваем его нулями (если в разделе есть данные, их необходимо сохранить в укромном месте):
$ sudo dd if=/dev/zero of=/dev/sda5 bs=4K
Для пущей надежности и запутывания взломщика раздел можно наполнить случайными данными, но эта процедура может занять длительное время (несколько часов, а для больших дисков и целые сутки):
$ sudo dd if=/dev/random of=/dev/sda5 bs=4K
Инициализируем LUKS-раздел с помощью cryptsetup:
$ sudo cryptsetup luksFormat /dev/sda5 -c aes-xts-plain -s 256
Опция '-c' задает режим шифрования, в нашем случае это AES-XTS (имеет гораздо более высокий уровень защиты по сравнению с режимами CBC, ECB; устойчив к Watermark-атакам). Опция '-s' задает длину ключа шифрования в битах. Утилита cryptsetup запросит пароль, используемый для расшифровки ключа шифрования, а если говорить простым языком, для доступа к данным раздела. Попробуй придумать что-нибудь действительно сложное.
После того, как раздел будет инициализирован, его можно отобразить на другое блочное устройство с помощью Device Mapper и таким образом получить доступ к данным (все записываемые на эти устройства данные будут передаваться dm-crypt и попадать на физический раздел уже в зашифрованном виде):
$ sudo cryptsetup luksOpen /dev/sda5 имя
Теперь на разделе можно создать файловую систему и смонтировать ее:
$ sudo mkfs.ext4 /dev/mapper/имя -L метка
$ sudo mkdir /mnt/имя
$ sudo mount /dev/mapper/имя /mnt/имя
Размонтирование и отключение устройства от Device Mapper происходит в обратном порядке:
$ umount /mnt/имя
$ cryptsetup luksClose sda5
Чтобы операционная система сама научилась подключать и монтировать нужные криптованные устройства во время загрузки, а затем корректно отключать их во время шатдауна, достаточно добавить по одной строке в файлы /etc/crypttab и /etc/fstab:
$ sudo -i
# echo "имя /dev/sda5 none luks,cipher=aes-cbc-essiv:sha256" >> /etc/crypttab
# echo "/dev/mapper/имя /mnt/имя ext4 defaults 0 0" >> /etc/fstab
Теперь во время каждой загрузки ОС будет спрашивать пароль для доступа к криптованному разделу, если он будет указан неправильно – загрузка остановится.
Шифрование домашнего каталога производится по точно такой же схеме с тем лишь исключением, что перед добавлением новой записи в /etc/fstab следует удалить старую запись, ссылающуюся на /home. При создании шифрованной флешки специальные записи в /etc/crypttab и /etc/fstab не требуются. Подсистема HAL сама определит наличие на устройстве хранения LUKS-раздела и передаст эту информацию среде рабочего стола (Gnome, KDE, XFCE), которая, в свою очередь, выведет на экран окно с просьбой ввести пароль. Единственное, что необходимо сделать – при первом монтировании флешки изменить права доступа на ее корневой каталог:
$ sudo chown -R юзер:юзер /media/имя
$ sudo chmod g+s /media/имя
Здесь юзер – это твое имя в системе, а имя – название метки, которую ты указал при создании файловой системы (опция '-L' утилиты mkfs).
Интересная особенность LUKS/dm-crypt заключается в возможности использования сразу нескольких ключей шифрования (а значит, и паролей) для одного дискового устройства. Это может понадобиться в многопользовательских системах для выделения каждому пользователю собственного пароля, расшифровывающего диск. Новые ключи добавляются в LUKS с помощью действия luksAddKey утилиты cryptsetup:
$ sudo cryptsetup luksAddKey /dev/sda5
Команда попросит тебя ввести текущий пароль, а затем дважды ввести новый. Удалить ключ можно, используя следующую команду:
$ sudo cryptsetup luksDelKey /dev/sda5 ID-ключа
Идентификатор нужного ключа ты найдешь в выводе следующей команды:
$ sudo cryptsetup luksDump /dev/sda5
Вместо пароля ты можешь использовать ключевой файл, сохраненный на USB-брелке или любом другом носителе информации. Для этого создай случайный ключ с помощью dd:
$ dd if=/dev/urandom of=/путь/к/файлу bs=512 count=4
А затем используй его при инициализации LUKS-раздела:
$ sudo cryptsetup luksFormat -c aes-xts-plain -s 256 /dev/sda5 /путь/до/ключа
Для «открытия» раздела используй следующую команду:
$ sudo cryptsetup -d /путь/до/ключа luksOpen /dev/sda5 имя
TrueCrypt
Открытая система шифрования дисков TrueCrypt появилась для систем Windows еще в 2004 году, и уже через год в нее была добавлена поддержка Linux (версия 4.0), которая стала полноценной в 2008 году, когда была выпущена TrueCrypt 5.0 с графическим интерфейсом как для Windows, так и для Linux.
TrueCrypt в первую очередь предназначена для шифрования образов ФС, но может быть использована и для шифрования целых разделов. Так же, как и LUKS, Linux-версия TrueCrypt опирается на подсистему dm-crypt, но, в отличие от первой, использует fuse для монтирования зашифрованных устройств/образов. Это оставляет свой отпечаток на производительности и делает TrueCrypt более медленной в сравнении с LUKS, однако, и у нее есть свои сильные стороны.
Во-первых, TrueCrypt по-настоящему кроссплатформенна, версии ПО есть для Windows, Mac OS X и Linux, их ядро абсолютно одинаково, поэтому никаких проблем при переносе образов между системами возникнуть не может (для чтения LUKS-разделов под Windows есть программа FreeOTFE, но за ее поддержку отвечают сторонние разработчики). Во-вторых, TrueCrypt умеет создавать скрытые шифрованные тома внутри уже существующих томов, причем делает это так, что формально нельзя доказать их наличие. В-третьих, TrueCrypt создает тома такими, что их невозможно отличить от случайных данных, что полезно при сокрытии информации (LUKS, как было описано выше, добавляет к любому тому заголовок, по которому его легко найти). В-четвертых, TrueCrypt позволяет менять пароли или файлы ключей для тома без потери данных (LUKS требует пересоздания тома).
В связи с лицензионными проблемами (при всей открытости исходного кода, лицензия TrueCrypt была признана несвободной ведущими производителями дистрибутивов) TrueCrypt был исключен из многих дистрибутивов, поэтому его придется скачивать и устанавливать самостоятельно:
$ cd /tmp
$ wget http://www.truecrypt.org/download/truecrypt-6.3a-linux-x86.tar.gz
$ tar -xzf truecrypt-6.3a-linux-x86.tar.gz
$ ./truecrypt-6.3a-setup-x86
В процессе установки необходимо прочитать и согласиться с лицензией и ввести свой пароль в системе (или пароль рута). После этого TrueCrypt будет установлен в каталог /usr, захламляя систему неуправляемыми пакетным менеджером файлами (которые, правда, могут быть удалены с помощью команды truecrypt-uninstall.sh).
После установки запускаем команду truecrypt и видим перед собой графический интерфейс. Основное пространство окна занимает список смонтированных шифрованных образов/разделов, в верхней части располагается стандартное меню, а снизу – основные элементы управления программой: создать том (Create Volume), смонтировать, размонтировать, открыть существующий том и т.д. После нажатия на кнопку «Create Volume» ты попадешь в мастер создания томов. Он проведет тебя через все шаги создания зашифрованного тома, включая выбор носителя (файл или раздел), типа тома (обычный или скрытый), ввод полного пути до файла тома или выбор устройства, выбор алгоритма шифрования и хеширования ключей, ввод размера тома, ввод пароля для доступа, выбор файловой системы (FAT, Ext2 или Ext3) и т.д. Все просто и понятно. После того как том будет создан, его можно найти с помощью кнопки «Select File» в нижней части окна программы, ввести пароль доступа, и том появится в списке подключенных томов. Клик на томе автоматически откроет стандартный файловый менеджер. После окончания работы можно нажать «Dismount All» и выйти из программы.
Не каждый пользователь будет рад графическому интерфейсу, поэтому у TrueCrypt есть еще один тип интерфейса: интерактивный текстовый режим, активируемый с помощью флага '-t'. Создание тома в этом режиме очень похоже на создание тома, с использованием графического мастера. Ты просто запускаешь команду «truecrypt -t -c» и отвечаешь на все те же стандартные вопросы. По окончании будет создан образ (или TrueCrypt'ный том внутри раздела), который можно подключить с помощью следующей команды:
$ truecrypt -t /путь/до/образа /точка/монтирования
для размонтирования используется флаг '-d':
$ truecrypt -d
Замечу, что TrueCrypt совсем не уступает LUKS по степени обеспечения безопасности зашифрованных данных. В последней версии программы используется все тот же режим шифрования XTS, который мы использовали при создании зашифрованных разделов с помощью LUKS. В качестве алгоритмов шифрования могут быть использованы алгоритмы AES, Twofish и Serpent, ни один из них еще не был скомпрометирован. Более того, TrueCrypt позволяет использовать так называемые каскады алгоритмов, когда зашифрованный одним алгоритмом блок данных повторно шифруется другим.
EncFS
Виртуальная файловая система EncFS распространяется в виде обычного дистрибутивного пакета и не требует для своей работы ничего, кроме поддержки фреймворка fuse в ядре, libfuse, OpenSSL и небольшой библиотеки для логирования. Для инсталляции EncFS достаточно установить пакет с одноименным названием:
$ sudo apt-get install encfs
Создать зашифрованную с помощью EncFS файловую систему очень просто, для этого подойдет любой каталог. В качестве примера создадим два пустых подкаталога в /tmp, директория crypted будет содержать данные после их шифрования с помощью EncFS, а decrypted использоваться просто как точка монтирования для нее же:
$ cd /tmp
$ mkdir crypted decrypted
Подключим к каталогам EncFS:
$ encfs /tmp/crypted /tmp/decrypted
Теперь необходимо ответить на несколько вопросов. Первый вопрос: выбор режима работы EncFS с пользователем. Их всего два: expert (буква «x») и paranoid (буква «p»). Выбрав первый вариант, ты сможешь задать алгоритм шифрования (AES или Blowfish), длину ключа, такие вещи как Initialization Vector (если ты не знаешь, что это такое, можешь жать <Enter> для выбора ответа по умолчанию) и т.д. В режиме paranoid программа сама ответит на свои вопросы и предложит ввести пароль для доступа к данным.
Стоит сказать, что, хотя для большинства пользователей режим paranoid будет более правильным выбором, режим expert открывает некоторые возможности для оптимизации. Например, алгоритм Blowfish быстрее AES, но он не используется по умолчанию просто потому, что нелегален для частного использования в некоторых странах. Также система по дефолту устанавливает блок данных ФС равным 1024 байт, хотя лучшую производительность EncFS показывает при установке размера блока равным размеру страницы оперативной памяти. То есть 4096 байт для x86.
Но вернемся к нашему зашифрованному каталогу. Перейдем в каталог decrypted и создадим несколько файлов:
$ cd decrypted
$ echo qwerty > file1
$ echo asdfgh > file2
$ echo zxcvbn > file3
Отключим EncFS и взглянем на результат:
$ cd ..
$ fusermount -u /tmp/decrypted
$ cd crypted
$ ls
Как видишь, EncFS полностью скрыла имена и данные файлов, но оставила почти все метаданные на виду. Кроме того, EncFS создала небольшой скрытый файл, начинающийся с «.encfs» и заканчивающийся номером версии. Файл содержит в себе метаданные, такие как опции шифрования (алгоритм, длина ключа), заголовки MAC (Message authentication code) и размер блоков шифрования.
Что лучше?
Ситуация с шифрующими системами в Linux весьма неоднозначна. С одной стороны, здесь есть стандартная реализация под названием LUKS/dm-crypt, обладающая всеми присущими криптосистеме функциями/свойствами и поддерживаемая из коробки самыми популярными дистрибутивами. С другой стороны, у LUKS/dm-crypt есть серьезные конкуренты, которые уделывают ее по нескольким характеристикам. Так что однозначный выбор сделать трудно. Я бы рекомендовал использовать LUKS/dm-crypt или loop-aes для повседневного использования и прибегать к помощи TrueCrypt, когда необходимо создать кроссплатформенный том, и EncFS, когда другие системы не могут быть использованы (например, шифрованный бэкап).
LUKS/dm-crypt и образы ФС
LUKS/dm-crypt вполне пригоден и для создания образов ФС, которые можно использовать для хранения важной информации:
# dd if=/dev/urandom of=luks.img bs=1M count=100
# losetup /dev/loop0 luks.img
# cryptsetup luksFormat /dev/loop0 -c aes-cbc-essiv:sha256 -s 256
# cryptsetup luksOpen /dev/loop0 luks
# mkfs.ext2 /dev/mapper/luks
# mkdir /mnt/luks
# mount /dev/mapper/luks /luks
LUKS/dm-crypt и одноразовые ключи
LUKS/dm-crypt также умеет использовать одноразовые ключи, что очень полезно при шифровании swap-разделов:
# swapoff -a
# cryptsetup -d /dev/urandom create cryptoswap /dev/sda1
# mkswap /dev/mapper/cryptoswap -L accessisdenied -v1
# echo "cryptoswap /dev/sda1 /dev/urandom swap" >> /etc/crypttab
# echo "/dev/mapper/cryptoswap none swap sw 0 0" >> /etc/fstab
# swapon -a
INFO
EncFS может работать в Linux, Mac OS X, FreeBSD и теоретически в любом UNIX, поддерживающем фреймворк fuse. Проект по портированию EncFS в Windows располагается по адресу www.assembla.com/spaces/wencfs.
WARNING
В целях безопасности индексацию зашифрованных разделов лучше отключить, отредактировав конфигурационный файл /etc/updatedb.conf. Файлы, зашифрованные EncFS, не могут иметь жестких ссылок, так как система шифрования привязывает данные не к inode, а к имени файла.