Доброго времени суток господа.

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

1. Этап — рабочие станции и сервера

После анализа парка пк, и перебора разного рода VDI решений (об этом напишу в другой статье) я остановился на Linux решении. Многие из вас скажут, а как же софт и прочие специализированные опции, сразу отвечу все что можно было переработано и переведено в вэб окружение на базе LAMP, заменено свободным ПО (например почтовый клиент) или запущено в Wine (единичные случаи).

 

Выбор пал на следующие операционные системы:
— рабочие станции на базе Mint MATE
— сервера на базе debian 7-8

Почему таков выбор? Наверное основой для этого стал как личный опыт работы с теми или иными осями, так и стабильность дебиан систем.

2. Этап — подготовка шифрования (сразу оговорюсь для любителей Truecrypt, bitLocker и Windows – против последней ничего не имею — решения сырые, неоднократно взломанные. Шифрования на windows на бесплатной основе достойного не нашлось).

Прежде чем приступить к внедрению шифрования в боевых условиях, были искромсаны несколько виртуальных машин и методологий шифрования.
За основу взяты следующие статьи:
http://habrahabr.ru/post/88385/
http://habrahabr.ru/post/91948/,/
https://xakep.ru/2013/09/06/61210/
https://cryptoworld.su/%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%B2-%D0%B2-linux/
http://sysadm.pp.ua/linux/shifrovanie/polnoe-shifrovanie-diskov-linux-chast-1.html (все 3 части)
http://4debian.info/article/page/12-initramfs/
В большинстве выше указанных статей или обзоров рассматривается вариация с полным шифрованием диска и размещением загрузчика (BOOT) на отдельном внешнем носителе. Нас это не совсем устраивает, так как целью было централизованное шифрование всего офиса.

(немного о структуре которая строится: это сервер на базе XEN citrix, на котором будет размещены несколько клиентских машин для удаленной работы по VNC, Samba Ldap сервер для хранения и авторизации, почтовый сервер и шлюз. Все кроме самого сервера виртуализации, а так же шлюза (gate) подлежит шифрованию во благо пресвятого Ктулху.)

Итак в виду того, что мы не собираемся шифровать весь диск, то воспользуемся коробочным решением по шифрованию в Linux (в Debian и всех от него отколовшихся «адекватных» дистрибутивах эта функция отлажена и уже зарекомендовала себя не раз).

Я не буду расписывать создание каждого хоста а опишу процесс шифрования и разблокирования на основании будущего Samba сервера.

1. Запускаем процесс установки операционной системы дебиан и на моменте разметки диска выбираем полное шифрование диска, если же вас не устраивает такой вариант в выше приведенных ссылках присутствует наверное исчерпывающий список вариантов шифрования как всего тома так и от дельных разделов.
Пароль для шифрования сложный можете не указывать так как в перспективе мы его будем удалять.

2. После установки авторизуемся в систему и заходим в консоль с правами root пользователя (в debian 8 вы по умолчанию root, если не меняли ничего? и помните дебиан отказался в 8 версии от sudo)
3. Создаем будущий ключ для шифрования
# dd if=/dev/random of=/mnt/boot/key bs=1 count=512
Размер в 512 или нет, вы выбираете от уровня вашей паранойи, пути куда генерировать вы так же выбираете самостоятельно.

4. После создания ключа нам необходимо добавить его к списку ключей для разблокирования нашего диска.
# cryptsetup luksAddKey /dev/sda5 /mnt/boot/key
Нас спросит пароль для добавления ключа (пароль шифрования от первого ключа)
Проверяем, что у нас стало 2 ключа к нашему диску:
# cryptsetup luksDump /dev/sda5
После чего удаляем старый ключ (рекомендую это делать после того, как вы реализуете всю мою инструкцию и у вас пройдет удачное разблокирование, иначе вы исключите возможность разблокирования по паролю)
cryptsetup luksKillSlot /dev/sda5 0 или же иначе cryptsetup —key-file /mnt/boot/key luksKillSlot /dev/sda5 0
(будьте внимательны к номеру слота — их можно посмотреть во время команды дамп)

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

Этап 3 — конфигурация

Моим решением было использовать образ initramfs.
Итак, чтобы наш ключ скачивался по сети и разблокировал том, нам необходимо чтобы при старте система знала, что ей подгружать и как использовать, следовательно нам нужны следующие модули:

Подготавливаем initrd для работы с шифрованием и LVM.
# nano  /etc/initramfs-tools/modules

добавляем:

dm_mod
dm_crypt
sha256
aes_generic

Так же необходимо вписать модуль сетевой карты для инициализации до старта системы. В моем случае это e1000, посмотреть сетевую вы можете когда системам запущена проанализировав запущенные модули.

Далее создаем скрипт для ключа
# nano /etc/initramfs-tools/scripts/local-top/crypt

Я сделал такой — прошу не судить строго, но этого достаточно:

cd /tmp

ifconfig eth0 192.168.1.10 up (IP сетевого интерфейса вашего сервера)
sleep 5
wget ftp://***:***@192.168.1.1/key (место в сети где вы положили ваш ключ — можно ftp, http, https, при желании ssh и прочее но тут вопрос защищенности канала.)
sleep 2
echo «—key download—«

#########decrypt##########
cryptsetup —key-file /tmp/key luksOpen /dev/sda5 sda5_crypt
if [ -z «$(blkid|grep ‘sda5_crypt’)» ]; then reboot ; fi
echo «—container decrypt—«
#########decrypt##########

rm key

exit

После добавления скриптов и модулей необходимо дать права на данные файлы для root через chmod и chown.
И как результат запустить обновления ядра initramfs

# update-initramfs -u ALL

После чего перезагружаем машину, смотрим произошло ли разблокирование тома. Если все ок, то удаляем как описано выше первый парольный ключ и радуемся «жиздни».
Я описал вариант с загрузкой ключа по сети, но в моем случае — не значит, что ключ лежит на каком то компьютере или виртуалке в моей локальной сети, нет специально, чтобы при разборе ядра не выяснили точное месторасположение ключа у меня реализован вариант согласно которому на не шифрованной машинке (виртуалке, сервере) при монтирована шара с ключем расположенным где захотите с удаленным подключением по vpn, а от туда уже идет wget.

Так же внутри машин было реализовано шифрование почты на основе Thunderbird по сертификатам.

Надеюсь статья оказалось полезной всегда ваш liarsd.