пятница, 24 ноября 2017 г.

Шифрование данных в Debian


Шифрование данных в Debian


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

Шифрование при помощи cryptsetup


Установим необходимые компоненты:


# apt-get install cryptsetup

Стандартный синтаксис


Выберем раздел диска (или флешки) который мы хотим зашифровать, например это будет /dev/sda2. Введем команду:
# cryptsetup create sda2_crypt /dev/sda2
Данная команда создаст шифрованное подключение к нашему диску. В каталоге /dev/mapper появится новое устройство с запрошенным нами именем: /dev/mapper/sda2_crypt, обращаясь к которому мы используем шифрованный доступ к диску. В случае с LUKS имя будет /dev/mapper/sda2_crypt
Если на диске уже была файловая система и мы хотели бы сохранить данные на ней то необходимо выполнить их шифрование для последующего их использования:
# dd if=/dev/sda2 of=/dev/mapper/sda2_crypt
Если же создается новый диск на пустом разделе, то можно отформатировать его:
# mkfs.ext3 /dev/mapper/sda2_crypt
В последствии можно будет смонтировать этот диск куда угодно:
# mount /dev/mapper/sda2_crypt /path/to/mount/point
Проверить целостность данных (как обычно, лучше использовать только в размонтированном состоянии):
# fsck.ext3 /dev/mapper/sda2_crypt
И даже расшифровать обратно, если мы больше не хотим использовать шифрование:
# dd if=/dev/mapper/sda2_crypt of=/dev/sda2

LUKS синтаксис


Вышеуказанные действия можно выполнить в соответствии со стандартом LUKS
Инициализируем раздел:
cryptsetup luksFormat /dev/sda2
Подключаем в систему:
cryptsetup luksOpen /dev/sda2 sda2_crypt
Форматируем:
mkfs.ext4 -v -L DATA /dev/mapper/sda2_crypt
Монтируем:
mount /dev/mapper/sda2_crypt /mnt/data
Раздел можно вручную отключить о системы
cryptsetup luksClose sda2_crypt

Подключение при запуске


Для этой цели используется файл crypttab.
Для нашего диска пропишем в него следующую строку:
nano /etc/crypttab

# имя mapper  устройство   ключ    параметры/опции
# При стандартном синтаксисе
sda2_crypt    /dev/sda2    none    aes-cbc-plain:sha256
# и\или под стандарту LUKS
sda2_crypt    /dev/sda2    none    luks
По умолчанию используется шифрование по паролю введенному пользователем. Таким образом каждый раз когда Вы загружаете Ваш компьютер система будет спрашивать каждый раз у Вас пароль для подключения каждого зашифрованного раздела. Даже если в fstab эти разделы не прописаны.
Если хотим монтировать вручную, то добавляем опцию noauto в поле "параметры/опции".
Подключение шифрованного раздела вручную по данным из /etc/crypttab
cryptdisks_start msda2_crypt
И отключение с заранее отмонтированной фс.
cryptdisks_stop sda2_crypt
Для автоматического монтирования фс на подключённом зашифрованном разделе добавляем строку в /etc/fstab
/dev/mapper/sda2_crypt /mnt/data ext4 defaults 0 0

Работа с ключами в LUKS


Раздел LUKS поддерживает 8 различных ключей, каждый из которых помещается в свой слот.
Cмотрим список используемых ключей
cryptsetup luksDump /dev/sda2
В LUKS могут использоваться 2 вида ключей – ключевые фразы и файлы.
Можно добавить ключевую фразу
cryptsetup luksAddKey /dev/sda2
Можно добавить ключевой файл (2048 bit) и выставить права доступа к нему.
dd if=/dev/urandom of=/root/ext2.key bs=512 count=4
cryptsetup luksAddKey /dev/sda2 /root/ext2.key
chmod 400 /root/sda2.key
Далее следует подключить раздел в систему по ключу:
cryptsetup -d /root/sda2.key luksOpen /dev/sda2 sda2_crypt
Для подключения при запуске по ключу правим /etc/crypttab
nano /etc/crypttab

sda2_crypt    /dev/sda2    /root/sda2.key    luks
Можно удалить ключевую фразу или ключ из раздела
cryptsetup luksKillSlot /dev/sda2 1

Аварийное монтирование в "чужом" дистрибутиве


От проблем никто не застрахован и иногда нужно получить доступ к зашифрованному разделу из аварийного LiveCD диска.
Загружаемся, подключаем раздел в систему и монтируем фс:
cryptsetup luksOpen /dev/sda2 sda2_crypt
mount -t ext4 /dev/mapper/sda2_crypt /mnt/backup
После работы отмонтируем фс и отключим зашифрованный раздел от системы
umount /mnt/backup
cryptsetup luksClose sda2_crypt

Сообщения об ошибках при выключении


Если корневой раздел зашифрован, то при выключении будет выдаваться сообщение
stopping early crypto disks... failed
Это техническая ошибка. При выключении в первую очередь всегда демонтируется файловые системы и лишь потом происходит отключение раздела. В итоге получается что утилита cryptsetup находящаяся на корневом отмонтированном разделе уже недостуна для запуска, о чём нам INIT и сообщает. Без костылей такую проблему не решить, т.к. для этого нужно рассматривать варианты с переносом cryptsetup в RAM диск
Аналогичная ситуация складыватеся и при использовании программного RAID содержащего корневой раздел. 8)

