tcplay, замена TrueCrypt для Linux. Работа с криптоконтейнерами. Часть II.

Часть II. Работа с простыми томами.
0. Создание простого тома tcplay/truecrypt
Команда для шифрования тома:

tcplay --create --device=/dev/loopX --cipher=шифр_или_каскад_шифров_через_запятую --pbkdf-prf=алгоритм --keyfile=path/to/key/file

где:
--create – указание программе создать новый шифрованный том
--device=/dev/loopX – устройство, которое требуется зашифровать, в данном случае loop-устройство с которым ассоциирован файл-контейнер.
--cipher=шифр_или_каскад_шифров_через_запятую – указание, какой алгоритм шифрования необходимо использовать, или же необходимо использовать несколько алгоритмов последовательно (они перечисляются через запятую). В настоящий момент tcplay поддерживает алгоритмы: AES-256-XTS, TWOFISH-256-XTS, SERPENT-256-XTS, таким образом, поддерживаются комбинации этих трех, двух, или одного из этих шифров, перечисленных через запятую.
В случае использования только одного из них – запятая после его указания не нужна.
Примечание: Если вы используете несколько шифров, особенно на слабой машине, то это может существенно замедлить работу компьютера. Из всех перечисленных шифров AES самый быстрый (на современных машинах он даже поддерживается на аппаратном уровне), но TWOFISH и SERPENT надежнее, хотя и медленнее.
--pbkdf-prf=алгоритм – алгоритм формирования ключа для шифрования на основе пароля. На самом деле, содержимое нашего ключевого файла тоже пароль, «ключ» в криптографии это несколько иное, но, поскольку объяснить вам всю криптографию в трех словах я не могу, отсылаю к специализированным источникам.
Кратко прочесть про PBKDF можно здесь
Вместо алгоритм надо подставить конкретный алгоритм. На данный момент tcplay поддерживает RIPEMD160, SHA512, whirpool
--keyfile=path/to/key/file – указание программе, где взять ключевой файл для шифрования. Если нужно использовать несколько ключевых файлов, то нужно указать несколько параметров --keyfile=, например:
tcplay --create --device=/dev/loop0 --cipher= TWOFISH-256-XTS --pbkdf-prf= RIPEMD160 --keyfile=/path/to/key/file01 --keyfile=/path/to/key/file02
Если ключевой файл не нужен, а достаточно пароля, вводимого с клавиатуры, параметр --keyfile не указывается. Пароль будет запрошен перед шифрованием.
Итак, предположим, что контейнер ассоциирован с устройством /dev/loop0, в качестве алгоритма шифрования мы выбрали один – AES-256, в качестве алгоритма PBKDF выбран whirlpool, а ключ находится в /keys/keyfile
Тогда команда приобретает вид:
tcplay --create --device=/dev/loop0 --cipher=AES-256-XTS --pbkdf-prf= whirlpool --keyfile=/keys/keyfile

Можно также добавить ключ --insecure-erase, тогда процесс пройдет быстрее, т.к. будет произведено затирание данных на диске. Поскольку я параноик, и в незашифрованном виде на диске ничего не храню, а свежий файл-контейнер представляет собой гигабайт нулей, то я смело его добавлю:
tcplay --create --device=/dev/loop0 --cipher=AES-256-XTS --pbkdf-prf= whirlpool --keyfile=/keys/keyfile –-insecure-erase

После ввода команды и нажатия Enter, нам предложат ввести парольную фразу и повторить ее. Если хочется кроме ключевого файла установить еще и пароль (или ключевой файл вообще не нужен), то вводим пароль и подтверждаем его, если указан ключевой файл, а пароль не нужен, жмем два раза Enter.
Далее попросят подтвердить свои действия, если все сделано правильно – отвечаем утвердительно, после чего нужно будет некоторое время подождать, пока tcplay не сгенерирует т.н. истинно-случайные числа и не завершит шифрование.
В конце процесса нам скажут All Done!, если так, значит шифрование файла-контейнера окончено.

