Шифрование Linux (часть 3). Перенос работающей системы Ubuntu на зашифрованные диски

Теперь речь пойдет о том, как зашифровать уже работающею операционную систему Linux. Предположим, что у вас есть сервер, на котором уже работает ваш сайт или на котором сохранено много личной информации. Конечно же вы не хотите, чтобы это все попало в чужие руки. Также, если вы используете сервер как хранилище даны – явно не хочется, чтобы эти данные были кем-то использованы при изъятии жестких дисков. Ситуаций может быть много… По этому нам нужно защитить наше содержимое от чужих глаз.

Я установил свежую Ubuntu 12.04 на виртуальную машину и добавил к ней еще один диск на 1 Гб (/dev/sdb), на который будет перенесено загрузочный раздел с /boot папкой. Как я уже писал в предыдущей статье единственным незашифрованным элементом должна быть загрузочная информация(т.е. образ ядра, initramfs и grub), которая нужна для дешифровки диска еще до монтирования рутовой файловой системы.

root@test-winxp-ie7d:~# cat /etc/issue
Ubuntu 12.04.1 LTS \n \l

root@test-winxp-ie7d:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       9.0G  1.2G  7.4G  14% /
udev            486M  4.0K  486M   1% /dev
tmpfs           198M  304K  198M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            495M     0  495M   0% /run/shm
root@test-winxp-ie7d:~# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000649ec

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    18874367     9436160   83  Linux
/dev/sda2        18876414    20969471     1046529    5  Extended
/dev/sda5        18876416    20969471     1046528   82  Linux swap / Solaris

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table
root@test-winxp-ie7d:~#

Для начала нужно смонтировать диск, который будет в роли нового boot-a и перенести на него все из папки /boot.

root@test-winxp-ie7d:~# mkfs.ext4 /dev/sda
mke2fs 1.42 (29-Nov-2011)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

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

root@test-winxp-ie7d:~# mkdir /mnt/newboot
root@test-winxp-ie7d:~# mount /dev/sdb /mnt/newboot/
root@test-winxp-ie7d:~# cp -R /boot/* /mnt/newboot/
root@test-winxp-ie7d:~# mv /boot /boot_old
root@test-winxp-ie7d:~# mkdir /boot

На данном этапе мы перенесли загрузочную папку boot на новый диск. Теперь нужно прописать необходимые настройки в fstab для правильного монтирования.

root@test-winxp-ie7d:~# echo "/dev/sdb /boot ext4 defaults 0 0" >> /etc/fstab

Теперь можно обновить grub настройки и смело перезагрузить систему.

root@test-winxp-ie7d:~# update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-29-generic
Found initrd image: /boot/initrd.img-3.2.0-29-generic
Found memtest86+ image: /memtest86+.bin
done
root@test-winxp-ie7d:~# grub-install /dev/sdb
Installation finished. No error reported.
root@test-winxp-ie7d:~# reboot
root@test-winxp-ie7d:~#
Broadcast message from alex@test-winxp-ie7d
(/dev/pts/0) at 6:06 ...

The system is going down for reboot NOW!

После перезагрузки – подключаемся и смотрим что у нас твориться в файловой системе.

root@test-winxp-ie7d:~# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda1      ext4      9.0G  1.2G  7.4G  14% /
udev           devtmpfs  486M  4.0K  486M   1% /dev
tmpfs          tmpfs     198M  304K  198M   1% /run
none           tmpfs     5.0M     0  5.0M   0% /run/lock
none           tmpfs     495M     0  495M   0% /run/shm
/dev/sdb       ext4     1021M   71M  900M   8% /boot
root@test-winxp-ie7d:~# ls /boot/
abi-3.2.0-29-generic     grub                         lost+found      memtest86+_multiboot.bin     vmlinuz-3.2.0-29-generic
config-3.2.0-29-generic  initrd.img-3.2.0-29-generic  memtest86+.bin  System.map-3.2.0-29-generic

Как видно, у нас теперь загрузчик, образ ядра и initramfs находятся на отдельном диске.
Далее нам нужно перенести всю файловую систему на зашифрованный диск, который будет монтироваться в /. Для этого я добавил еще один диск (/dev/sdс) который будет в роли нового рутового (системного) диска вместо /dev/sda1.
Шифруем диск sdс и монтируем для переноса всех файлов.

root@test-winxp-ie7d:~# mkdir /mnt/newroot
root@test-winxp-ie7d:~# cryptsetup luksFormat /dev/sdc

WARNING!
========
This will overwrite data on /dev/sdc irrevocably.

Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
root@test-winxp-ie7d:~# cryptsetup luksOpen /dev/sdc encryptroot
Enter passphrase for /dev/sdc:
root@test-winxp-ie7d:~# mkfs -t ext4 /dev/mapper/encryptroot
mke2fs 1.42 (29-Nov-2011)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
196608 inodes, 785920 blocks
39296 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=805306368
24 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

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