Шифрование при помощи модуля loop-aes


Шифрование раздела винчестера, флешки с помощью пароля


В данном howto описан метод шифрования AES256, другие методы можно применять аналогично (заменив название метода на соответствующее). Нам понадобятся следующие пакеты:
# apt-get install loop-aes-utils loop-aes-modules-`uname -r`
Примечание: если Вы используете ядро для которого в репозитарии нет нужного loop-aes-modules, Вы можете установить модули следующими командами:
# apt-get install module-assistant loop-aes-source
# module-assistant a-i loop-aes

Начальный этап

На начальном этапе мы готовим диск к тому чтобы работать с ним, используя шифрование.
Выберем раздел диска (или флешки) который мы хотим зашифровать, например это будет /dev/sda2. Введем команду:
# losetup -e AES256 -T /dev/loop0 /dev/sda2
После выполнения данной команды, все обращения к девайсу /dev/loop0 будут шифроваться и в шифрованном виде перенаправляться в девайс /dev/sda2. Теперь мы имеем одновременно шифрованный и нешифрованный каналы к устройству хранения данных. Шифруются данные при помощи пароля который вы указали при выполнении losetup.
Теперь мы можем например отформатировать девайс:
# mkfs.ext3 /dev/loop0
Можем смонтировать его:
# mount /dev/loop0 /path/to/mount
можем отключить шифрование:
# losetup -d /dev/loop0
и самое главное, можем зашифровать раздел без потери данных:
# dd if=/dev/sda2 of=/dev/loop0
а так же расшифровать, если решаем что шифрование не наш метод:
# dd if=/dev/loop0 of=/dev/sda2
Ну и самое приятное, мы можем делать проверки файловой системы на целостность:
# fsck.ext3 /dev/loop0
Данная возможность доступна далеко не во всех методах шифрования разделов.

Повседневное использование


Если у Вас уже была запись о разделе /dev/sda2 в Вашем /etc/fstab, то Вам нужно просто добавить опции, а если не было то прописать примерно следующее:
/dev/sda2 /path/to/mount ext3 loop,encryption=AES256 0 0
Теперь при загрузке операционной системы у Вас будет запрошен пароль для монтирования.
Если Вы не хотите чтобы процесс загрузки прерывался запросом пароля, то можно добавить опции noauto,user в запись /etc/fstab:
/dev/sda2 /path/to/mount ext3 loop,encryption=AES256,noauto,user 0 0
Разумеется можно монтировать вручную (или из скрипта):
# mount /dev/sda2 /path/to/mount -o loop,encryption=AES256

Монтирование нескольких файловых систем


Иногда хочется зашифровать одновременно несколько разделов с данными, но так чтобы не вводить море паролей на каждый mountНапример у Вас есть флешка, которую вы таскаете из дома на работу, переносной винчестер и т.п. Или же просто несколько разделов/винчестеров.
Допустим мы имеем зашифрованный раздел /dev/sda2, который мы при каждой загрузке монтируем в каталог /mnt1. Появился новый винчестер /dev/sdb1 и мы хотим чтобы он автоматически монтировался в каталог mnt2 при монтировании первого. Можно конечно создать общую систему на чем-то вроде LVM, однако можно и более простым путем пойти:
прописываем в fstab примерно следующую строку:
/dev/sda2 /mnt1 ext3 noatime,exec,loop,encryption=AES256 0 0
/dev/sdb1 /mnt2 ext3 noatime,exec,loop,encryption=AES256,cleartextkey=/mnt1/key.txt 0 0
далее в зашифрованном разделе создаем файл /mnt1/key.txt, в который прописываем пароль, который будет использован для монтирования второго винчестера.
Система при загрузке монтирует точки в том же порядке, который описан в fstab, таким образом, если первый раздел не будет смонтирован, то ключ для монтирования второго раздела останется недоступным и второй раздел так же не будет смонтирован.
Пароль хранится в виде plain/text это конечно не очень красиво, но он хранится на зашифрованном разделе (который можно и отмонтировать). Можно вместо этого использовать gpg-ключ, однако много безопасности это не добавит (если уж смогут спереть ключ, то большой разницы какой этот ключ не будет), вариант шифрования с gpg-ключом описан в man losetup, здесь я лишь приведу пример записи в fstab:
/dev/sda2 /mnt1 ext3 noatime,exec,loop,encryption=AES256 0 0
/dev/sdb1 /mnt2 ext3 noatime,exec,loop,encryption=AES256,gpgkey=/mnt1/key.gpg 0 0

Примечания


Дополнительную информацию о поддерживаемых алгоритмах шифрования смотри в man losetup, там же можно посмотреть описание других опций программы losetup.
Если у Вас возникнут проблемы при установке модулей AES, то читайте документацию идущую с пакетом loop-aes-source.

GRUB и шифрованный корневой диск


При установке корневого раздела на зашифрованный диск GRUB может в главном меню показывать кракозябры. Это происходит из-за недоступности стандартного шрифта /usr/share/grub/unicode.pf2. Копируем шрифт
cp /usr/share/grub/unicode.pf2 /boot/grub/
Указываем настройку
nano /etc/default/grub

GRUB_FONT=/boot/grub/unicode.pf2
Применяем настройку:

update-grub
источник

Комментариев нет:

Отправить комментарий