Creating an encrypted partition on Debian Lenny

Objective: писать бэкапы на зашифрованный раздел + LVM
Prerequisites: Хард на пицот гигов, Debian Lenny

Итак, новый диск Maxtor виден в системе как /dev/sdc, будем его приспосабливать в качестве хранилища для секурных бэкапов. Схема такая:

  1. Девайс без таблицы разделов полностью шифруем средствами cryptsetup-luks;
  2. На зашифрованном девайсе создаем дескриптор LVM, VG и LV;
  3. Сверху накатываем ext3, бэкапимся.

cryptsetup-luks

Шифровать диск будем средствами cryptsetup-luks. О технологии можно почитать здесь и здесь.

В Дебиане есть простая утилита для быстрого создания разделов, называется luksformat.

$ man luksformat

Ей мы пользоваться не будем, потому что она не позволяет сделать множество полезных вещей. Сама по себе эта штука есть perl-скрипт, который можно поизучать на предмет основных команд, которыми создается crypted device.

$ file `which luksformat`
/usr/sbin/luksformat: a /usr/bin/perl -w script text executable
$ vim `which luksformat`
56
57
58
59
print "Creating encrypted device on $device...\n";
if ((system 'cryptsetup', 'luksFormat', '-s', '256', '--cipher', 'aes-cbc-essiv:sha256', $device)) {
    die "Could not create LUKS device $device";
}

A-ha! Искомая утиль называется cryptsetup. Читаем ман.

man cryptsetup

Чтобы создать шифрованный девайс, достаточно вызвать cryptsetup с опцией luksFormat. Passphrase должна быть достаточно стойкой. Понятное дело, /dev/sdc надо заменить на свой файл.

# cryptsetup luksFormat --key-size 256 --verify-passphrase --cipher aes-cbc-essiv:sha256 /dev/sdc
 
WARNING!
========
This will overwrite data on /dev/sdc irrevocably.
 
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
Verify passphrase: 
Command successful.

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

$ man 5 crypttab

Как следует из описания, первым словом должно быть указано имя для будущего зашифрованного (целевого) устройства, которое появится в /dev/mapper/ при “отрытии” LUKS’а. Вторым — путь до исходного (нешифрованного) устройства, затем путь до файла ключа (если указать none, попросят ввести с stdin) и опции шифрования. Как я понимаю, формат LUKS определяет формат заголовка, в котором указана вся необходимая информация, поэтому в последнем поле просто ставим luks.

Имя исходного устройства удобно указать через симлинки, заботливо созданные udev‘ом в /dev/disk/by-id/.

$ ll /dev/disk/by-id/ | grep -i maxtor
lrwxrwxrwx 1 root root  9 Сен 26 19:24 ata-MAXTOR_STM3500320AS_5QM0HBKM -> ../../sdc
lrwxrwxrwx 1 root root  9 Сен 26 19:24 scsi-SATA_MAXTOR_STM35003_5QM0HBKM -> ../../sdc
$ cat /etc/crypttab | tail -1
sdc_crypt /dev/disk/by-id/scsi-SATA_MAXTOR_STM35003_5QM0HBKM none luks

Теперь, нужно “открыть” LUKS-контейнер, делается это с помощью cryptdisks_start:

$ cryptdisks_start 
usage: /usr/sbin/cryptdisks_start <name>
 
reads /etc/crypttab and starts the mapping corresponding to <name>
# cryptdisks_start sdc_crypt
Starting crypto disk...sdc_crypt (starting).
Enter passphrase to unlock the disk /dev/disk/by-id/scsi-SATA_MAXTOR_STM35003_5QM0HBKM (sdc_crypt): 
key slot 0 unlocked.
Command successful.
sdc_crypt (started)...done.
betelgeuse-6 : xio [~] $ ll /dev/mapper/ | grep sdc
brw-rw---- 1 root disk 254, 13 Сен 27 12:51 sdc_crypt

Done!

LVM

Теперь, LVM. Замечательная статья в тему: XGU.

# lvm
lvm> pvcreate -v /dev/mapper/sdc_crypt
    Set up physical volume for "/dev/mapper/sdc_crypt" with 976771112 available sectors
    Zeroing start of device /dev/mapper/sdc_crypt
  Physical volume "/dev/mapper/sdc_crypt" successfully created
lvm> vgcreate vg2 /dev/mapper/sdc_crypt
  Volume group "vg2" successfully created
lvm> lvcreate -L 100% -n backup vg2
  Invalid argument 100%
  Error during parsing of command line.
lvm> vgdisplay vg2
  --- Volume group ---
  VG Name               vg2
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               465,76 GB
  PE Size               4,00 MB
  Total PE              119234
  Alloc PE / Size       0 / 0
  Free  PE / Size       119234 / 465,76 GB
  VG UUID               d9lDBt-x2SW-jlsf-ba92-Uc8D-muDy-sSe84j
 
lvm> lvcreate -l 119234  -n backup vg2
  Logical volume "backup" created
lvm> quit
  Exiting.

Все. Девайс, с которым будем работать дальше, называется /dev/mapper/vg-backup.

ext3

Ничего необычного, укажем лишь label и 0% зарезервированного для рута объема (для этого раздела нет необходимости).

# mke2fs -j -L BACKUP -m 0 /dev/mapper/vg2-backup 
mke2fs 1.41.0 (10-Jul-2008)
Filesystem label=BACKUP
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
30531584 inodes, 122095616 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
3727 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000
 
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
 
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Добавим в fstab:

16
/dev/mapper/vg2-backup                  /srv/backup     ext3    defaults        0 2

Ну и последний штрих:

# mkdir /srv/backup
# mount /srv/backup
$ ls /srv/backup
lost+found

Дальше надо подумать о технологии инкрементального бэкапа. В простейшем случае это может быть rsync, в более сложном — комплексные решения, вроде Bacula.

That’s it!