root@test-winxp-ie7d:~# mount -t ext4 /dev/mapper/encryptroot /mnt/newroot/

Теперь модифицируем fstab, crypttab, также обновляем initramfs и перекидаем на зашифрованный диск sdc все из старого рутового диска /dev/sda1.

root@test-winxp-ie7d:~# ls -l /dev/disk/by-uuid/
total 0
…
lrwxrwxrwx 1 root root 10 Sep 16 06:46 5e5fac1c-080b-437a-96ff-d9e4e3b04759 -> ../../sda1
lrwxrwxrwx 1 root root  9 Sep 16 06:47 d08aab55-a935-4155-aea0-b6fd5da8bed3 -> ../../sdc
…
root@test-winxp-ie7d:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                 proc            /proc           proc    nodev,noexec,nosuid 0       0
# / was on /dev/sda1 during installation
#UUID=5e5fac1c-080b-437a-96ff-d9e4e3b04759 /               ext4    errors=remount-ro 0       1
/dev/mapper/encryptroot /       ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
UUID=eae26cf5-303a-4c17-ac63-d7dd82891c09 none            swap    sw              0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0
/dev/sdb /boot ext4 defaults 0 0

root@test-winxp-ie7d:~# cat /etc/crypttab
#
encryptroot UUID=d08aab55-a935-4155-aea0-b6fd5da8bed3 none luks

root@test-winxp-ie7d:~# sed -i -e "s|root=UUID=5e5fac1c-080b-437a-96ff-d9e4e3b04759|root=/dev/mapper/encryptroot|" /boot/grub/grub.cfg
root@test-winxp-ie7d:~# ln -s /boot/vmlinuz-3.2.0-29-generic /mnt/newroot/vmlinuz
root@test-winxp-ie7d:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-3.2.0-29-generic
root@test-winxp-ie7d:~# rsync -aHx / /mnt/newroot
root@test-winxp-ie7d:~# rsync -aHx /dev /mnt/newroot/
root@test-winxp-ie7d:~# reboot

Если после перезагрузки Вам выдало следующие окно – значит, все получилось. Если получили kernel-panic – пишите в комментах, подскажу в чем может быть проблема и на каком шаге вышел failt.

После авторизации – посмотрим, что у нас получилось.

root@test-winxp-ie7d:~# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
/dev/mapper/encryptroot ext4      3.0G  1.1G  1.8G  38% /
udev                    devtmpfs  485M  4.0K  485M   1% /dev
tmpfs                   tmpfs     198M  312K  198M   1% /run
none                    tmpfs     5.0M     0  5.0M   0% /run/lock
none                    tmpfs     495M     0  495M   0% /run/shm
/dev/sdb                ext4     1021M   74M  897M   8% /boot
root@test-winxp-ie7d:~# fdisk -l

Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000649ec

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    18874367     9436160   83  Linux
/dev/sda2        18876414    20969471     1046529    5  Extended
/dev/sda5        18876416    20969471     1046528   82  Linux swap / Solaris

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 3221 MB, 3221225472 bytes
255 heads, 63 sectors/track, 391 cylinders, total 6291456 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x08040000

Disk /dev/sdc doesn't contain a valid partition table

Disk /dev/mapper/encryptroot: 3219 MB, 3219128320 bytes
255 heads, 63 sectors/track, 391 cylinders, total 6287360 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/mapper/encryptroot doesn't contain a valid partition table
root@test-winxp-ie7d:~#

Как видим, в рутовую файловую систему смонтирован зашифрованный диск. И также остался старый диск /dev/sda, который можно изъять.

В следующей статье пойдет речь об шифровании Centos.

