Linux mint шифрование всего диска

Содержание
  1. Шифрование дисков в Linux
  2. Методы шифрования данных в Linux
  3. Как работает LUKS?
  4. Утилита Cryptsetup
  5. Шифрование диска Linux
  6. 1. Создание раздела
  7. 2. Форматирование раздела
  8. 3. Монтирование раздела
  9. 4. Отключение раздела
  10. 5. Повторное монтирование
  11. 6. Проверить файловую систему luks
  12. 7. Изменить парольную фразу luks
  13. Выводы
  14. Используем Secure Boot в Linux на всю катушку
  15. Ограничения решений «из коробки»
  16. Как Ubuntu реализует загрузку в Secure Boot с шифрованием всего диска и что с этим не так?
  17. Что это всё означает?
  18. Установка Ubuntu с шифрованием всего диска с помощью LUKS и LVM
  19. Разметка и шифрование
  20. Установка
  21. Настройка crypttab, fstab и resume
  22. Создание загрузчика
  23. Настройка Secure Boot
  24. Автоматизация
  25. Подписывание драйверов и модулей ядра
  26. Очевидные советы
  27. Бонус: возвращение гибернации
  28. Способ 1. Отключить верификацию модулей ядра
  29. Способ 2. Использовать старую версию ядра
  30. Способ 3. Скомпилировать своё ядро
  31. Получение исходного кода
  32. Настройка
  33. Компиляция
  34. Способ 4. Отказ от гибернации и использование виртуализации
  35. Примечания

Шифрование дисков в Linux

Безопасность и конфиденциальность очень важны, для тех, кто хранит важные данные на компьютере. Ваш домашний компьютер находится в безопасности, но с ноутбуком или другими переносными устройствами ситуация очень сильно меняется. Если вы носите свой ноутбук с собой почти везде и к нему могут иметь доступ посторонние лица, возникает вопрос — как защитить свои данные от чужого вмешательства. Именно от физических атак, где каждый желающий может попытаться получить данные из USB накопителя или жесткого диска ноутбука просто забрав устройство или в случае ноутбука, вытянув жесткий диск и подключив его к другой операционной системе.

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

Методы шифрования данных в Linux

Шифрование на уровне файловой системы:

  • 1. eCryptfs — это криптографическая файловая система Linux. Она хранит криптографические метаданные для каждого файла в отдельном файле, таким образом, что файлы можно копировать между компьютерами. Файл будет успешно расшифрован, если у вас есть ключ. Это решение широко используется для реализации зашифрованной домашней директории, например, в Ubuntu. Также ChromeOS прозрачно встраивает эти алгоритмы при использовании сетевых устройств для хранения данных (NAS).
  • 2. EncFS — обеспечивает шифрованную файловую систему в пространстве пользователя. Она работает без каких-либо дополнительных привилегий и использует библиотеку fuse и модуль ядра для обеспечения интерфейса файловой системы. EncFS — это свободное программное обеспечение и она распространяется под лицензией GPL. В наши дни эта файловая система уже устарела потому что в ней было найдено несколько уязвимостей. Вместо неё популярность набирают другие утилиты.

Блочное шифрование на уровне устройства:

  • Loop-AES — быстрая и прозрачная файловая система, а также пакет для шифрования раздела подкачки в Linux. Исходный код программы давно не изменялся. Она работает с ядрами 4.x, 3.x, 2.2, 2.0.
  • TrueCrypt — это бесплатное решение с открытым исходным кодом для шифрования диска в операционных системах Windows 7 / Vista /XP / Mac OS X, а также в Linux.
  • dm-crypt+LUKS — dm-crypt — это прозрачная подсистема для шифрования диска в ядре 2.6 и более поздних версиях. Поддерживается шифрование целых дисков, съемных носителей, разделов, томов RAID, программного обеспечения, логических томов и файлов.

В этой инструкции мы рассмотрим шифрование жесткого диска на Linux с помощью алгоритма Linux Unified Key Setup-on-disk-format (LUKS).

Как работает LUKS?

LUKS (Linux Unified Key Setup — протокол шифрования блочного устройства. Но мы забежали далеко наперед, чтобы понять как это работает, нужно скачала разобраться с другими технологиями, используемыми в этом способе.

Чтобы выполнить шифрование диска linux используется модуль ядра dm-crypt. Этот модуль позволяет создавать в каталоге /dev/mapper виртуальное блочное устройство с прозрачным для файловой системы и пользователя шифрованием. Фактически все данные лежат на зашифрованном физическом разделе. Если пользователь пытается записать данные на виртуальное устройство, они на лету шифруются и записываются на диск, при чтении с виртуального устройства, выполняется обратная операция — данные расшифровываются с физического диска и передаются в открытом виде через виртуальный диск пользователю. Обычно для шифрования используется метод AES, потому что под него оптимизированы большинство современных процессоров. Важно заметить, что вы можете шифровать не только разделы и диски, но и обычные файлы, создав в них файловую систему и подключив как loop устройство.

Алгоритм LUKS определяют какие действия и в каком порядке будут выполняться во время работы с шифрованными носителями. Для работы с LUKS и модулем dm-crypt используется утилита Cryptsetup. Ее мы и рассмотрим далее.

Утилита Cryptsetup

Утилита Cryptsetup позволят облегчить шифрование раздела Linux с помощью модуля dm-crypt. Давайте сначала ее установим.

В Debian или Ubuntu, для этого используйте такую команду:

suduo apt install cryptsetup

В дистрибутивах, основанных на Red Hat это будет выглядеть так:

sudo yum install cryptsetup-luks

Синтаксис запуска команды такой:

$ cryptsetup опции операция параметры_операции

Рассмотрим основные операции, которые можно сделать с помощью этой утилиты:

  • luksFormat — создать зашифрованный раздел luks linux;
  • luksOpen — подключить виртуальное устройство (нужен ключ);
  • luksClose — закрыть виртуальное устройство luks linux;
  • luksAddKey — добавить ключ шифрования;
  • luksRemoveKey — удалить ключ шифрования;
  • luksUUID — показать UUID раздела;
  • luksDump — создать резервную копию заголовков LUKS.

Параметры операции зависят от самой операции, обычно это либо физическое устройство, с которым нужно произвести действие, либо виртуальное или и то и другое. Еще не все понятно, но на практике, я думаю, вы со всем разберетесь.

Шифрование диска Linux

Теория пройдена, все инструменты готовы. Теперь рассмотрим шифрование раздела Linux. Перейдем к настройке жесткого диска. Обратите внимание, что это удалит все данные из диска или раздела, который вы собираетесь зашифровать. Так что если там есть важные данные, лучше скопируйте их в более надежное место.

1. Создание раздела

В этом примере мы будем шифровать раздел /dev/sda6, но вместо него вы можете использовать целый жесткий диск или просто один файл, заполненный нулями. Создаем шифрованный раздел:

sudo cryptsetup -y -v luksFormat /dev/sdb1

Эта команда выполнит инициализацию раздела, установит ключ инициализации и пароль. Сначала надо подтвердить создание виртуального шифрованного диска набрав YES, затем нужно указать пароль. Указывайте такой пароль, чтобы его потом не забыть.

Выполните такую команду чтобы открыть только что созданный раздел с помощью модуля dm-crypt в /dev/mapper, для этого понадобится ввести пароль, с которым выполнялось шифрование luks linux:

sudo cryptsetup luksOpen /dev/sdb1 backup2

Теперь вы можете увидеть новое виртуальное устройство /dev/mapper/backup2 созданное с помощью команды luksFormat:

ls -l /dev/mapper/backup2

Чтобы посмотреть состояние устройства выполните:

sudo cryptsetup -v status backup2

А с помощью следующей команды вы можете сделать резервную копию заголовков LUKS на всякий случай:

cryptsetup luksDump /dev/sdb1

Ну, можно сказать, раздел готов. И что самое интересное, теперь вы можете им пользоваться так же, как и любым другим обычным разделом в каталоге /dev. Его можно форматировать с помощью стандартных утилит, записывать на него данные, изменять или проверять файловую систему и т д. Нельзя только изменить размер. То есть все полностью прозрачно, как и сказано в начале статьи.

2. Форматирование раздела

Давайте для начала отформатируем диск. Для надежности, чтобы стереть все данные, которые были в этом месте раньше, перезапишем наш шифрованный раздел linux нулями. Это уменьшит вероятность взлома шифрования, через увеличение количества случайной информации. Для этого выполните:

dd if=/dev/zero of=/dev/mapper/backup2

Работа утилиты может занять несколько часов, чтобы иметь возможность наблюдать за процессом, используйте pv:

pv -tpreb /dev/zero | dd of=/dev/mapper/backup2 bs=128M

Когда процесс завершится мы можем отформатировать устройство в любую файловую систему. Например, отформатируем в ext4:

Читайте также:  Toshiba satellite l300 драйвера под windows

sudo mkfs.ext4 /dev/mapper/backup2

Как видите, все команды cryptsetup применяются к физическому разделу, в то время как остальные команды для работы с дисками — к нашему виртуальному.

3. Монтирование раздела

Теперь можно примонтировать только, что созданную файловую систему:

sudo mount /dev/mapper/backup2 /backup2

4. Отключение раздела

Все работает, но как отключить устройство и защитить данные. Для этого выполните:

sudo umount /backup2

sudo cryptsetup luksClose backup2

5. Повторное монтирование

Чтобы снова получить возможность работать с зашифрованным разделом с помощью LUKS linux необходимо опять его открыть:

sudo cryptsetup luksOpen /dev/sdb1 backup2

Теперь можем монтировать:

sudo mount /dev/mapper/backup2 /backup2

6. Проверить файловую систему luks

Поскольку после открытия раздела с помощью luks linux, этот раздел воспринимается системой, как и все другие, вы можете просто использовать утилиту fsck:

sudo umount /backup2

sudo fsck -vy /dev/mapper/backup2

sudo mount /dev/mapper/backup2 /backu2

7. Изменить парольную фразу luks

Шифрование дисков Linux выполняется с определенной парольной фразой, но вы можете ее изменить. Даже больше, вы можете создать до восьми разных парольных фраз. Для изменения выполнив следующие команды. Сначала сделаем резервную копию заголовков LUKS:

sudo cryptsetup luksDump /dev/sdb1

Затем создадим новый ключ:

sudo cryptsetup luksAddKey /dev/sdb1

И удалим старый:

sudo cryptsetup luksRemoveKey /dev/sdb1

Сейчас вам придется ввести еще старый пароль.

Выводы

Вот и все теперь вы знаете как зашифровать раздел в Linux, а также понимаете как все это работает. Кроме того, шифрование дисков в Linux по алгоритму LUKS открывает широкие возможности для полного шифрования устанавливаемой системы.

Плюсы:

  • LUKS шифрует все блочное устройство, и поэтому очень хорошо подходит для защиты содержимого переносных устройств, таких как мобильные телефоны, съемные носители или жесткие диски ноутбуков.
  • Вы можете использовать на серверах NAS для защиты резервных копий
  • Процессоры Intel и AMD с AES-NI (Advanced Encryption Standard) имеют набор команд, которые могут ускорить процесс шифрования на основе dm-crypt в ядре Linux начиная с 2.6.32.
  • Работает в том числе и с разделом подкачки, так что ваш ноутбук может использовать функцию спящего режима, или гибернации полностью безопасно.

Минусы:

  • LUKS поддерживает шифрование только до восьми паролей. Это значит что только восемь пользователей с разными паролями могут иметь доступ к устройству.
  • LUKS не рекомендуется для приложений, требующих шифрование на уровне файлов.

Источник

Используем Secure Boot в Linux на всю катушку

Технология Secure Boot нацелена на предотвращение исполнения недоверенного кода при загрузке операционной системы, то есть защиту от буткитов и атак типа Evil Maid. Устройства с Secure Boot содержат в энергонезависимой памяти базу данных открытых ключей, которыми проверяются подписи загружаемых UEFI-приложений вроде загрузчиков ОС и драйверов. Приложения, подписанные доверенным ключом и с правильной контрольной суммой, допускаются к загрузке, остальные блокируются.

Более подробно о Secure Boot можно узнать из цикла статей от CodeRush.

Чтобы Secure Boot обеспечивал безопасность, подписываемые приложения должны соблюдать некоторый «кодекс чести»: не иметь в себе лазеек для неограниченного доступа к системе и параметрам Secure Boot, а также требовать того же от загружаемых ими приложений. Если подписанное приложение предоставляет возможность недобросовестного использования напрямую или путём загрузки других приложений, оно становится угрозой безопасности всех пользователей, доверяющих этому приложению. Такую угрозу представляют загрузчик shim, подписываемый Microsoft, и загружаемый им GRUB.

Чтобы от этого защититься, мы установим Ubuntu с шифрованием всего диска на базе LUKS и LVM, защитим initramfs от изменений, объединив его с ядром в одно UEFI-приложение, и подпишем его собственными ключами.

Ограничения решений «из коробки»

Ubuntu, как и другие распространённые дистрибутивы, предлагает опцию шифрования всего диска с LVM во время установки. Дистрибутив в такой конфигурации без ошибок устанавливается на UEFI с активным Secure Boot.

Но Canonical в первую очередь заинтересована в работоспособности ОС на устройствах с включённым Secure Boot, а не в обеспечении безопасности за счёт него. Если вы хотите использовать Secure Boot как средство безопасности, то вы сами по себе.

Как Ubuntu реализует загрузку в Secure Boot с шифрованием всего диска и что с этим не так?

Red Hat разработали загрузчик shim, чтобы он работал на всех устройствах и служил на благо человечеству, соблюдая строгие предписания стандарта Secure Boot и загружая только доверенные UEFI-приложения. Canonical использует shim как прокси, встраивая в него свой публичный ключ и подписывая у Microsoft. Shim загружает GRUB, подписанный ключём Canonical, который затем загружает ядро, подписанное Canonical.

Начнём с того, что шифруется не весь диск — /boot остаётся незашифрованным, а значит и initramfs в нём. Доступ к initramfs означает root-доступ. Fail.

/boot остаётся незашифрованным, потому что устанавливаемый по умолчанию GRUB не может расшифровать диск без криптографических модулей. Которые почему-то не встроили в подписанный GRUB. GRUB’у запрещено загружать дополнительные модули в Secure Boot. Double Fail 1 .

GRUB должен верифицировать загружаемые ядра и отвергать неверно подписанные. Он этого не делает. Triple Fail.

GRUB загружает свои настройки из файла и по умолчанию предоставляет доступ к консоли. Подлинность конфигурационного файла не проверяется, с помощью его модификации или через консоль можно сделать что угодно: загрузить UEFI Shell, другое ядро, initramfs или передать аргументы ядру и получить root-доступ. Fatal Error 2 .

Что это всё означает?

Если в вашей системе есть ключ Microsoft 3 , то кто угодно может загрузиться с внешнего устройства, установить буткит и получить полный контроль над вашим устройством. Нет небходимости отключать Secure Boot: он уже не работает.

Согласно политике Microsoft о подписывании UEFI-приложений, все подписанные загрузчики GRUB и shim, используемые для загрузки GRUB, уже должны быть занесены в чёрный список.

Говорите , нужно просто отключить загрузку с внешних устройств? Это борьба с симптомами. Если у вас установлен незащищённый GRUB, то вас это не спасёт. Если на вашем устройстве стоит Windows, то вы можете выбрать из неё устройство для загрузки, и есть вероятность, что ваша прошивка это позволит 4 . Ещё остаётся PXE Network Boot. Поможет только пароль на включение устройства.

Вывод

Необходимо отказаться от чужих ключей. Пользователь должен контролировать Secure Boot. Загрузчик должен быть подписан пользователем, все незашифрованные и доступные для записи элементы в загрузке системы должны верифицироваться. Пользовательские данные должны быть зашифрованы. Чего мы и попытаемся добиться.

Установка Ubuntu с шифрованием всего диска с помощью LUKS и LVM

LUKS — Linux Unified Key Setup — обёртка для криптографической системы dm-crypt, позволяющая создавать виртуальные зашифрованные устройства в файлах и на физических дисках. С помощью LUKS можно зашифровать данные на всём диске для того, чтобы перед загрузкой ОС требовалось ввести пароль.

LVM — Logical Volume Manager — менеджер логических томов, с помощью которого мы разделим криптоконтейнер на тома. Тома LVM автоматически монтируются после ввода пароля к криптоконтейнеру, отдельный ввод пароля для каждого тома не требуется.

Следующие инструкции должны быть применимы к любому дистрибутиву на базе Ubuntu, для других потребуются коррективы. Сперва загрузитесь с Live CD или установочного образа в режиме Try before installing.

Разметка и шифрование

Чтобы загружаться с диска в режиме UEFI, он должен быть размечен в формате GPT. Разметку диска рассмотрим с помощью KDE Partition Manager и GParted. Если у вас их нет, установите один, соответствующий вашей среде.

Запустите редактор разделов и выберите интересующий вас диск, обычно это первый в системе — /dev/sda. Посмотрите свойства диска.

В строке Partition table указана используемая таблица разделов. Если диск размечен в формате dos/msdos (MBR), то его необходимо преобразовать в GPT. Это возможно сделать без потери данных, но здесь я этого описывать не буду, поищите инструкции в интернете. Если на диске нет важных данных и вы хотите форматировать его в GPT, создайте новую таблицу.

На диске должен быть как минимум один раздел ESP (EFI System Partition), в котором будут храниться загрузчики. Если на этом диске установлена ОС в режиме UEFI, то один такой раздел уже есть. В любом случае я рекомендую создать новый размером не меньше 100 МБ. ESP должен быть отформатирован в один из FAT-форматов, предпочтительно в FAT32, а также помечен как загрузочный.

Читайте также:  Kyocera 2030dn сканер windows 10

Дальше нужно создать раздел для шифрования. Тем же образом, что и ESP, только без форматирования (unformatted), выставления флагов и размером побольше — так, чтобы вместил систему и раздел подкачки. Создадим в этом разделе криптоконтейнер LUKS через терминал, предварительно перейдя в режим суперпользователя.

Отформатируем раздел с указанием современных алгоритмов шифрования и хеширования. В режиме XTS длину ключа необходимо указывать в два раза больше, поэтому для AES-256 нужно указать ключ длиной 512 бит. Параметр —iter-time задаёт время в миллисекундах, затрачиваемое на генерацию ключа из вводимого пароля функцией PBKDF2. Большее количество итераций усложняет перебор пароля, но и увеличивает время ожидания после ввода верного пароля.

Подтвердите форматирование, написав YES, введите пароль. Теперь откройте криптоконтейнер (sda2_crypt — имя для маппинга) и введите тот же пароль.

Контейнер должен стать доступным как блочное устройство /dev/mapper/sda2_crypt. Перейдём к разметке логических томов внутри криптоконтейнера. Инициализируем физический раздел LVM поверх /dev/mapper/sda2_crypt.

Внутри этого физического раздела создадим группу томов с именем ubuntu.

Теперь мы можем создавать логические тома внутри этой группы. Первым делом создадим том для раздела подкачки и инициализируем его. Рекомендуемый размер — от sqrt(RAM) до 2xRAM в гигабайтах.

Добавим том для корня и создадим в нём файловую систему ext4. Хорошей практикой считается оставлять свободное место и расширять тома по мере необходимости, поэтому выделим для корня 20 ГБ. По желанию в свободном месте можно будет разметить дополнительные тома для home, usr, var и так далее. Выделить всё свободное место для тома можно с помощью параметра -l 100%FREE .

С разметкой закончено, можно перейти к установке.

Установка

Так как мы планируем создать загрузчик самостоятельно, да и установщик Ubuntu не поддерживает шифрование /boot, запустим установку без создания загрузчика.

На этапе разметки диска выберите Вручную.

Здесь нам необходимо указать точки монтирования. Выберите /dev/mapper/ubuntu-root, укажите использование в качестве журналируемой файловой системы Ext4, точку монтирования (Mount Point) в /, без форматирования. Ubiquity сама подхватит /dev/mapper/ubuntu-swap как раздел подкачки и запомнит один из системных разделов EFI. Экран разметки должен выглядеть так:

Закончите установку и не перезагружайтесь.

Настройка crypttab, fstab и resume

Смонтируйте корень установленной системы в /mnt, свяжите /dev, /sys и /proc с /mnt/dev, /mnt/sys и /mnt/proc соответственно, а также /etc/resolv.conf с /mnt/etc/resolv.conf, чтобы у вас был доступ к сети. Теперь смените корневой каталог с помощью chroot .

Вам необходимо вручную заполнить /etc/crypttab — файл, описывающий монтируемые при загрузке криптоконтейнеры.

В него нужно добавить запись о /dev/sda2, монтируемом в /dev/mapper/sda2_crypt. Настроим монтирование по UUID, а не по имени устройства. Чтобы узнать UUID /dev/sda2, откройте другой терминал и воспользуйтесь командой:

В строке, начинающейся с /dev/sda2, будет записан его UUID. Скопируйте его (Ctrl+Shift+C). В /etc/crypttab добавьте запись вида имя_маппинга UUID= none luks, вставив UUID (Ctrl+Shift+V). Закройте nano , нажав Ctrl+X и Y, подтвердив сохранение.

Проверьте, чтобы в /etc/fstab были правильно описаны монтируемые разделы, а в /etc/initramfs-tools/conf.d/resume указан раздел для пробуждения из гибернации.

После всех изменений обновите образ initramfs.

Не выходите из системы и chroot ,

Создание загрузчика

Ядро Linux поддерживает загрузку напрямую из UEFI, если оно было скомпилировано с параметром CONFIG_EFI_STUB. В таком случае initramfs обычно хранится рядом в ESP, и путь к нему передаётся в аргументах к ядру.

Однако отсутствие верификации initramfs позволяет встроить в него вредоносный код, имея доступ на запись в ESP. Teddy Reed предлагает компилировать ядро, встраивая в него initramfs.

Процесс компиляции ядра достаточно длительный, её придётся производить после каждого изменения initramfs. К счастью, есть другой способ. В пакете systemd (ранее в gummiboot ) находится linuxx64.efi.stub — заготовка UEFI-приложения, в которую можно встроить ядро, initramfs и аргументы, передаваемые ядру. Подписав это UEFI-приложение, мы защитим ядро и initramfs от изменений.

Для данной операции потребуется пакет binutils .

Запишем в /tmp/cmdline аргументы, которые будут передаваться ядру.

В /boot хранятся образы ядра (vmlinuz-*-generic) и initramfs (initrd.img-*-generic). Определите последнюю версию и встройте их в заготовку.

Полученное UEFI-приложение ubuntu.efi необходимо расположить в ESP в каталоге EFI/BOOT/. Установщик Ubuntu должен был определить ESP и настроить монтирование в /boot/efi. Если в этом ESP нет других загрузчиков, то ubuntu.efi можно скопировать в /boot/efi/EFI/BOOT/BOOTX64.EFI, тогда он будет загружаться при выборе этого раздела в меню загрузки UEFI.

Если в ESP уже записан загрузчик BOOTX64.EFI, то можно создать ещё один ESP, либо записать ubuntu.efi под другим именем и добавить соответствующую загрузочную запись через встроенную в вашу прошивку консоль UEFI (UEFI Shell). Использование efibootmgr не рекомендовано 5 .

UPD: Если в вашу прошивку не встроен UEFI Shell, то скачать его можно отсюда. Положите его в EFI/BOOT/BOOTX64.EFI любого ESP и загружайтесь с отключённым Secure Boot. Чтобы добавить загрузочную запись, введите команду:

Спасибо Prototik за ссылку на UEFI Shell. Список остальных команд можно найти здесь.

Если у вас включён Secure Boot, то загрузиться с ubuntu.efi не получится, так как он не подписан. Временно отключите Secure Boot и загрузитесь, либо продолжите из chroot.

Настройка Secure Boot

Генерацию ключей, их установку в прошивку и подписывание UEFI-приложений описал CodeRush здесь, поэтому я буду считать, что вы всё понимаете и умеете.

Остаётся только подписать созданный нами загрузчик.

Поместите BOOTX64.EFI в каталог EFI/BOOT/ раздела EFI, с которого вы планируете загружаться.

Автоматизация

Чтобы загрузчик автоматически обновлялся и подписывался при обновлении initramfs, создайте скрипт update-efi-loader в /etc/initramfs/post-update.d/, изменив пути где требуется.

Дайте скрипту право на исполнение.

При обновлении ядра придётся произвести эту операцию вручную.

Подписывание драйверов и модулей ядра

Если вам нужно установить сторонние или собственные драйвера и модули ядра, их необходимо подписать. Для подписи модулей ядра требуются сертификат в формате DER и ключ без пароля, то есть сгенерированный с параметром -nodes .

Для подписывания используется скрипт sign-file .

Чтобы добавить этот сертификат в прошивку, его необходимо преобразовать в формат PEM, затем в ESL и подписать ключом KEK.

Очевидные советы

Если вашей задачей стоит защита данных на устройстве, то Secure Boot выполнит свою работу и не больше. Остальное возлагается на вас.

Не добавляйте чужих ключей в прошивку. Даже от Microsoft. В первую очередь от Microsoft.

Не подписывайте UEFI Shell, KeyTool или другие приложения, имеющие доступ к записи в NVRAM. Используйте их в Setup Mode.

Не оставляйте устройство включённым без присмотра. Устройство в ждущем режиме (suspend to RAM) содержит в RAM расшифрованные данные и мастер-ключи от криптоконтейнеров.

Установите пароль на UEFI Setup не проще, чем от вашего криптоконтейнера.

При физическом доступе к внутренностям устройства можно отключить Secure Boot, сбросив память NVRAM или повредив её, а также оставить хардварную закладку. Такая атака успешна только тогда, когда она незаметна. Сделайте так, чтобы вы о ней могли узнать: заклейте винты на корпусе трудновоспроизводимыми стикерами, обмажьте их лаком с блёстками. Опечатайте своё устройство.

Поставьте первым в списке загрузки неподписанное приложение. Если вы однажды не увидите сообщение от Secure Boot, то ваше устройство однозначно скомпрометировано.

Надёжнее отключённого от интернета устройства, хранимого в сейфе, всё равно ничего не придумаешь. Уязвимости в реализации Secure Boot в конкретных прошивках не исключены.

Бонус: возвращение гибернации

При шифровании всего диска вместо ждущего режима для сохранения состояния и продолжения работы с места остановки обычно используется гибернация, она же спящий режим или suspend to disk.

Из соображений безопасности разработчики ядра отключили возможность гибернации при включённом верифицировании модулей ядра. Аргументируется это тем, что образ восстановления не верифицируется при пробуждении, раздел подкачки может быть подменён и тогда система проснётся с непроверенным и потенциально вредоносным кодом.

Читайте также:  Как подключить usb жесткий диск windows 10

Это верно в том случае, если initramfs не верифицируется и/или раздел подкачки не зашифрован. Однако независимо от использования гибернации при таких условиях initramfs может быть подменён, а чувствительные данные восстановлены из раздела подкачки. В нашей конфигурации initramfs верифицируется, будучи включённым в подписанный загрузочный файл, а раздел подкачки зашифрован. Значит, данное ограничение для нас бессмысленно.

Chung-Yi Lee ещё в 2013 предложил верифицировать образ восстановления, а в 2015 представил реализующий его идею патч. Но воз и ныне там. Поэтому предположим, что мы достаточно защищены с нашим шифрованием, и вернём нам гибернацию без верификации.

Способ 1. Отключить верификацию модулей ядра

Включённая верификация модулей ядра отключает гибернацию. По умолчанию верификация модулей ядра включается вместе с Secure Boot, однако она от Secure Boot не зависит. Её можно отключить, оставив только Secure Boot.

Большого ущерба безопасности это нанести не должно. Модули ядра устанавливаются из доверенного источника вместе с обновлением ядра и хранятся на зашифрованном диске и в верифицируемом initramfs. Сторонние драйвера устанавливаются вручную, и будут они подписаны нами или нет, значения не имеет, ведь мы им уже доверяем. SecureApt для ядра и TLS/HTTPS для сторонних драйверов должны защитить от MiTM, и тогда остаётся только root-доступ к расшифрованному диску. Но в таком случае у злоумышленника уже есть наши данные.

«Оставить заявку» на отключение верификации модулей можно с помощью mokutil , а подтвердит её загрузчик shim .

Введите пароль, который затем потребуется посимвольно подтвердить. Теперь нужно загрузиться через shim и выбрать в нём Change Secure Boot state (sic!). Поместите /usr/lib/shim.efi в EFI/BOOT/BOOTX64.EFI на одном из ESP или добавьте загрузочную запись через UEFI Shell. Предварительно отключите Secure Boot, после верните обратно.

UPD 12.01.17: Вместе с shim.efi необходимо сохранять рядом и MokManager. В последних версиях пакета shim.efi и MokManager располагаются в /usr/lib/shim/, shimx64.efi и mmx64.efi.signed соответственно. Нужно переименовать mmx64.efi.signed в mmx64.efi.

Сейчас Secure Boot и гибернация работают, UEFI-приложения верифицируются, но модули ядра нет.

В принципе, shim и mokutil больше не требуются, их можно удалить.

Способ 2. Использовать старую версию ядра

Патч, отключающий гибернацию, появился в версии Ubuntu-4.4.0-18.34. Ubuntu-4.4.0-17.33 должна быть от него свободна. Однако оставаться на старом ядре, игнорируя обновления безопасности, не лучший вариант.

Способ 3. Скомпилировать своё ядро

Если ваше время ничего не стоит, то вы можете скомпилировать своё ядро без этого ограничения. Гарантий, что после долгих мучений вы будете довольны результатом, нет. Но если вы этого очень хотите, хвала Линусу Торвальдсу и GPLv2, у вас есть на это право. Вы можете предварительно протестировать скомпилированное мною ядро, чтобы не тратить зря время.

Получение исходного кода

apt-get

Самый простой способ получить исходный код для ядра вашей версии — скачать его из репозитория.

В /etc/apt/sources.list должны присутствовать указатели на репозитории исходных кодов. Обычно там уже есть закомменти­рованные записи с deb-src. Раскомментируйте их для репозиториев xenial main и xenial-security main, либо добавьте сами, а затем обновите индекс apt.

Загрузите исходный код и перейдите в создавшуюся директорию.

Обратите внимание на то, чтобы apt скачивал актуальную версию исходного кода. Проверьте номер версии у файла .dsc.

Если вы хотите поддерживать ядро в актуальном состоянии и перекомпилировать его по мере выхода обновлений с сохранением своих изменений, выберите git. Первоначальная загрузка займёт продолжительное время.

Создайте локальную копию git-репозитория ядра текущего релиза Ubuntu и перейдите в создавшуюся директорию.

По умолчанию git указывает на ветку master, соответствующую версии последнего релиза. Переключиться на другую версию можно по тегу релиза этой версии. Чтобы перечислить все теги по заданной маске, используйте git tag -l .

Создайте ветку temp для тега, соответствующего вашей версии, и переключитесь на неё.

Настройка

Загрузите пакеты, требуемые для компиляции (build dependencies).

Убедитесь, что скриптам выставлено право на исполнение, запустите чистку.

Скопируйте старый файл конфигурации в текущую директорию, запустите конфигурацию, выберите Load и загрузите config. Больше изменять ничего не требуется, выйдите и сохраните конфигурацию — Exit → Yes.

Измените файл kernel/power/hibernate.c, убрав проверку secure_modules().

Подготовьте файл к коммиту.

Если вы ещё не совершали коммитов и не вводили свои данные, сделайте это сейчас.

Сделайте коммит, введите комментарий.

Теперь ваши изменения сохранены в новом снимке состояния (snapshot). Если вы захотите обновиться до следующей версии и применить к ней те же самые изменения, используйте git rebase

Скрипты компиляции определяют версию ядра по последней записи в истории изменений (changelog) в директории debian.master. Добавьте новую запись, чтобы изменить версию.

К версии будет добавлен суффикс custom1, что отразится при сборке пакетов .deb и позволит установить их при уже установленных пакетах той же версии без суффикса. Однако этот суффикс распространяется только на имя пакета, но не на его содержимое: ядро и директория с его модулями будут иметь ту же версию 4.4.0-34-generic, и при установке старые файлы перезапишутся новыми. Чтобы этого избежать, измените версию ABI c 34 на, например, 3400.

Компиляция

Запустите чистку ещё раз и скомпилируйте ядро. Если вы не опытный разработчик ядра и не понимаете, как работают проверки ABI и модулей (я вот не понимаю), отключите их (skipabi=true, skipmodule=true), иначе ваша компиляция сломается на одном из последних этапов. Здесь используется многопоточная сборка пакетов с количеством потоков, равным количеству ядер процессора. Цель binary-generic означает компиляцию обычной разновидности ядра, архитектура определяется автоматически.

Если компиляция прошла успешно, то в вашей домашней директории появятся три пакета .deb. Необходимо установить linux-image- .deb, а также желательно linux-image-extra- .deb. Это можно сделать с помощью dpkg -i или через QApt, открыв пакет в файловом менеджере, если он это поддерживает. Будьте осторожны: если вы не изменяли версию ABI, то старое ядро и модули перезапишутся.

Снова соберите загрузочный файл.

Гибернация работает, но нестабильно. Как, впрочем, и без Secure Boot.

Способ 4. Отказ от гибернации и использование виртуализации

Если гибернация и работает, то это не делает её надёжным средством сохранения состояния. Это может быть проблемой моего железа, дистрибутива или, что более вероятно, KDE Plasma, но у меня Kubuntu просыпается через раз.

По уже описанной технологии в качестве хостовой ОС можно установить подходящий дистрибутив Linux, а гостевой — предпочитаемую для работы. При завершении работы автоматически останавливать виртуальную машину с сохранением состояния, а затем отключать устройство. При включении же восстанавливать состояние. Если ваше устройство поддерживает аппаратную виртуализацию, то для этого подойдёт Qemu KVM . Но это уже тема для отдельной статьи.

С большей надёжностью придёт и большая защищённость: чувствительные данные можно изолировать от опасной среды. Браузер и песочница для установки стороннних пакетов в одной виртуальной машине, важные персональные данные — в другой. Украсть мастер-ключ от зашифрованного диска в памяти хостовой ОС из гостевой гораздо сложнее. Кажется, для подобного существует Qubes OS. Но она данный момент не поддерживает Secure Boot. Fail.

На этом всё, приветствуются любые дополнения и замечания.

Примечания

↑ Решаемо путём сборки образа GRUB с нужными модулями с помощью grub-mkstandalone , но его придётся подписывать самому.

↑ Теоретически можно исправить, установив пароль, встроив grub.cfg в образ GRUB с помощью grub-mkstandalone и установив в grub.cfg prefix на невалидный путь, чтобы GRUB не мог найти второй grub.cfg на диске. Но опять же требуется подписывать образ самостоятельно.

↑ А он есть у всех кроме параноиков оправданно озабоченных своей безопасностью пользователей.

↑ У меня загрузиться с USB не даёт. Windows 8 и 10 также без пароля не пускают в безопасный режим или консоль.

↑ Говорят, некоторые прошивки он окирпичивает. Безопаснее создать по ESP на каждый загрузчик.

Источник

Оцените статью