1. Подключение файла-контейнера и подготовка его к работе.
1.1. Если файл-контейнер не ассоциирован с loop-устройством, это надо сделать, как описано здесь в пункте 5.
1.2. Далее необходимо, чтобы tcplay открыл доступ к зашифрованному диску, делается это следующей командой:
tcplay --map=tomename --device=/dev/loopX --keyfile=/path/to/key/file
где:
--map=tomename – параметр, указывающий имя, по которому мы будем обращаться к зашифрованному диску после его расшифровки
--device=/dev/loopX — параметр, указывающий имя устройства, с которым ассоциирован контейнер, например /dev/loop0
--keyfile=/path/to/key/file – параметр, указывающий путь к ключевому файлу, если такой наличествует, если файлов несколько, то и параметров --keyfile, следует указывать соответственно.
Если все указано верно, то tcplay ответит All ok! и доступ к зашифрованному диску будет открыт.
На свежесозданном зашифрованном томе в первую очередь необходимо создать таблицу разделов и файловую систему. Для простоты предположим, что на зашифрованном томе будет присутствовать один раздел в файловой системе ext2. На самом деле внутри тома, как и на обычном физическом устройстве можно создать несколько разделов, но к этому вопросу я вернусь в следующих заметках.
Форматируем том:
mkfs -t ext2 /dev/mapper/tomename
где:
-t ext2 – указание программе mkfs форматировать том в системе Ext2 (можно и в любой другой из поддерживаемых дистрибьютивом)
/dev/mapper/tomename – путь к подключенному tcplay виртуальному дисковому устройству (имя задавалось в параметре --map, все такие устройства находятся в /dev/mapper/).
Теперь на зашифрованном диске создана файловая система и он готов к работе, можно создать точку монтирования:
mkdir /mnt/tomename
И смонтировать его обычным образом:
mount -t ext2 /dev/mapper/tomename /mnt/tomename

2. Алгоритм подключения файла-контейнера.
2.1. Ассоциировать файл-контейнер с loop-устройством:
losetup /dev/loopX /path/to/file/disk01.crypt
где вместо X – номер свободного петлевого устройства, а вместо /path/to/file/disk01.crypt путь к реальному файлу-контейнеру
2.2. Подключение зашифрованного диска с помощью tcplay:
tcplay --map=tomename --device=/dev/loopX --keyfile=/path/to/key/file
где:
--map=tomename – параметр, указывающий имя, по которому мы будем обращаться к зашифрованному диску после его расшифровки
--device=/dev/loopX — параметр, указывающий имя устройства, с которым ассоциирован контейнер, например /dev/loop0
--keyfile=/path/to/key/file – параметр, указывающий путь к ключевому файлу, если такой наличествует, если файлов несколько, то и параметров —keyfile, следует указывать соответственно.
2.3. Создание, если еще не создана, точки монтирования:
mkdir /mnt/tomename
2.4. Монтирование раздела:
mount -t ext2 /dev/mapper/tomename /mnt/tomename

3. Отключение файла-контейнера.
После того, как работа с контейнером окончена, необходимо его отключить.
3.1. Отмонтировать диск:
umount /mnt/tomename
3.2. Отключить диск с помощью tcplay:
tcplay --unmap=tomename
3.3. Освободить петлевое устройство:
losetup -d /dev/loop0

4. Получение информации о томе.
Если том уже подключен с помощью tcplay, то информацию можно получить командой
tcplay --info-mapped=tomename
где вместо tomename нужно подставить имя тома, заданное в команде --map=
Если том ассоциирован с устройством loop, но еще не подключен, можно воспользоваться командой
tcplay --info --device=/dev/loop0
Если том зашифрован с помощью ключевого файла, то команду следует дополнить ключом --keyfile=/path/to/key
Обе команды выдадут информацию о томе, выглядящую приблизительно так:

Device:                 /dev/loop0
PBKDF2 PRF:             whirlpool
PBKDF2 iterations:      1000
Cipher:                 AES-256-XTS
Key Length:             512 bits
CRC Key Data:           0xee2c7c2d
Sector size:            512
Volume size:            2096640 sectors
IV offset:              256 sectors
Block offset:           256 sectors

5. Смена пароля, ключевого файла, алгоритма формирования ключа
Как и в TrueCrypt в tcplay можно сменить пароль, ключевой файл или алгоритм формирования ключа. Делается это с помощью опции --modify.

5.1. Сначала нужно ассоциировать файл-контейнер с loop-устройством, если он еще не ассоциирован:
losetup /dev/loop0 /path/to/file/disk01.crypt
5.2. Если том в данный момент наоборот используется, то его нужно отмонтировать и отключить в tcplay командой tcplay --unmap=tomename
5.3. Теперь можно приступать к модификации тома.
Например, команда замены ключевого файла будет выглядеть так:

