Pull to refresh

Шифрование данных в Linux

Reading time 6 min
Views 20K
В данной статье рассмотрен один из вариантов шифрования данных в Linux.

Статья не претендует на прописную истину и не открывает ничего нового.
Описывается идея и показан пример ее реализации.
Собственно, основная идея:
При изъятии(воровсте) оборудования (винчестер, либо компьютер целиком) возможность получить какую либо информацию должна полностью отсутствовать. Тоесть, злоумышленник не должен получить вообще никакой информации, любой носитель информации должен быть полностью зашифрован.
Варианты с загрузочными флэшками сразу были отклонены по идеологическим причинам, так как не всегда есть возможность оперативно отключить её.
В итоге была выбрана схема с загрузкой по сети.
Задача:
Обеспечить шифрование данных находящихся на Windows сервере.
Пример реализации:
1.Выполняем загрузку по сети (pxe + nfs)
2.Запускаем sshd и ждем монтирования зашифрованых разделов
3.Через ssh монтируем криптованые разделы
4.Запускаем виртуальную машину VirtualBox с Windows на борту
Исходные данные:
Сеть: 192.168.1.0/24
Основной шлюз: 192.168.1.1
DNS: 192.168.1.1
Сервер удаленной загрузки: 192.168.1.13 (загружающий сервер)
Сервер с криптоваными данными: 192.168.1.14 (загружаемый сервер)

Все нижеописанное будет происходить на сервере с предустановленным Debian Lenny.

Устнавливаем и настраиваем dhcp сервер для сетевой загрузки.

netboot:~# apt-get install dhcp3-server
netboot:~# mcedit /etc/dhcp3/dhcpd.conf

option domain-name-servers 192.168.1.1;
default-lease-time 86400;
max-lease-time 604800;
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.20 192.168.1.60;
filename "pxelinux.0";
next-server 192.168.1.13;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
}


Далее устанавливаем и конфигурируем tftp сервер.

netboot:~# apt-get install tftpd-hpa
netboot:~# mcedit etc/default/tftpd-hpa

RUN_DAEMON="yes"
OPTIONS="-l -s /opt/vcrypt/boot"


Для сетвевой загрузки нам потребуется файл pxelinux.0 из пакета syslinux
Устанавливаем пакет syslinux. И настраиваем pxe.

netboot:~# apt-get install syslinux
netboot:~# mkdir -p /opt/vcrypt/boot
netboot:~# cp /usr/lib/syslinux/pxelinux.0 /opt/vcrypt/boot/
netboot:~# mkdir /opt/vcrypt/boot/pxelinux.cfg
netboot:~# touch /opt/vcrypt/boot/pxelinux.cfg/default
netboot:~# mcedit /opt/vcrypt/boot/pxelinux.cfg/default

DEFAULT vcrypt
TIMEOUT 30
PROMPT 1
LABEL vcrypt
KERNEL vmlinuz
APPEND root=/dev/nfs nfsroot=192.168.1.13:/opt/vcrypt/ initrd=initrd.img ip=192.168.1.14::192.168.1.1:255.255.255.0:


Смысл данного конфига: по умолчанию загружаем секцию vcrypt, в которой указано какое ядро и рам диск использовать, и что корневой раздел у нас находится на удаленном nfs сервере.

С настройкой tftp и pxe мы закончили, теперь установим и настроим nfs сервер.

netboot:~# apt-get install nfs-kernel-server nfs-common portmap
netboot:~# mcedit /etc/exports

/opt/vcrypt 192.168.1.14(rw,no_root_squash,async,no_subtree_check)


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

netboot:~# invoke-rc.d nfs-kernel-server reload

Перезагружаем nfs сервер, что бы он обработал новый конфиг.

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

netboot:~# apt-get install debootstrap

Процесс установки прост как пять копеек, указываем архитектуру, дистрибутив, куда устанавливать и зеркало (откуда брать пакеты).


