02 November, 2007

Шифрование домашнего раздела в GNU/Linux. Ещё одна инструкция.

Решил на днях зашифровать домашний раздел. Но не нашёл инструкции, которая была бы мне понятно и содержала нужные и правильные для меня советы и объяснения. Как известно, в мире свободного ПО хорошо действует принцип "если тебе чего-то не хватает, то сделай это сам". Потому и пишу эту инструкцию - не только для других, но и для себя.
Итак, имеется следующая задача:
- зашифровать домашний раздел - при его монтировании система запрашивает пароль.
- при подключении жесткого диска с домашним разделом к другому компьютеру, операционной системе и программам по разметке жестких дисков раздел должен видиться как пустой неразмеченный.
Один из минусов данного подхода - если ноутбук (для десктопа я считаю это не актуальным) переводится в режим гибернации (hibernate), то при возвращении его к жизни запроса пароля, к сожалению (а хотелось бы), ещё раз не происходит - т.к. домашний раздел уже подмонтирован.

Примечание. Перед началом операции во-первых, НАСТОЯТЕЛЬНО рекомендуется сбэкапить все важные данные. Во-вторых, перед вводом команд необходимо перейти в режим суперпользователя.

В попытках найти уже существующие решения, наткнулся на три статьи, но ни одна из них не покрывала мою задачу так, как это нужно мне:
Tuxedo Live - ряд ошибок, в том числе грубых; некоторые команды и применённые принципы не пояснены.
Прикладная Дебианавтика - инструкция правильная, но слишком исчерпывающая; решение описано скорее для серверных машин с применением LVM-разделов.
Продвинутый способ шифрования разделов в Linux@Форум "Античат" - пособие грамотное, но слишком уж параноидальное. Единственное, что оттуда подчерпнул - инструкция о том, как забить раздел случайными данными и как узнать, сколько ещё осталось:
узнаём PID процесса: ps ax | grep "dd if"; а затем получаем информацию о том, сколько случайных данных уже записано: kill -USR1 pid

Приступим.
0. Устанавливаем необходимые пакеты. Для шифрования будут использоваться cryptsetup, dm-crypt и fuse-utils.
1. Форматируем будущий домашний раздел в целевую файловую систему.
2. Забиваем раздел случайными данными; в этом случае, во-первых, раздел будет видиться всеми программами для работы с дисками и разделами как ошибочный; во-вторых, практически невозможно будет установить точный объём занятого непосредственно данными пространства из-за того, что для программ по обслуживанию дисков весь раздел будет забит мусором, а, следовательно, будет занят весь раздел без возможности однозначного установления, где заканчиваются данные и начинается свободное пространство, забитое мусором.

Примечание: наполнение раздела случайными данными - очень длительная процедура. В моём случае домашний раздел на 60GB наполнился за 5-8 часов. Т.е. в этом случае имеет смысл сделать такую процедуру перед сном. Тогда на утро раздел будет готов.

3. Шифруем домашний раздел; с необходимыми параметрами шифрования и паролем.
4. Редактируем любимым текстовым редактором файл /etc/crypttab в соответствии с параметрами шифрования.
5. Перезапускаем службу шифрования дисков cryptdisks. Если всё правильно, то появится предложение ввести пароль. Если пароль введён правильно и нигде нет ошибок, то служба шифрования успешно перезапустится. Если нет, то появится предупреждение или ошибка. Значит где-то что-то неправильно.
6. Форматируем уже зашифрованный домашний раздел в целевую файловую систему.
7. Редактируем, опять же, любимым текстовым редактором, /etc/fstab таким образом, чтобы в качестве домашнего раздела монтировался свежезашифрованный раздел.
8. Монтируем зашифрованный будущий домашний раздел.
9. Копируем на него структуру раздела /home без изменений.
10. Перезагружаем систему, вводим при загрузке пароль и работаем с домашним зашифрованным разделом на отдельном логическом диске.

Подведём итоги. Собственно, сами команды:
{
/dev/sdaN - раздел, который будет зашифрован и станет домашним;
name - имя, эдакая метка зашифрованного раздела.
В моём случае N=3; name=home; файловая система - ext3; текстовый редактор - vim
}
0. apt-get install dmsetup cryptsetup fuse-utils
1. mkfs -t ext3 /dev/sdaN
2. dd if=/dev/urandom of=/dev/sdaN
3. cryptsetup -c aes-cbc-essiv:sha256 -s 256 luksFormat /dev/sdaN
YES
вводим два раза пароль для зашифровки раздела
4. vim /etc/crypttab
добавляем строчку:
name /dev/sdaN none luks,cipher=aes-cbc-essiv:sha256
5. /etc/init.d/cryptdisks restart
6. mkfs -t ext3 /dev/mapper/name
7. vim /etc/fstab
комментируем строку с /home, если она была;
добавляем другую:
/dev/mapper/name /home ext3 defaults
8. mkdir /mnt/home; mount /dev/mapper/name /mnt/home
9. cp -rfax /home/* /mnt/home/
10. reboot
когда очередь дойдёт до монтирования файловых систем, автоматически запустится служба cryptdisks и попросит ввести пароль от зашифрованного домашнего раздела:
11.Enter LUKS passphrase:
Введя правильный пароль, раздел подмонтируется.
При вводе неправильного пароля предложение о вводе пароля будет выводиться снова и снова.
Но если монтировать зашифрованный раздел не требуется, то достаточно нажать ctrl-d при предложении ввести пароль - загрузка системы продолжится без монтирования зашифрованного раздела.

Дополнение.
Вполне может возникнуть необходимость доступа к зашифрованному разделу с LiveCD-дистрибутива, когда, к примеру, загрузка с корневого раздела невозможна. В этом случае (пример для deb-систем):
1. редактируем /etc/apt/sources.list, чтобы было доступно как можно больше репозитариев
2. обновляем список доступных пакетов:
#apt-get update
3. устанавливаем дополнительные пакеты:
#apt-get install dmsetup cryptsetup fuse-utils
4. подключаем модуль ядра для работы с зашифрованными разделами:
#modprobe dm_crypt
#modprobe dm-crypt
Если подключение модулей прошло успешно, то не будет выведено никакой информации; если же что-то пошло не так, то, скорее всего, ядро в комплекте LiveCD-дистрибутива данного модуля в наличии не имеет - придётся поискать другой дистрибутив
5. редактируем /etc/crypttab:
name /dev/sdaN none luks,cipher=aes-cbc-essiv:sha256
6. перезапускаем службу:
#/etc/init.d/cryptdisks restart
на запрос вводим пароль от зашифрованного раздела
7. монтируем уже подмонтированный :-) зашифрованный раздел в работающую файловую систему:
#mkdir /mnt/disk && mount -t ext3 /dev/mapper/name /mnt/disk
Доступ к зашифрованному разделу с данными получен.

Примечание.
Возможно, периодически эта страница будет обновляться тематической информацией по шифрованию. Таким образом, планируется из данного поста сделать что-то вроде смеси wiki-страницы с miniHOWTO по шифрованию в GNU/Linux и тому, что с этим связано. В качестве анонса следующего обновления - изменение алгоритма шифрования паролей по умолчанию MD5 на что-нибудь другое (либо DES, либо Bluefish), а также шифрование не всего раздела, а отдельных каталогов, доступных пользователю, через EncFS. Как говорится, coming soon... :-)

08 April, 2007

Предисловие

В данном блоге планируется публикация практических советов различных масштабов по работе в операционных системах семейства GNU/Linux. Советы ни в коей мере не претендуют на проффесионализм, но на удобство, каковым оно мне видится.