Linux Unified Key Setup: как защитить флэшки и внешние диски от взлома

Автор оригинала: Seth Kenlon
  • Перевод
  • Tutorial


Посмотрим, как с помощью системы на базе спецификации Linux Unified Key Setup (LUKS) и утилиты Cryptsetup можно зашифровать флэш-накопители, внешние жёсткие диски и прочие переносные устройства, хранящие дорогую вашему сердцу информацию.

Чаще всего, пользователи рассуждают достаточно просто: накопители в безопасности, пока их никто не украл. Некоторые идут в размышлениях дальше: если для входа в систему нужно знать пароль — злоумышленнику будет сложно получить доступ к данным на украденном диске. Успокаиваясь на этой мысли, они забывают задать себе важный вопрос: к чему именно мешает получить доступ их пароль на самом деле?

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

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

Если время сильно ограничено, злодеи действительно могут украсть накопитель и взять работу на дом. Особенно легко это им удаётся, если он внешний и подключён через USB. В этой статье речь пойдёт о простом инструменте, позволяющем защитить от несанкционированного доступа данные на внешних накопителях. Даже если они уже попали в руки к злоумышленникам. Речь пойдёт о шифровании дисков в операционных системах семейства Linux.

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

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

Шифрование на этапе инсталляции


Проще всего выполнить полное шифрование диска, выбрав соответствующую опцию в процессе установки операционной системы. Большинство современных Linux-дистрибутивов позволяют это сделать. Здесь не буду расписывать в деталях, так как статья посвящена шифрованию внешних накопителей (далее я подробно буду рассматривать именно его).


Изображение: Seth Kenlon, CC BY-SA 4.0

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

Шифрование внешних накопителей


Внешние накопители созданы для того, чтобы их подключали к разным устройствам, быстро обмениваясь информацией, таскали с собой по работе и иногда… теряли. Я находил случайно оставленные диски в USB-портах компьютеров в вестибюле отелей, в принтерах бизнес-центров, диски, потерянные в учебных аудиториях и ​​даже в прачечной. Вряд ли их владельцы хотели бы, чтобы кто-то нашёл эти накопители и добрался до рабочих документов или личных архивов.

LUKS вместе с утилитой Cryptsetup позволяет шифровать внешние накопители почти так же просто, как и при инсталляции ОС.

Как это сделать с помощью LUKS


ВАЖНО: внешний накопитель должен быть либо пустым, либо содержать ненужные вам данные. Так что, если оба этих условия не выполнены, нулевым шагом должен стать бэкап.

1. Подключите и найдите свой внешний диск


Я для примера взял небольшую флэшку. Представим, что путь к ней выглядит как /dev/sdX. Утилита lsblk покажет мне вот такую информацию о блочных устройствах:

$ lsblk

sda    8:0    0 111.8G  0 disk

sda1   8:1    0 111.8G  0 part /

sdb    8:112  1  57.6G  0 disk

sdb1   8:113  1  57.6G  0 part /mydrive

sdX    8:128  1   1.8G  0 disk

sdX1   8:129  1   1.8G  0 part

Всё правильно, моя флэшка обнаружена. Да, это именно она. Я точно знаю, что её размер 1.8Gb. В списке всего один диск (disk) с таким размером (ему соответствует один раздел part).
Я уделяю такое внимание этой, казалось бы, мелочи, так как дисков может быть много. И в случае ошибки на следующем шаге вы сотрёте с другого диска данные, которые вам всё ещё нужны.

2. Очистите диск


На этом шаге я обнуляю таблицу разделов диска:

$ sudo dd if=/dev/zero of=/dev/sdX count=4096

Это, конечно, необязательно, но я люблю это состояние чистого листа.

3. Отформатируйте диск под LUKS


Используем для этого утилиту Cryptsetup. Её подкоманда luksFormat запускает первый этап создания зашифрованного раздела LUKS (позже мы создадим там файловую систему).
После этого появится предупреждение об удалении всех данных (которые могли всё ещё оставаться на диске). Кроме того, вас попросят придумать и ввести парольную фразу для диска.

