[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