netboot:~#debootstrap --arch i386  lenny /opt/vcrypt/ http://ftp.us.debian.org/debian

По завершении работы debootstrap в папке /opt/vcrypt/ будет почти готовая к работе система.

Делаем chroot в только что установленную систему
netboot:~# LANG=C chroot /opt/vcrypt/ /bin/bash

Настраиваем часовой пояс, сеть и ресолв, задаем hostname и обновляем кэш apt

netboot:/# nano /etc/default/rcS

TMPTIME=0
SULOGIN=no
DELAYLOGIN=no
UTC=no
VERBOSE=no
FSCKFIX=no
RAMRUN=no
RAMLOCK=no

netboot:/# dpkg-reconfigure tzdata
netboot:/# nano /etc/network/interfaces

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.14
netmask 255.255.255.0
gateway 192.168.1.1

netboot:/# nano /etc/resolv.conf

nameserver 192.168.1.1

netboot:/# echo cryptserv > /etc/hostname
netboot:/# apt-get update


Устанавливаем и настраиваем локали.
Я выбрал только en_US.UTF8 и ru_RU.UTF8. Для соблюдения полной кошерности — дефолтной выставил en_US.UTF8.

netboot:/# apt-get install locales
netboot:/# dpkg-reconfigure locales


Создаем файл конфигурации установки ядра и устанавливаем ядро

netboot:/# touch /etc/kernel-img.conf
netboot:/# nano /etc/kernel-img.conf

do_symlinks = yes
relative_links = yes
do_bootloader = no
do_bootfloppy = no
do_initrd = yes
link_in_boot = no

netboot:/# apt-get install linux-image-2.6.26-2-686


Конфигурируем initrd для загрузки по сети. Хочу отметить, что все манипуляции мы производим исключительно в chroot системе.

netboot:/boot# nano /etc/initramfs-tools/initramfs.conf

MODULES=netboot
BUSYBOX=y
KEYMAP=n
BOOT=nfs
DEVICE=eth0
NFSROOT=auto


Удаляем старый и генерируем новый initrd, хотя удалить можно и по рабоче-крестьянски:
rm /boot/initrd.img-`uname -r`
но я еще с детства недолюбливаю команду rm

netboot:/# update-initramfs -v -c -k `uname -r` -d
netboot:/# update-initramfs -v -c -k `uname -r`


Делаем символические ссылки на ядро и рамдиск

netboot:/# cd /boot
netboot:/boot# ln -s vmlinuz-2.6.26-2-686 vmlinuz
netboot:/boot# ln -s initrd.img-2.6.26-2-686 initrd.img


Устанавливаем luks

netboot:/# apt-get install cryptsetup hashalot

Задаем root пароль и устанавливаем ssh server

netboot:/# passwd
netboot:/# apt-get install openssh-server


После вышеописанных манипуляция сервер удаленной загрузки полность готов к эксплуатации.

Если загрузка прошла успешно, то по адресу 192.168.1.14 у вас будет полностью рабочий сервер с запущенным sshd.

Логинимся и настриваем шифрование:

h1g@h1g-laptop:~$ ssh -l root 192.168.1.14

Заполняем диск случайными данными, для затруднения выявления зашифрованных данных.
Можно еще проверить на бэд блоки, но это уже на Ваше усмотрение.

cryptserv:~# dd if=/dev/urandom of=/dev/sda

Cоздаем зашифрованный раздел (жесткий диск, носитель)

cryptserv:~# cryptsetup --verbose --verify-passphrase luksFormat /dev/sda

Надеюсь, Вы будете использовать пас фразу длинной не менее 15 символов, состояющую из цифр и букв разного регистра.

Открываем зашифрованное устройство и ассоциаруем его с виртуальным устройством /dev/mapper/vcrypt. Создаем файловую ссистему. Создаем точку монтирования

cryptserv:~# cryptsetup luksOpen /dev/sda vcrypt
cryptserv:~# mkfs.ext3 -j -m 1 -O dir_index,filetype,sparse_super /dev/mapper/vcrypt
cryptserv:~# mkdir /home/crypt
cryptserv:~# mount /dev/mapper/vcrypt /home/crypt/


Далее устанавливаем, VirtualBox. К моему глубокому сожалению не Sun, Oracle VirtualBox

cryptserv:~# echo "deb http://download.virtualbox.org/virtualbox/debian lenny non-free" >> /etc/apt/sources.list 
cryptserv:~# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | apt-key add -

cryptserv:~# apt-get install virtualbox-3.2


Создаем контейнер для виртуальной машины. Пускай он будет называться Bender1 с шаблоном для Win2k3 сервер

cryptserv:~# VBoxManage createvm --name bender1 --ostype Windows2003 —register

Выделяем контейнеру 1 гб оперативной памяти, выставляем доступ к сети посредством сетевого моста, включаем виртуальный rdp сервер на 3389 порту

cryptserv:~# VBoxManage modifyvm bender1 --memory 1024 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 eth0 --vram 12 --accelerate3d off --boot1 disk --acpi on --cableconnected1 on --usb off --vrdp on --vrdpport 3389 --vtxvpid on

Создаем IDE контролер для нашей виртуальной машины

cryptserv:~# VBoxManage storagectl bender1 --name "IDE Controller" --add ide

Создаем виртуальный жесткий диск размеров 20 гб и подключаем его к контроллеру

cryptserv:~# VBoxManage createhd --filename /home/crypt/bender1.vdi --size 20480 --register
cryptserv:~# VBoxManage storageattach bender1 --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /home/crypt/bender1.vdi


Подключаем легальный установочный DVD образ к контроллеру.

cryptserv:~# VBoxManage storageattach bender1 --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive —medium /home/crypt/some_legal_windows_image.iso

Выставляем загрузку с легального DVD образа

cryptserv:~# VBoxManage modifyvm bender1 --boot1 dvd

Теперь все готово к запуску «Бендера»

cryptserv:~# VBoxManage startvm bender1 --type vrdp

Подключаемся к rdp серверу и наслаждаемся установкой легальной win2k3. Процесс установки и настроки win2k3 сервера описывать не вижу смысла.

h1g@h1g-laptop:~$ rdesktop -k en-us 192.168.1.14:3389

После удачной установки посылаем «Бендеру» сигнал завершения работы

cryptserv:~# VBoxManage controlvm bender1 acpipowerbutton

Переключаем на загрузку диска

cryptserv:~# VBoxManage modifyvm bender1 --boot1 disk

Пример скриптов для включения и выключени виртуальной машины.

cryptserv:~# cat start_vm.sh
  1. #!/bin/bash
  2. /sbin/cryptsetup luksOpen /dev/sda vcrypt && mount /dev/mapper/vcrypt /home/crypt && /usr/bin/VBoxManage startvm bender1 --type vrdp


cryptserv:~# cat shutdown_vm.sh
  1. #!/bin/bash
  2. /usr/bin/VBoxManage controlvm bender1 acpipowerbutton
  3. while [ `ps aux|grep "bender1 --startvm"|grep -v grep|wc -l` -ne  0 ]
  4. do
  5. echo "VM is poweroff. Wait plz"
  6. sleep 1
  7. done
  8. umount /home/crypt && /sbin/cryptsetup luksClose /dev/mapper/vcrypе


Опять же, повторюсь, здесь приведен пример базовой настройки системы. Не описана настройка файервола, привязки tftp сервера к маку загружаемого сервера, ссш сервера, шифрования «загружаемой системы» и др.
Это каждый администратор решает для себя сам.
Тут полет Вашей паранойи фантазии никто не ограничивает, но нужно помнить, что не все препараты одинаково полезны.
Tags:
Hubs:
+15
Comments 11
Comments Comments 11

Articles