Автор: admin, 16 сентября 2013
Рубрики: Безопасность
Метки: , , ,
11 комментариев к сообщению: “Шифрование Linux (часть 3). Перенос работающей системы Ubuntu на зашифрованные диски”
  1. Павел:

    >>После перезагрузки – подключаемся и смотрим что у нас твориться в файловой системе.

    После перезагрузки появилось окошко GRUB и все 🙂 Че делать дальше немного не понятно.

  2. Пикулька:

    Пытаюсь повторить. У вас ошибки в тексте. Давайте их устранять вместе.
    Вы пишите: «…Теперь можно обновить grub настройки и смело перезагрузить систему.» При этом вы пишите команду «grub-install /dev/sda», в то время как по логике, граб нужно установить на sdb1(флешка), а не на sda, на котором уже стоит базовая система. При этом на флешке сперва надо создать раздел, иначе граб не установится на нёё, и сделать её загрузочной.

    • Пикулька:

      А перед этим. После того как внесли изменения в файл fstab (echo «/dev/sdb /boot ext4 defaults 0 0» >> /etc/fstab) развен не надо чтобы обновления вступили в силу? Применить команду «mount -a» ? И лишь потом делать обновление и установку граба?

      • > При этом на флешке сперва надо создать раздел, иначе граб не установится на нёё, и сделать её загрузочной.
        Нет, ничего не надо создавать. grub может ставиться ТОЛЬКО на диск, а не раздел(т.е. /dev/sda, /dev/hda).

        > А перед этим. После того как внесли изменения в файл fstab (echo “/dev/sdb /boot ext4 defaults 0 0″ >> /etc/fstab) развен не надо чтобы обновления вступили в силу? Применить команду “mount -a” ? И лишь потом делать обновление и установку граба?

        Не надо. Измения вступят в силу после запуска «update-grub». «mount -a» никаких изменией не приминяет — только пытается монтировать все, что есть в fstab

        • Пикулька:

          Никто и не спорит, что Grub ставится на диск, а не на раздел диска. Я написал про то, что grub не будет ставиться на диск если он не размечен или на нём нет файловой ситсемы. Сейчас я специально проверил это. Сперва я попробовал установить grub на чистый диск sdb:
          # grub-install /dev/sdb
          Installing for i386-pc platform.
          grub-install: ошибка: не удалось определить файловую систему в hostdisk//dev/sdb; невозможно выполнить безопасную проверку.

          Затем я сделал файловую систему на дииск sdb, и затем попробовал установить grub. И вот что получилось:
          #mkfs.ext4 /dev/sdb



          #grub-install /dev/sdb
          Installing for i386-pc platform.
          grub-install: предупреждение: Файловая система «ext2» не поддерживает встраивание.
          grub-install: ошибка: встраивание невозможно, но оно необходимо для междисковой устаноки.

          из этого видно, что для установки grub необходимо чтобы на диске был хотя бы один раздел и чтобы этот раздел начинался с 2048 сектора. Потому что grub ставится в эти первые 2048.

          • Только ради вас проделал все на виртуальной машине с двумя дисками (/dev/sda и /dev/sdb) — все идеально работает.
            Сначала мы делаем update-grub. После чего, у нас меняется grub.cfg, и теперь grub знает, что ядро и initramfs нужно искать на другом диске. НО в /dev/sda у нас осталась старая информация о том, где лежит наш grub-ик, по этому нам нужно ее обновить: «grub-install /dev/sda». Теперь, после ребута MBR находит первый диск с обновленным загрузочным сектором, грузиться граб и видит, что нужные файлы находятся на другом диске — и грузит их.

  3. roman:

    Ставил на Ubuntu Server 14.04 x64.
    После перезагрузки вместо Enter passphrase выплюнул это:
    Gave up waiting for root device. Common problems:
    — Boot args (cat /proc/cmdline)
    — Check rootdelay= (did thesystem wait long enough?)
    — Check root- (did the system wait for the right device?)
    — Missing modules (cat /proc/modules; ls /dev)
    ALERT! /dev/mapper/encryptroot does not exist. Dropping to a shell!
    Подскажите куда копать?

    • Да, для 14.04 в место шагов:

      root@test-winxp-ie7d:~# sed -i -e "s|root=UUID=5e5fac1c-080b-437a-96ff-d9e4e3b04759|root=/dev/mapper/encryptroot|" /boot/grub/grub.cfg
      root@test-winxp-ie7d:~# ln -s /boot/vmlinuz-3.2.0-29-generic /mnt/newroot/vmlinuz
      root@test-winxp-ie7d:~# update-initramfs -u
      update-initramfs: Generating /boot/initrd.img-3.2.0-29-generic
      root@test-winxp-ie7d:~# rsync -aHx / /mnt/newroot
      root@test-winxp-ie7d:~# rsync -aHx /dev /mnt/newroot/
      root@test-winxp-ie7d:~# reboot
      

      Нужно сделать следующие:

      root@ubuntu14:~# mount -t ext4 /dev/mapper/encryptroot /mnt/newroot/
      root@ubuntu14:~# rsync -aHx / /mnt/newroot
      root@ubuntu14:~# rsync -aHx /dev /mnt/newroot/
      root@ubuntu14:~# mount --bind /dev /mnt/newroot/dev
      root@ubuntu14:~# mount --bind /proc /mnt/newroot/proc
      root@ubuntu14:~# mount --bind /sys /mnt/newroot/sys
      root@ubuntu14:~# chroot /mnt/newroot/
      root@ubuntu14:/# mount /dev/sdb /boot/ #твой диск с boot-м
      root@ubuntu14:/# update-grub
      root@ubuntu14:/# update-initramfs -u
      

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

  4. alexey:

    приветствую, пробую это сделать на дебиан 8
    после первого ребута получаю просто приглашение груба: grub> _
    что я делаю не так?

Написать комментарий

Последние статьи

Яндекс.Метрика
?>