id: Гость   вход   регистрация
текущее время 10:17 28/03/2024
Автор темы: Гость, тема открыта 01/04/2015 13:22 Печать
Категории: криптография, софт, приватность, симметричное шифрование, отрицаемое шифрование, свободный софт
http://www.pgpru.com/Форум/ПрактическаяБезопасность/ШифрованиеОтдельныхФайловСПомощьюCryptsetupLUKS
создать
просмотр
ссылки

Шифрование отдельных файлов с помощью cryptsetup/LUKS



Разобрался, как шифровать отдельные файлы с помощью openssl:



(Если есть ошибки, прошу указать.)


Просьба подсказать, как подобное осущеcтвить с помощью cryptsetup или LUKS. Интересует не столько бессигнатурность, сколько простота действий. Конкретно, хотелось бы шифровать по паролю без использования асимметрики. Многократное чтение man cryptsetup и гугление, в том числе на pgpru.com, не помогли.


 
На страницу: 1, 2, 3 След.
Комментарии
— Гость (12/05/2015 17:33, исправлен 16/05/2015 20:31)   <#>

offset эквивалентен dmsetup linear. Это можно проверить экспериментально:

# cryptsetup <опции> -o оффсет create zz /dev/sda
равносилен
# dmsetup create yy --table '0 размер linear /dev/sda оффсет'
# cryptsetup <опции> create zz /dev/mapper/yy
При задании только --offset IV отсчитывается, как если бы начальный сектор криптораздела был нулевым (это следует из аналогии с dmsetup linear). То есть, можно потом перенести криптораздел на любой другой оффсет, и при задании правильной опции --offset IV будет тем же.


--skip, как я понял, нужен при создании «частичных» крипторазделов. Допустим, нужно адресовать часть криптораздела, отступив от его начала на 8 секторов. Пусть сам криптораздел расположен по оффсету S. Если сделаем --offset S+8, у нас будет неправильный IV, поэтому надо делать --offset S+8 --skip 8. Т.е.

# сryptsetup <опции> --offset S --skip P create zz /dev/sda
равносилен
# dmsetup create yy --table '0 размер linear /dev/sda S-P'
# cryptsetup <опции> create xx /dev/mapper/yy
# dmsetup create zz --table '0 размер linear /dev/mapper/xx P'
за исключением того, что промежуточные устройства реально не создаются (проверено экспериментально). Т.е. делаем отступ S-P на исходном девайсе (/dev/sda), потом открываем полученное устройство (xx), а потом на открытом устройстве делаем сдвиг ещё на P, отображая это в девайс zz.


Таким образом, в plain mode не указывать --skip равносильно указанию --skip 0. Можно указывать, если есть сомнения. Задание опции --offset никак не влияет на IV.


UPD: Когда мы skip не задаём (P=0), IV равен «исходному» для сектора S. Смысл указания skip в том, что мы читаем те же самые сектора, что и без skip (это самое нетривиальное!), но с другим IV. Следовательно, нужно сначала сместиться на P секторов «назад» относительно оффсета, образовать криптомаппинг с «исходным» IV, а затем сместиться вперед на те же P секторов. Отсюда сначала S-P, затем P. В итоге получается, что при указании --offset S --skip P криптомаппинг охватывает сектора начиная с S (!), однако, IV устроен так, как будто мы «пропустили» с начала P секторов (отсюда и название «skip»).

— Гость (13/05/2015 18:50)   <#>

Спасибо за исследование.
— Гость (13/05/2015 19:21, исправлен 16/05/2015 20:34)   <#>

Пожалуйста. Если соотнести эти факты с тем, что unknown писал на предыдущих двух страницах, вырисовывается примерно такая картина:


  1. IV для первого сектора всегда нулевой, это нормально, и так должно быть.
  2. IV для последующих секторов вычисляется из IV (и данных?) предыдущих секторов по некоторому правилу.
  3. В plain mode cryptsetup по умолчанию каждый раз думает, что первый сектор открываемого/расшифровываемого устройства есть первый сектор всего имеющегося зашифрованного устройства, поэтому ставит ему IV=0. В общем-то, по умолчанию почти всегда так и есть, и это правильное поведение (см. пункт 1).
  4. В случае частичного расшифрования уже шифрованного устройства, когда от его начала надо отступить несколько секторов, нужно использовать иной IV, ненулевой (тут не в безопасности проблема, а в том, что иначе расшифруете содержимое диска неправильно). Указание skip (числа пропускаемых секторов от начала шифрованного устройства) даёт возможность cryptsetup'у правильно вычислить IV для первого расшифровываемого сектора (он не первый на устройства, но первый расшифровываемый), а, следовательно (см. пункт 2), и для всех последующих.

Всё это выглядит так, что IV, в любом случае, вычисляется автоматически по заданным правилам, а опция skip лишь корректирует параметры. Судя по man cryptsetup, сам юзер непосредственно вмешаться в выбор IV (к примеру, задать руками) не может вообще (опция skip — это как выбор значения счётчика для заранее предпопределённого правила вычисления IV).


UPD: Когда --skip не указывается, он по умолчанию равен нулю для plain mode. Да, при этом IV получается, как если бы не было никакого оффсета (это легко проверяется экспериментом с dmsetup linear). Вообще, есть некий базовый режим cryptsetup plain, а offset и skip на него накладываются линейными сдвигами до и после. Опция --skip не меняет адресацию секторов, а исключительно расчет IV. Поэтому в LUKS его вообще нет, о чем ман и говорит нам:


This option is only relevant with plain or loop-aes device types.
— pgprubot (06/10/2015 13:35, исправлен 06/10/2015 13:39)   профиль/связь   <#>
комментариев: 511   документов: 2   редакций: 70

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

.
          S
|<----------------->|
 
                   Та часть криптораздела,
                  которую мы хотим отмаппить
                        (расшифровать)
                      ________/\______
|                    /                \           |
|-------------------------------------------------|
|           \______________  _______________/     |
                           \/ 
               Бессигнатурный криптораздел
                      на /dev/sda
 
           |<------>|
                P
 
 \______________________  _______________________/
                        \/
          Всё блочное устройство /dev/sda
И S и P — оффсеты, но S — оффсет расшифровываемого места относительно исходного блочного устройства, а P — относительно начала бессигнатурного раздела на нём. Из этой картинки видно, что, например, если нужно просто зашифровать часть блочного устройства типа /dev/sda с оффсетом, то P можно смело полагать нулю. Точно так же становится понятно, почему по умолчанию (адресация всего пространства) P и S равны нулю. Оффсет P удобен при ручной организации структуры типа LVM, если кому-то вдруг захочется такое сделать.

— pgprubot (07/10/2015 12:22, исправлен 07/10/2015 12:54)   профиль/связь   <#>
комментариев: 511   документов: 2   редакций: 70

LUKS — это просто чёрный ящик, на входе которого пассфраза, а на выходе — мастер-ключ. Ничего более в нём нет. Метод, как шифровать блочное устройство, определяется задаваемым шифром и режимом, а откуда взялся мастер-ключ — вывели с LUKS'а, задали вручную или получили в plain mode — не играет никакой роли. По крайней мере, на самом шифртексте это не скажется никак. Показываю PoC — подключение LUKS-тома в plain mode:


Создание LUKS-тома


  1. Форматируем устройство под LUKS:
    # cryptsetup -q -c aes-xts-plain64 -s 512 -h sha512 luksFormat /dev/VG_name/LV_name
    Enter passphrase:
    Ставим паролем qwerty.

  1. Открываем устройство и нарезаем внутри ФС:
    # cryptsetup luksOpen /dev/VG_name/LV_name LV_name_crypt
    Enter passphrase for /dev/VG_name/LV_name:
    # mkfs.ext4 /dev/mapper/LV_name_crypt
  2. Дампим мастер-ключ LUKS'а в файл и закрываем LUKS-устройство:
    # cryptsetup -q --dump-master-key luksDump /dev/VG_name/LV_name > /tmp/luks_dump.txt
    Enter passphrase: 
    # cat /tmp/luks_dump.txt 
    LUKS header information for /dev/VG_name/LV_name
    Cipher name:    aes
    Cipher mode:    xts-plain64
    Payload offset: 4096
    UUID:           xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    MK bits:        512
    MK dump:        8f 39 52 7b af 9f 08 68 aa ea 1f b0 9e 3e 27 a2 
                    d8 60 89 5a f0 69 75 92 88 98 4e 9c 0c 74 b9 89 
                    5a c9 87 6e ed 84 37 52 d9 51 14 d4 d8 ba 0c 2e 
                    4c 0c ab dd 2b 18 44 0b c7 8c a8 23 3e b9 6f ab
    # cryptsetup luksClose LV_name_crypt

Подключение LUKS-тома в plain mode


  1. Отредактируем /tmp/luks_dump.txt так, чтоб там был только мастер-ключ в следующем формате:
    # cat /tmp/luks_dump.txt 
    8f 39 52 7b af 9f 08 68 aa ea 1f b0 9e 3e 27 a2
    d8 60 89 5a f0 69 75 92 88 98 4e 9c 0c 74 b9 89
    5a c9 87 6e ed 84 37 52 d9 51 14 d4 d8 ba 0c 2e
    4c 0c ab dd 2b 18 44 0b c7 8c a8 23 3e b9 6f ab
  2. Восстновим бинарный мастер ключ по его hex-дампу и проверим результат:
    # cat /tmp/luks_dump.txt |xxd -r -p > /tmp/master_key
    # cat master_key |hexdump -Cv
    00000000  8f 39 52 7b af 9f 08 68  aa ea 1f b0 9e 3e 27 a2  |.9R{...h.....>'.|
    00000010  d8 60 89 5a f0 69 75 92  88 98 4e 9c 0c 74 b9 89  |.`.Z.iu...N..t..|
    00000020  5a c9 87 6e ed 84 37 52  d9 51 14 d4 d8 ba 0c 2e  |Z..n..7R.Q......|
    00000030  4c 0c ab dd 2b 18 44 0b  c7 8c a8 23 3e b9 6f ab  |L...+.D....#>.o.|
    00000040
    Результат, как видим, правильный.

  1. Подключим LUKS-том с помощью бинарного мастер-ключа, указав тот же режим шифрования и размер ключа и не забыв сделать отступ на LUKS-томе, чтобы убрать LUKS-заголовок:
    # cryptsetup -c aes-xts-plain64 -s 512 -d /tmp/master_key \
      -o 4096 plainOpen /dev/VG_name/LV_name LV_name_crypt
  2. Наступает момент истины:
    # mount /dev/mapper/LV_name_crypt /media/mnt
    Вуаля, всё работает, что и требовалось доказать. Понятно, что аналогичным образом можно выборочно расшифровать и любую часть этого LUKS-тома, указав нужный размер -b и оффсеты (-o и -p).

Мораль:


Если где-то в plain mode (а также с оффсетами и режимами) и есть проблемы с шифрованием, то они же есть и в LUKS'е. Нужно отделять мух от котлет: шифрование — только то, что задаётся опцией aes-xts-plain64, всё остальное — метод получения мастер-ключа, он может быть каким угодно. В этом смысле plain mode ничем не более рыжий, чем LUKS. Другое дело, что в plain mode вопрос безопасного хранения мастер-ключа и выбор стойкой пассфразы — полностью ответственность пользователя (в этом действительно легко напартачить, ничего не заметив).
На страницу: 1, 2, 3 След.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3