$ sudo cryptsetup luksFormat /dev/sdX

WARNING!

========

This will overwrite data on /dev/sdX irrevocably.



Are you sure? (Type uppercase yes): YES

Enter passphrase:

Verify passphrase:

4. Откройте LUKS-том


Процесс создания зашифрованного раздела завершён. Теперь для продолжения работы с диском нужно вводить парольную фразу. Открыть произвольный LUKS-том (то есть, подключить виртуальное блочное устройство) можно с помощью подкоманды open.

$ cryptsetup open /dev/sdX vaultdrive

Я придумал фразу (а точнее, просто пароль в одно слово) «vaultdrive». У вас будет какой-то свой вариант. Чтобы посмотреть список открытых томов, нужно вывести содержимое каталога /dev/mapper:

$ ls /dev/mapper

control  vaultdrive

Чтобы закрыть LUKS-том vaultdrive нужно написать:

$ cryptsetup close vaultdrive

После этого он исчезнет из каталога /dev/mapper.

5. Создайте файловую систему


$ sudo mkfs.xfs -f -L myvault /dev/mapper/vaultdrive

Создайте файловую систему, чтобы иметь возможность хранить свои данные на диске. Я выбрал XFS, но это далеко не единственный вариант: можно использовать, например, ext4 или JFS. И многие другие.

Финал: монтирование LUKS-тома


Можно делать это через терминал. Например, мы хотим использовать для нашей цели директорию /mnt/hd

$ sudo cryptsetup open /dev/sdX vaultdrive

$ sudo mount /dev/mapper/vaultdrive /mnt/hd

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


Изображение: Seth Kenlon, CC BY-SA 4.0

P.S.


А какие инструменты для шифрования внешних дисков на Linux используете вы? Какие инструменты используете для аналогичных задач на macOS и Windows?



Недорогие VDS для любых задач. Используем новейшее железо, лучший дата-центр в Москве уровня надёжности TIER IV, бесплатно предоставляем защиту от DDoS-атак на любом тарифном плане, который можно создать самостоятельно в течение минуты.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Маклауд
Облачные серверы на базе AMD EPYC