tcplay --modify --device=/dev/loop0 --keyfile=/path/to/old/key --new-keyfile=/path/to/new/key

Естественно, вместо /path/to/new/key и /path/to/old/key должны быть указаны пути к старому и новому ключевому файлу. Если диск был зашифрован при помощи пароля, то параметр --keyfile опускается. Старый пароль будет предложено ввести перед процедурой смены пароля.
Для смены алгоритма формирования ключа, команда дополняется параметром
--new-pbkdf-prf=алгоритм
где вместо алгоритм надо подставить конкретный алгоритм (RIPEMD160, SHA512, whirpool).
Кроме смены алгоритма формирования ключа, ключевых файлов и паролей, с помощью опции
--modify можно сделать резервную копию заголовка тома.
6. Резервное копирование заголовка тома.
Была полезная опция в TrueCrypt, позволявшая сделать бэкап заголовка тома, т.к. в случае повреждения последнего расшифровка становилась невозможной. Есть эта опция и в tcplay.
Кстати говоря, tcplay делает резервную копию заголовка в конце тома, но при желании можно скопировать заголовок и в отдельный файл. Делается это также с помощью опции --modify
6.1. Сначала необходимо ассоциировать файл-контейнер с loop-устройством:
losetup /dev/loop0 /path/to/file/disk01.crypt
6.2 Далее необходимо ввести следующую команду:
tcplay --modify --device=/dev/loop0 --save-hdr-backup=/path/to/backup.hdr --keyfile=/path/to/key --new-keyfile=/path/to/key

Внимание! Будет запрошен новый пароль и/или нужно указать новый ключевой файл, если будет указан новый ключевой файл/пароль, то в томе изменений не будет (не будут установлены новый пароль/ключевой файл), а вот в бэкапе заголовка информация будет изменена. Соответственно, при восстановлении из бэкапа нужно будет использовать новый пароль/ключевой файл. Чтобы это предотвратить, можно указать в качестве новых данных старые.
7. Если не удается расшифровать файл. Или восстановление заголовков.
В случае если файл не удается расшифровать, а ключевой файл не поврежден/пароль введен правильно, можно попробовать восстановить заголовок тома.
7.1. Из внутреннего бэкапа, создаваемого tcplay внутри тома.
Сначала пробуем подключить поврежденный том, используя опции --map и
--use-backup:
tcplay --map=tomename --device=/dev/loopX --keyfile=/path/to/key/file --use-backup

Естественно, если ключевые файлы не используются, а установлен только пароль, опция
--keyfile= не нужна.
Если том успешно подключился, то отключаем его

tcplay --unmap=tomename

и восстанавливаем заголовок:
tcplay --modify --device=/dev/loop0 --keyfile=/path/to/key/file --restore-from-backup-hdr

или используя опцию --use-backup:

tcplay --modify --device=/dev/loop0 --keyfile=/path/to/key/file --new-keyfile=/path/to/key/file --use-backup

7.2. Из внешнего бэкапа заголовка тома.
tcplay --modify --device=/dev/loop0 --keyfile=/path/to/old/key --new-keyfile=/path/to/new/key --use-backup --use-hdr-file=/path/to/header/backup

Внимание! Будет запрошен новый пароль и/или нужно указать новый ключевой файл, если будет указан новый ключевой файл/пароль, то при восстановлении изменится ключевой файл/пароль тома.
В принципе, понятно для чего это сделано. Восстанавливаешь заголовок — поменяй пароль. С бэкапом заголовков тома есть один подводный камень:
Внимание! Если злоумышленник получит ключевой файл (или узнает старый пароль), а также получит соответствующий ему бэкап заголовка тома, то он сможет восстановить заголовок тома и получить доступ к его содержимому. Такое может произойти, например, если без присмотра остался старый бэкап заголовка и старый ключевой файл. И на практике такое случалось, потому что про неиспользуемые ключевые файлы люди банально забывают, как и про старые бэкапы. Своевременно и надежно уничтожайте устаревшие ключевые файлы и бэкапы заголовков! Например, при помощи утилиты shred [копия]

Начало.
Продолжение следует.

Это перепост заметки из моего блога на LJ.ROSSIA.ORG
Оригинал находится здесь: http://lj.rossia.org/users/hex_laden/316433.html
Прокомментировать заметку можно по ссылке выше.