[Sysadmins] шифрование корневого раздела
Michael A. Kangin
mak на complife.ru
Сб Июн 18 00:00:47 MSK 2016
Немножко оффтопика, опишу для гугля как я у себя делал систему.
Дано: новенький рабочий компьютер с 4 HDD и 1 SSD.
Надо всё зашифровать по максимуму (/, swap) и поиметь максимально
быструю при этом дисковую систему, утилизируя SSD и 4 шпинделя.
В основу кладём уже используемую мной ранее схему - разделы с редкой
записью - /boot, /, /usr (разделы по отдельности или вместе) кладём на
ssd, из дисков (сырых, безраздельно) делаем raid10, на котором размещаем
LVM, из которого нарезаем /var, /home, swap, и далее по потребностям.
Потребности можно кстати оставить вообще пока невыделенными, и потом
увеличить любой требуемый раздел. При выходе из строя HDD просто
вынимаем его, вставляем новый, и никак не размечая, запускаем ребилд.
Но при такой схеме используется только маленькая часть самого маленького
SSD, много ли там на /usr надо. Так что попробуем еще и bcache. Большую
часть SSD пускаем на кеширование, и кешировать будем весь md0, который у
нас raid10 на 4 сырых дисках. Да, с точки зрения надёжности наверное
стоит пустить на кеширование отдельное зеркальце из пары отдельных SSD,
но у меня тут не Ынтерпрайз, а скромная рабочая станция :)
Хорошо, но куда же тут прилепить шифрование?
А шифровать мы будем посерединке между bcache и LVM.
Т.е., с одной стороны, у нас уже сразу целиком зашифрованный PV, дальше
можно по-раздельно уже не париться. С другой стороны, сам b-кеш на SSD
тоже скидывается зашифрованный, на радость моей паранойе.
Ну и корень с /usr, которые остались на SSD вне LVM. Их же тоже надо
зашифровать. Ну, это простенько - ни рейдов, ни кешей, ни LVM, обычный
простой раздельчик.
Только вот беда - теперь при старте системы пароль спрашивается два раза
- на / и на LVM. Внутренний полузадушенный перфекционист негодуэ.
Выход из этой ситуации - для расшифровки брать ключ не с клавиатуры, а
из некоего файла или устройства. Недушенный перфекционист прикрутил бы
смарт-карту с двухфакторной авторизацией, но мой такого не осилил.
Поэтому ключ мы храним просто где-то в файле, который на этом же диске,
и является в свою очередь криптоконтейнером. Который мы открываем
паролем, вводимым с клавиатуры при старте системы. Но всего один раз!
Сколько бы мы потом разделов не нашифровали себе.
Ладно, извращаться, так по крупному. Всё в этой схеме хорошо, но этот
компьютер я постоянно использую и удалённо, из дома. Что, если он там
без меня соскучится, зависнит, перезагрузится, электричество моргнёт?
Я могу попросить коллегу нажать там резет, но не сдавать же пароли чтобы
отпереть диск?
Это мог бы сделать я и сам, по сети. Жаль что груб2 её не умеет :)
Тогда мы приходим к пониманию необходимости еще одной,
минимальной-вспомогательной системы на нашей SSDшечке. Её заботой будет
загрузиться, поднять сеть, запустить OpenVPN для обхода NAT-ов (у меня
хоть и есть прямой IP, но подстраховаться никогда не помешает),
запустить sshd, и спрашивать пароли, на физической консоли и при
ssh-подключениях. Если там или там был введён пароль, которым удалось
раскрыть наш криптоконтейнер с главным ключом, мы открываем им наш
основной криптованный рут, LVM, и делаем pivot_root в основную систему.
Или, если пароля не ввели, можно например перезагрузиться, или выпасть в
консоль вспомогательной системы, или показать котика дня. Ведь по
существу ничего, кроме котиков, хранить в незашифрованной системе нельзя
(здесь должна быть КДПВ с котиком).
Вот, собственно, такая система была реализована на базе P7 и живёт и
здравствует уже почти полтора года.
Плюсы - высокое быстродействие (если верить fio и субъективным
ощущениям), вроде-бы криптобезопасность, ну и удобство использования,
насколько это возможно.
Из минусов - некоторый геморрой создания всего этого. Штатный
инсталлятор, разумеется, и десятой части всего этого изврата не осилит,
поэтому основная работа происходит из лив-системы, с последующим
разворачиванием образа готовой системы в подготовленное место (можно
использовать, например, ALT Linux Live имени enp@).
Вспомогательная система у нас должна быть аналогична по пакетному
составу основной (совершенно точно должно совпадать версия ядра, скорее
всего и всякие libc), за этим надо специально следить при обновлении.
Наличие только одного нерезервируемого SSD внушает некоторые опасения,
поэтому я время от времени делаю копию рута/бута на диски. Возможно
подумаю потом о зеркалировании SSD, хотя уже и устройств пихать некуда :)
Получившаяся разбивка SSD:
Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 468862128 sectors, 223.6 GiB
...
Number Size Code Name
1 256.0 MiB EF00 EFI System
2 8.0 MiB EF02 BIOS boot partition
3 256.0 MiB 8300 Linux filesystem
4 2.0 GiB 8300 Linux filesystem
5 24.0 GiB 8300 Linux filesystem
6 197.1 GiB 8300 Linux filesystem
3 - boot, 4 - вспомогательная система, 5 - шифрованный рут+usr основной
системы, 6 - кеш.
HDD-диски в lsblk выглядят так:
sdb 8:16 0 1.8T 0 disk
└─md0 9:0 0 3.7T 0 raid10
└─bcache0 252:0 0 3.7T 0 disk
└─cr-lvm (dm-2) 253:2 0 3.7T 0 crypt
├─VG0-lv_var (dm-0) 253:0 0 64G 0 lvm /var
├─VG0-lv_home (dm-3) 253:3 0 2.9T 0 lvm /home
└─VG0-lv_swap (dm-4) 253:4 0 32G 0 lvm [SWAP]
sdc 8:32 0 1.8T 0 disk
└─md0 9:0 0 3.7T 0 raid10
└─bcache0 252:0 0 3.7T 0 disk
└─cr-lvm (dm-2) 253:2 0 3.7T 0 crypt
├─VG0-lv_var (dm-0) 253:0 0 64G 0 lvm /var
├─VG0-lv_home (dm-3) 253:3 0 2.9T 0 lvm /home
└─VG0-lv_swap (dm-4) 253:4 0 32G 0 lvm [SWAP]
sdd 8:48 0 1.8T 0 disk
└─md0 9:0 0 3.7T 0 raid10
└─bcache0 252:0 0 3.7T 0 disk
└─cr-lvm (dm-2) 253:2 0 3.7T 0 crypt
├─VG0-lv_var (dm-0) 253:0 0 64G 0 lvm /var
├─VG0-lv_home (dm-3) 253:3 0 2.9T 0 lvm /home
└─VG0-lv_swap (dm-4) 253:4 0 32G 0 lvm [SWAP]
sde 8:64 0 1.8T 0 disk
└─md0 9:0 0 3.7T 0 raid10
└─bcache0 252:0 0 3.7T 0 disk
└─cr-lvm (dm-2) 253:2 0 3.7T 0 crypt
├─VG0-lv_var (dm-0) 253:0 0 64G 0 lvm /var
├─VG0-lv_home (dm-3) 253:3 0 2.9T 0 lvm /home
└─VG0-lv_swap (dm-4) 253:4 0 32G 0 lvm [SWAP]
Подробная информация о списке рассылки Sysadmins