Комментарии 20

    0
    Я выбрал XFS, но это далеко не единственный вариант

    и не самый лучший для флешки я бы сказал
    xfs проще поломать внезапным отключением чем какую нибудь банальную ext*, а вообще для флешек специально вроде была какая-то фс, f2fs или типо того

      0

      Насколько я знаю, F2FS (и например NILFS2) предназначены для тех флешек, где нет FTL и wear levelling'а. Для обычных флешек и SSD, которые корчат из себя блочное устройство, нужды в них нет. XFS вроде как может потерять данные (в файлах), но не метаданные (целостность файловой системы не нарушится), т.к. журналирует только метаданные. Можно взять например BTRFS, где обеспечивается атомарность вообще всего, причём не журналом, а CoW, излишняя фрагментация при этом не роляет (т.к. речь про флешку или SSD). Бонусом будет упаковка записываемых данных на лету, что немного ускоряет чтения и записи на медленных устройствах.

        0

        Кстати да, compress=zstd на btrfs хорошо себя показал

      +1

      Проблема с шифроваными томами еще и в том, что вводя пароль в консоли его можно оставить в истории shell. Да, в рамках вектора атак и рисков для статьи это не важно, но стоит помнить об истории консоли, и, для bash, вводить команду с пробелом в начале строки (как пример).

        0

        Вообще, более правильно, в добавок к парольной аутентификации, добавить авторизацию по файлу ключа. Который держать на отдельной флешке.

          0

          Верное замечание, только оно налогает дополнительные требования на наличие дубликата ключа и его безопасное хранение.
          Я бы лучше рекомендовал посмотреть на вариант OTP в виде кодогенератора. Правда, я не помню точно есть ли такой функционал у LUKS без привязки к специфическим аппаратным токенам.

            0

            Судя по ману cryptsetup, из коробки он такого не умеет. Но есть вот такая фиговина.

              0
              Локальная авторизация на OTP бессмысленна, потому что существует возможность вернуться к предыдущему состоянию (например, изменив время, или сохранив снапшот со счетчиком)
                0

                Ок, вы можете изменить время и заснепшотить — как вы угадаете криптоключ если генерация идет через него? Ок, можно генерировать коды используя еще один код, который я должен вводить в приложение и плюсом я должен прочитать код, сгененрированый ОТП на машине. Т.е. мы имеем вопрос и поле для ответа, где ответ нужно сгенерировать с использованием вопроса и моего пароля...

                0
                OTP — это когда системы обмениваются признаком знания ключа
                а для расшифровывания нужен сам ключ, так такого функционала в LUKS нет и не предвидится
              0

              vaultdrive из команды в статье не пароль, а имя будущего блочного устройства (хотя пароль мог быть таким же)

                0
                вводя пароль в консоли его можно оставить в истории shell

                Ничего подобного. В тексте данной статьи действительно есть такие слова, сбивающие с толку:


                $ cryptsetup open /dev/sdX vaultdrive


                Я придумал фразу (а точнее, просто пароль в одно слово) «vaultdrive».

                Но в данном контексте "vaultdrive" — это не пароль (возможно автор статьи и использовал такой пароль, но это осталось за кадром). Это просто имя, которое будет задано для виртуального дешифрованного устройства в папке /dev/mapper/.
                Пароль будет запрошен во время выполнения программы и в историю bash не попадет.

                0
                Какие инструменты используете для аналогичных задач на macOS и Windows?
                На Windows — однозначно Veracrypt. Под Linux его тоже можно применять для файл-контейнеров или внешних дисков, только не для шифрования системы.
                  +1
                  Kingston Data Traveler 2000
                    0
                    На виндовс disckryptor.
                    Автор, почемы ты не расказываешь про процедуру расшифровки дисков?
                      0

                      Следует, наверное, указать, что на каждом компьютере, где пользователь захочет открыть свою флэшку, должен быть предустановлен lukscrypt. Ну, и что RARsetup.rar его не получится носить на самой флэшке :-)

                        0

                        Сдаётся мне, что LUKS есть в любом дистрибе линукса сейчас. Тем более что там часть это модуль ядра, другая часть утилита cryptsetup. Если кого-то из них нет на конкретной машине, надо просто поставить их из реп дистриба.

                        0
                        Если время сильно ограничено, злодеи действительно могут украсть накопитель и взять работу на дом. Особенно легко это им удаётся, если он внешний и подключён через USB.


                        Не особенно легко: внешний накопитель может быть заперт в сейф, а сейф м.б. на сигнализации. Сейфов м.б. 2 или больше, и нужно прежде угадать, какой ломать. Но LUKS, конечно, и при сейфах полезен.
                          0
                          Использую Veracrypt как надёжный кроссплатформенный инструмент. A LUKS использую для шифрования локального диска ПК.
                            0
                            После этого появится предупреждение об удалении всех данных (которые могли всё ещё оставаться на диске).

                            На самом деле luksFormat предыдущие данные не стирает. Она перезаписывает суперблок (где например хранятся ключи для шифрования секторов диска, которые при последущем luksOpen будут расшифрованы вашим паролём). Если диск ранее был под LUKS, то перезапись этих ключей конечно сделает всю инфу недоступной, т.к. она будет расшифровываться в рандом. Однако, если до luksFormat диск не был зашифрован, то за исключением суперблока вся остальная инфа на нём останется и лишь будет перезаписываться по мере записи на зашифрованный диск.


                            Чтобы такого не происходило, можно делать так: dd if=/dev/urandom of=/dev/sdX до luksFormat. /dev/zero тут использовать нежелательно, т.к. потом будет видно, куда зашифрованные данные на диск уже писались (рандомная каша), а куда нет (нули). Ещё можно сделать dd if=/dev/zero of=/dev/mapper/name на уже открытый шифрованный раздел, при шифровании нули превратятся в кашу (т.к. каждый сектор шифруется по-своему).

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое