⌨ Labor omnia vincit ☮

[factory] openSUSE 13.1 :: Encrypted File Systems

Posted in Linux Kernel, SuSE [ru] by anaumov on 22.07.2013

Криптография – наука о шифрах – очень глубокая, требующая изучения, тема, история которой насчитывает более четырех тысяч лет. Это один из основных инструментов, использующихся при защите информации. Спецслужбы бывшего Советского Союза, США, Франции и других стран вкладывали огромные средства в разработку криптостойких алгоритмов для своих информационных каналов, параллельно пытаясь вскрывать чужие. Сегодня этими технологиями мы пользуемся каждый день, даже не задумываясь об этом.
Причин зашифровать информацию может быть несколько. К примеру, у вас есть любого рода секретная информация, которая ни в коем случае не должна попасть к кому-то конкретно, а может вы просто хотите оградить свою личную жизнь от чужих глаз. Мы теряем нетбуки или флешки, а на них, как правило, конфиденциальная информаця. Просто поломка носителя это уже печально, но на много хуже, когда наша информация попадает в чужие руки. Можно лишь догадываться как будет использованна эта информация, и надеяться, что она не будет использованна нам во вред.
В этом посте я расскажу о методе шифрования файловых систем (ФС) в openSUSE 13.1-m3, которая собрана на основе последней на данный момент stable-версии ядра – 3.10.0.

LUKS & cryptsetup

Спектр реализаций, обеспечивающих шифрование данных для GNU/Linux, очень широк. Все они предназначенны для разных задач, поддерживают разные протоколы и стандарты. Для шифрования ФС в openSUSE используется LUKS (реализация шифрования блочного устройства через модуль ядра dm-crypt (CONFIG_DM_CRYPT)) в купе с утилитой cryptsetup, которая позволяет создавать виртуальное устройство, запрашивая парольную фразу (passphrase). Парольная фраза преобразуется в ключ, который не хранится на устройстве и используется для дешифровки.

> cat /etc/SuSE-release
openSUSE 13.1 Milestone 3 (i586)
VERSION = 13.1
CODENAME = Bottle

> rpm -q cryptsetup
cryptsetup-1.6.1-1.2.i586

# modinfo dm_crypt
filename:       /lib/modules/3.10.0-2.gc5ad3f9-desktop/kernel/drivers/md/dm-crypt.ko
license:        GPL
description:    device-mapper target for transparent encryption / decryption
author:         Christophe Saout 
srcversion:     74A4BECADF48FF808AE451F
depends:        dm-mod
intree:         Y
vermagic:       3.10.0-2.gc5ad3f9-desktop SMP preempt mod_unload modversions 686

Краткое описание технической части (спецификаций) можно найти в документе LUKS on-disk-specification.

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

Flash drive

Давайте начнем с чего-нибудь банального, с чем мы работаем каждый день. Например с USB флешки. Затем рассмотрим случай шифрования всей ФС во время установки ОС. Итак, пускай устройство называется /dev/sdb. Создаем:

# cryptsetup luksFormat /dev/sdb
WARNING!
========
This will overwrite data on /dev/sdb irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:

Тем самым мы создали LUKS-контенер:

# mount /dev/sdb /mnt/usb/
mount: unknown filesystem type 'crypto_LUKS'

Для дальнейшей работы с этим устройством нам понадобится cryptsetup. Именно через него (а конкретней – через модуль ядра dm-crypt) будет протекать информационный обмен. Работать с таким устройством может только root:

> /sbin/cryptsetup luksOpen /dev/sdb usb
WARNING!!! Possibly insecure memory. Are you root?
Cannot open device /dev/sdb for read-only access.

# cryptsetup luksOpen /dev/sdb usb
Enter passphrase for /dev/sdb:

# l /dev/mapper/usb
lrwxrwxrwx 1 root root 7 Jul 19 22:47 /dev/mapper/usb -> ../dm-0

Вомзможно вы работали с LVM, и сразу же узнали /dev/mapper/-устройство, тем не менее, к LVM это никакого отношения не имеет. Подсистема ядра, через которую работает dm-crypt, использует ту же инфраструктуру/интерфейс внутри ядра (тот же драйвер).
Форматируем наш LUKS-контенер:

# mkfs.ext4 /dev/mapper/usb
mke2fs 1.42.8 (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
244320 inodes, 976761 blocks
48838 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1002438656
30 block groups
32768 blocks per group, 32768 fragments per group
8144 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

И наконец подключаем/монтируем его:

# mount /dev/mapper/usb /mnt/usb/
# mount | grep mapper
/dev/mapper/usb on /mnt/usb type ext4 (rw,relatime,data=ordered)

Теперь мы можем работать с ней как и с обычной флешкой. Не забудьте только, что хоть после вызова umount мы и удалим точку монтирования, интерфейс /dev/mapper для этого устройства все же остается активным:

# umount /dev/mapper/usb
# mount | grep mapper
# ll /dev/mapper/usb 
lrwxrwxrwx 1 root root 7 Jul 22 00:00 /dev/mapper/usb -> ../dm-0
# dmsetup -v ls
usb     (253:0)
# dmsetup -v info
Name:              usb
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      253, 0
Number of targets: 1
UUID: CRYPT-LUKS1-4743a0a4c40c41b7a9c7a4dac878682e-usb
# cryptsetup luksClose usb
# dmsetup -v ls
No devices found

LVM

Теперь самое время поговорить об использовании LVM поверх LUKS для шифрования разделов во время установки openSUSE. Тут нас ждет один неисправленный bug, который может смутить новичка. Баг тянется из версии в версию уже на протяжении наверное 3х лет :) Это не крэш, это просто блокировка YaST’а на продолжение процесса установки. YaST так запрограммирован, что не позволяет шифровать ФС с точками монтирования /, /usr, /boot и /var (мы сейчас говорим о LVM). На самом деле, нельзя шифровать только /boot. В противном случае мы получим проблему “курицы и яйца”. Именно там находится образ ядра, на который передает управление GRUB, и к которому у нас должен быть доступ. Не имея доступа к образу ядра, а следовательно и к модулю dm-crypt, мы не сможем дешифровать остальную часть ФС…
Для этого придется прибегнуть к маленькому хаку: во время установки, после выбора раскладки клавиатуры и языка системы, перейти на другую консоль и создать вручную сначала зашифрованный LVM-контенер, а затем и пару томов внутри него.

Итак, при помощи fdisk создаем как минимум 2 раздела: обычный первичный раздел /boot размером где-то в пару сотен метров (его мы оставим незашифрованным), и второй раздел настолько большой, насколько хотите (другие ОС на том же диске?), на котором разместим наш LVM.
Кстати, те, кто решил зашифровать только /home, помните, что во-первых куски файлов могут быть вытянуты из swap, а во-вторых временные файлы полностью сохраняются в /tmp. Хотя, в случае использования tmpfs, это не столь критично, т.к. после перезагрузки все данные, содержащиеся в tmpfs, все равно будут удалены.

Итак, работаем с вторым разделом, создаем LUKS-контейнер:

# cryptsetup luksFormat /dev/sda2
# cryptsetup luksOpen /dev/sda2 root

После этого создаем логические тома внутри зашифрованного LUKS-конейнера. Естественно размеры будут у каждого свои, да и количество томов вы можете создать больше.

# pvcreate /dev/mapper/root
# vgcreate system /dev/mapper/root
# lvcreate -L 2G -n swap system
# lvcreate -L 100G -n root system

А вот тут, уважаемые мои читатели, самое время вспомнить, что работаем мы в тестовой milestone версии. ;)
Вторая команда у меня заканчивается со статусом (return code) 5. На часах без пяти четыре утра, понедельник. Это значит, что мы еще успеем отправить bugreport до начала рабочего дня и обрадовать ребят из QA :)
Проделываем на всякий случай весь процесс еще раз. Получилось воспроизвести еще раз? Да.
Подключаем флешку, монтируем и копируем туда вывод strace команды-виновницы:

# strace -o aaa vgcreate system /dev/mapper/root

Этот файл прикрепляем к только что созданному репорту. Кстати, это только у меня почти всегда после отправки репорта появляются идеи о том, что я не сообщил, или что сформулировал не очень чисто? :)

Итог

Параметры доступных алгоритмов и методов шифрования и хеширования можно посмотреть в /proc/crypto. Это очень криптостойкие алгоритмы!
Да, пока получается (для пользователей openSUSE), что зашифровать мы можем только незагружаемый раздел на диске. Последний раз я создавал LUKS/LVM в openSUSE 12.1 (релиз), и тогда тоже приходилось переключаться в консоль и создавать все разделы вручную из-за блокировки YaST, но создать их все же получилось, и та система работает до сих пор :)

About these ads

2 Responses

Subscribe to comments with RSS.

  1. Vladislav said, on 22.07.2013 at 06:05

    Насколько я помню, на своем буке я ставил openSuse на зашифрованый диск при промощи yast еще с 11 версии. Мастер прекрасно справляется с этим делом.
    Другой вопрос, что с при апгрейде на 12.3 , с grub2, загрузчик остается grub1. Интересно былобы узнать, как правильно настраивать crypto систему с grub2.

  2. rwman said, on 15.08.2013 at 12:36

    Очень полезнаая статья, спасибо


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: