1. Вступление
IT-отрасль постоянно балансирует между безопасностью и стабильностью. С таким балансом, производительность обычно затрагивает практичность. В области защиты зашифрованных данных существует 3 фактора, влияющих на производительность, а следовательно и на практичность: жесткий диск, центральный процессор и оперативная память. Из этих факторов жесткий диск всегда является наиболее слабым фактором (даже несмотря на твердотельные накопители SSD).
FreeSoftware предлагает довольно элегантное решение для защиты шифрованных данных, под названием Linux Unified Key Setup (LUKS).
2. Определения и критерии
Fedora 21 использует не более 1 Гб памяти, при этом система позволяет использовать до 16 ГбDDR3, поэтому для запуска Fedora будем использовать 16 Гб RAM, для создания RAM-drive, на котором будем использовать Fedora.
2А. RAID 1
В данной статье ссылка на RAID 1 (зеркало) означает, что RAID 1 реализован через LVM2.
- Addlvcreate/lvchange --[raid]{min|max}recoveryrate для raidLVs.
- Addlvchange --[raid]writemostly/writebehindsupportforRAID1
- Add lvchange --[raid]syncaction for scrubbing of RAID LVs.
2Б. Linux Unified Key Setup (LUKS)
В простейшем случае, LUKS расширяет функциональность Crypt setup, с целью соответствия TKS1. TKS1 использует ключ хэш для выполнения данных де/шифрования через алгоритм шифрования.
2В. образ Fedora для загрузки с флешки
На официальном сайте проекта Fedora можно найти информацию как по созданию образа для сменного носителя (типа флэш), чтобы загружаться непосредственно с него, так и образа сетевого установщика (net-install image). Обычно Fedoda USB media позволяет загрузиться и установить gparted. Как показала практика, современная версия Fedora 21 занимает примерно 2 Гб на флэшке.
2Г. Тестирование CPU (AES-NI), RAM и HDD
Новейшие процессоры Intel включают расширение системы команд AES-NI. Для проверки процессора на наличие данных команд введём следующее:
cat /proc/cpuinfo | grepaes
Далее протестируем пропускную способность процессора для различных алгоритмов шифрования:
cryptsetup benchmark
Результаты: # Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 386073 iterations per second
PBKDF2-sha256 209380 iterations per second
PBKDF2-sha512 140034 iterations per second
PBKDF2-ripemd160 308404 iterations per second
PBKDF2-whirlpool 164870 iterations per second
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 434.6 MiB/s 1528.2 MiB/s
serpent-cbc 128b 63.3 MiB/s 212.4 MiB/s
twofish-cbc 128b 133.2 MiB/s 250.6 MiB/s
aes-cbc 256b 316.0 MiB/s 1140.8 MiB/s
serpent-cbc 256b 63.7 MiB/s 213.1 MiB/s
twofish-cbc 256b 132.8 MiB/s 250.2 MiB/s
aes-xts 256b 1264.3 MiB/s 1266.8 MiB/s
serpent-xts 256b 218.7 MiB/s 207.4 MiB/s
twofish-xts 256b 241.3 MiB/s 247.5 MiB/s
aes-xts 512b 994.2 MiB/s 986.7 MiB/s
serpent-xts 512b 218.8 MiB/s 208.9 MiB/s
twofish-xts 512b 243.7 MiB/s 247.7 MiB/s
AES-XTS с 256 битным ключом показывает наилучшие результаты. По умолчанию Fedora (через Anaconda) устанавливает AES-XTS 512 битный ключLUKS раздела, используя хэш SHA1.
Для отображения данных о памяти введём следующее:
type# dmidecode --type 17 | less
В нашем случае получим:
Size: 8192 MB
Form Factor: SODIMM
Type: DDR3
Speed: 1600 MHz
Configured Clock Speed: 1600 MHz
Предположим, что у нас достаточно оперативной памяти для создание виртуального диска на 1 Гб для тестирование пропускной способности:
# modprobebrdrd_nr=1 rd_size-1048576 max_part=0
Теперь протестируем скорость чтения:
# hdparm -t /dev/ram0
/dev/ram0:Timing buffered disk reads: 5050 MB in 3.00 seconds = 1683.23
MB/sec
После тестирование виртуальный диск можно удалить:
# rmmodbrd
Для сравнения теперь протестируем жесткий диск:
# hdparm -t /dev/sda3
/dev/sda3
: Timing buffered disk reads: 302 MB in 3.00 seconds = 100.51 MB/sec
При создании зеркала RAID 1, мы пытаемся увеличить пропускную способность шифрования для Fedora(OS) от 100,51МБ / с (скоростьHDD) в 1260Mб/~1321Мб / с размещением шифрования на ЦП.
3. LVM или создание PV, VG&LG
3A. Физический том (pv)
Выберем следующую схему разделов: sda1 /boot/efi 256 MiB, sda2 /boot 512 MiB, sda3LVM2 все остальное пространство(~ 930,76Мб)
pvcreate /dev/sda3
3Б. Группа томов (vg)
При создании группы томов выбреем имя хоста:localhost:
vgcreate fedora_localhost /dev/sda
3В. Логический том
Остальные разделы в системе (/, / OPT, / VAR)
lvcreate -L 16G -nlv_rootfedora_localhost
lvcreate -L 16G -nlv_swapfedora_localhost
lvcreate -L 16G -nlv_optfedora_localhost
lvcreate -L 16G -nlv_varfedora_localhost
При наличии свободного места, его можно использовать под lv_home: lvcreate -l 90% Free -nlv_homefedora_localhost
cryptsetup open --type plain -d /dev/urandom /dev/fedora_localhost/lv_rootto_be_wiped
cat /dev/zero > /dev/mapper/to_be_wiped
cryptsetupclose /dev/fedora_localhost/lv_root
Повторитеэтидействиядляостальныхлогическихтомов, также рекомендуется сохранить / DEV / fedora_ [hostname] / lv_home.
3Г. Величина RAM диска
Создадим виртуальный диск для RAID. Модуль ядра brd использует K, поэтому 1048576K=1Гби, следовательно, 10(для 10Гб) = 10485760.Однакоlv_rootраздел, созданный ранее,был размером 16Гб. Мы собираемся удалить этот раздел в следующем шаге и сократить его до 10Гб, однако лучше увеличить объём lv_root и затем уменьшить его, а не пытаться угадать, сколько еще памяти вам нужно.
Создадим модуль ядра Kernelbrd, размером 10 Гб:
# modprobebrdrd_nr=1 rd_size-10485760 max_part=0
Затем создадим физический том pv вместе с Ram диском:
pvcreate /dev/ram0
Создадим временную группу томов VGдля получения экстентов/dev/ram0
vgcreatetestvg
Далее создадим логический том, используя 100% от RAMдиска:
lvcreate 100%FREE -n lv_testtestvg
Теперь выянимсколько*экстентов*находятся надиске:
vgs -o +vg_free_count,vg_extent_count
На диске RAM находится 2559 экстентов.
Теперь логический том можно удалить:
lvremove /dev/testvg/lv_test
Теперь удалим группутомов:
vgremovetestvg
Последним удалим физический том:
pvremove /dev/ram0
Наконец разгрузим RAM диск:
# rmmodbrd
Обратите внимание, LVMsне ожидает, что RAMдискибудут логическим томом LVиочень чувствительны кневозможностинайти физический том PV, поэтому всегда аккуратно выключайте RAMдиск.
3Д. Удаление и пересоздание lv_rootчерез экстенты
В нашем случае используется 2559 экстента, которые в данный момент соответствуют размеру HDD. Для удаленияlv_root введём следующее:
lvremove /dev/fedora_[hostname]/lv_root
Теперь пересоздадим lv_root указав экстенты, а не Мб:
lvcreate -l2559 -n lv_root fedora_[hostname]
4. LUKSAES шифрование & файловая система Ext4
На данный момент у нас должно быть пятьРНв системе, lv_root~10GiB, lv_opt16GiB, lv_var16Джибе, lv_swap16Джибеиlv_home~768GiB. Исходя из Cryptsetup тестов, AES-XTS обладает самой высокой пропускной способностью, при использовании с 256-битным ключом. Также, вместоSHA1 мы используем sha512, и зададим время 5сек(-i 5000) нахэшитерации. При установке через mapper, Fedora монтирует LUKSшифрованные разделы на /Dev/mapper/luks-[UUID]. Для подключения раздела через mapper вручную, мы должны будем использовать CryptsetupluksUUID[DEV] для полученияUUID.
Для каждого из 5 LV необходимо будет повторить одни и те же операции, в качестве примера рассмотрим 2 LV, что бы наглядно продемонстрировать изменения:
cryptsetupluksFormat -y -c aes-xts-plain -s 256 -h SHA512 -i 5000 --use-urandom
/dev/mapper/fedora_hostname-lv_root
cryptsetupluksUUID /dev/mapper/fedora_hostname-lv_root
cryptsetupluksOpen /dev/mapper/fedora_hostname-lv_rootluks-[UUID]
mkfs.ext4 -m1 -L hostname-root /dev/mapper/luks-[UUID]
lv_home
cryptsetupluksFormat -y -c aes-xts-plain -s 256 -h SHA512 -i 5000 --use-urandom
/dev/mapper/fedora_hostaname-lv_home
cryptsetupluksUUID /dev/mapper/fedora_hostname-lv_home
cryptsetupluksOpen /dev/mapper/fedora_hostname-lv_homeluks-[UUID]
mkfs.ext4 -m1 -L hostname-home /dev/mapper/luks-[UUID]
5. RAMдиск& (LVM) RAID 1
Так как мы установили Fedora 20 через сетевую установку с MATE, корневой раздел выражен размером экстентов (2559 = ~10Гб), RAM диск может легко использоваться RAID.
5A. Создание RAM диска и добавление его вLVMRAID 1
# modprobebrdrd_nr=1 rd_size=10485760 max_part=0
# pvcreate /dev/ram0
# vgextendfedora_localhost /dev/ram0
(Повашемужеланиюможнопосмотретьвашилогическиетома)# lvs -a -o
name,copy_percent,devicesfedora_localhost
# lvconvert--type raid1 -m1 fedora_localhost/lv_root
Посмотрим процент построения зеркала
# lvs -a -o name,copy_percent,devicesfedora_localhost
Наконец изменим HDD наwritemostly, для того, чтобы чтение происходило изRAMдиска:
# lvchange --writemostly /dev/sda3:y fedora_localhost/lv_root
5Б. Удаление RAM диска из LVMRAID 1 (в случае потери мощности системы)
# lvchange --writemostly /dev/sda3:n fedora_localhost/lv_root
# lvconvert -m0 fedora_localhost/lv_root /dev/ram0
# vgreducefedora_localhost /dev/ram0
# rmmod /dev/ram0
6. Systemd Unit file
Теперь дадим возможность systemd управлять созданием/удалением RAM диском &RAID 1. Для этого создадим компонент systemd, под названием 2Ro2L (RAMdiskRAIDonLVM&LUKS) и два скрипта:
# pluma /lib/systemd/system/2Ro2L.service
[Unit]
Description=Enable RAMdisk RAID 1 on LVM & LUKS
After=multi-user.target
[Service]
RemainAfterExit=yes
ExecStart=/usr/sbin/2Ro2Lstart
ExecStop=/usr/sbin/2Ro2Lstop
Type=oneshot
[Install]
WantedBy=multi-user.target
# chmod 644 /lib/systemd/system/2RoRL.service
Теперь создадим, запустим и затем остановим скрипты:
# pluma /usr/sbin/2Ro2Lstart
#!/bin/sh
# создание RAM диска
modprobebrdrd_nr=1 rd_size=10485760 max_part=0
# создание физического томаLVMна созданном RAM диске:
pvcreate /dev/ram0
# Расширение группы томов, включаяpv
vgextend fedora_localhost /dev/ram0
# Конвертирование логического тома в конфигурацию RAID 1
lvconvert--type raid1 -m1 fedora_localhost/lv_root
# Изменение свойств логического тома RAID
lvchange --writemostly /dev/sda3:y fedora_localhost/lv_root
# pluma /usr/sbin/2Ro2Lstop
#!/bin/sh
# Удаление свойств логического тома RAID
lvchange --writemostly /dev/sda3:n fedora_localhost/lv_root
# УдалениеRAM диска из RAID
lvconvert -m0 fedora_localhost/lv_root /dev/ram0
# УдалениеRAM диска из группы томов
vgreducefedora_localhost /dev/ram0
# Полное удаление RAM диска
rmmodbrd
# chmod 755 /usr/sbin/2Ro2Ls*
Далее необходимо запустить службу, затем остановить службу, и если все пройдет хорошо, включить службу для многопользовательской цели
# systemctl start 2Ro2L.service
# systemctl stop 2Ro2L.service
Если ошибок не появилось, то можно запустить службу:
# systemctl enable 2Ro2L.service
Дискуссия
Написал Rocky 9
Опубликовано в: Установка nginx c PHP-FPM под CentOS 7.0 in LinuxНаписал Константин
Опубликовано в: Докеризация стека LEMP под Ubuntu c помощью Compose in LinuxНаписал bammbr
Опубликовано в: Шлюз для маленького отдела на Red Hat 9 in LinuxНаписал Федор
Опубликовано в: Установка и конфигурация Samba на CentOS 7 in LinuxНаписал Evgenytrl
Опубликовано в: Загрузка файлов с помощью Wget in Linux