Не секрет, что на сегодняшний день шифрование данных – единственный, пожалуй, способ, как-то их сохранить. Сегодня мы узнаем, как создать шифрованный раздел в Linux при помощи стандарта luks (Linux Unified Key Setup). Буду приводить для примера скриншоты из операционки CentOS Linux.
Итак, прежде всего заготовим раздел, который будем шифровать. В рамках своей виртуальной машины я создал новый диск, подключил его к интерфейсу SATA, в системе появилось устройство /dev/sdb
Создадим на нем основной раздел:
# fdisk /dev/sdb
Создали 1 раздел (sdb1), отвели ему всё свободное место.
Отлично, теперь отформатируем раздел /dev/sdb1 с использованием средств криптозащиты по парольной фразе. Нам будет предложено ввести пароль. Повторим его дважды, чтобы не ошибиться.
# cryptsetup --verbose --verify-passphrase luksFormat /dev/sdb1
По умолчанию используется алгоритм AES 256bit. При необходимости можно выбрать другой алгоритм, указав ключи -c алгоритм -s длина ключа
# cryptsetup -c aes -s 1024 --verbose --verify-passphrase luksFormat /dev/sdb1
Затем активируем криптоконтейнер под именем safe:
# cryptsetup luksOpen /dev/sdb1 safe
В результате чего у нас создается новое блочное устройство в каталоге /dev/mapper/ с именем safe.
Создаем файловую систему:
# mkfs.ext3 /dev/mapper/safe
Что делать, если мы хотим, чтобы наш раздел активировался каждый раз при старте системы (разумеется, спрашивая парольную фразу)?
Отредактируем файл /etc/crypttab, который похож на /etc/fstab
# vim /etc/crypttab
Допишем туда строку:
safe /dev/sdb1 none
А в файл /etc/fstab следующее:
/dev/mapper/safe /safe ext3 defaults 0 0
Так, ситуация. Мы создали криптованый раздел. Знаем ключ. Можно ли сделать так, чтобы раздел был доступен не только по нашему ключу, но и по другому. То есть хотим дать доступ “Васе”, чтобы он мог работать наравне с нами. Легко.
Добавим ещё один ключ в криптоконтейнер.
Всего можно создать до 8-ми ключей, каждый из которых помещается в свой слот.
Показать занятые слоты можно так:
# cryptsetup luksDump /dev/sdb1
Как видим, заняты слоты 0 и 1. Вместо паролей можно использовать и ключевые файлы.
Показать статус криптоконтейнера можно так:
# cryptsetup status safe
Практический пример.
Цель: Защитить USB устройство от назойливых глаз.
Подключим флешку к нашей системе:
Флешка определилась как девайс sdc. Это значит, что появилось устройство /dev/sdc. Если на флешке были разделы fat или ntfs, то лучше информацию куда-нибудь скинуть, потому как после шифрования устройства всё пропадёт.
Итак, можем разметить флешку с помощью fdisk, можем оставить как есть.
# cryptsetup luksFormat /dev/sdc
Вводим парольную фразу.
Теперь подключим наше шифрованное устройство, чтобы разметить его под новую файловую систему:
# cryptsetup luksOpen /dev/sdc flash
Теперь у нас спросят парольную фразу, после ввода которой в системе появится новое устройство /dev/mapper/<имя>, в нашем случае flash.
Создадим файловую систему на этом устройстве:
# mkfs.ext3 /dev/mapper/flash
Готово. Ну чтож, пора создать ключи, по которым будет осуществляться доступ к устройству. Ключей можно заготовить несколько (всего до 8-ми слотов, хотя 0-ой слот уже занят под парольную фразу, но его можно удалить).
# dd if=/dev/urandom of=~/keyfile.key bs=1 count=256
Таким образом создадим файл в 256 байт, забитый случайными числами. Проверить это можно так:
# xxd ~/keyfile.key
Действительно. полный рэндом. Теперь осталось добавить этот ключ в нашу флешку.
Отключим пока криптоконтейнер.
# cryptsetup luksClose flash
Добавляем ключ:
# cryptsetup luksAddKey /dev/sdc ~/keyfile.key
Нам предложат ввести парольную фразу, чтобы удостовериться, что у нас есть доступ к этому хранилищу.
# cryptsetup luksDump /dev/sdc
Отлично! Теперь сохраним ключ в надежное местечко.. Он нам понадобится для доступа к контейнеру.
Пример 1.
Пользователь “A” хочет закинуть на флешку файл, зная парольную фразу:
Разлочили по паролю, создав девайс mydisk, далее примонтировали mydisk в домашний каталог. Создали текстовый файл hello.txt с содержимым. Отключили контейнер.
Пример 2.
Разлочили по ключевому файлу, создали устройство flashka. Смонтировали его в домашний каталог пользователя sergey, прочитали файл – всё ок!
Имейте в виду, автор данного труда рассказывает о методах шифрования разделов диска, которые использует сам, при .
Linux
В данном руководстве используется Linux dm-crypt (device-mapper ) на ядре 2.6 . Шифровать будем раздел /dev/sdc1 , это может быть любой раздел, диск, USB или файл, созданный losetup . Здесь мы будем использовать /dev/loop0 , смотрите . Device mapper использует метку для идентификации раздела, в данном примере sdc1 , но это может быть любая другая строка.
Шифрование разделов диска с помощью LUKS
LUKS с dm-crypt очень удобен для шифрования разделов диска, он позволяет иметь несколько паролей для одного раздела а так-же с легкостью менять их. Что-бы проверить доступно-ли у вас использование LUKS , наберите: cryptsetup --help , если насчет LUKS ничего не появилось, читайте ниже "dm-crypt без LUKS ". Для начала создайте раздел, если необходимо fdisk /dev/sdc .Как создать зашифрованный раздел
# dd if=/dev/urandom of=/dev/sdc1 # Опционально. Только для параноиков # cryptsetup -y luksFormat /dev/sdc1 # Это уничтожит все данные на sdc1 # cryptsetup luksOpen /dev/sdc1 sdc1 # mkfs.ext3 /dev/mapper/sdc1 # Будет создана файловая система ext3 # mount -t ext3 /dev/mapper/sdc1 /mnt # umount /mnt # cryptsetup luksClose sdc1Монтировать
# cryptsetup luksOpen /dev/sdc1 sdc1 # mount -t ext3 /dev/mapper/sdc1 /mntРазмонтировать
# umount /mnt # cryptsetup luksClose sdc1dm-crypt без LUKS
# cryptsetup -y create sdc1 /dev/sdc1 # Или любой другой раздел, типа /dev/loop0 # dmsetup ls # Проверить, покажет: sdc1 (254, 0) # mkfs.ext3 /dev/mapper/sdc1 # Только если делается впервые! # mount -t ext3 /dev/mapper/sdc1 /mnt # umount /mnt/ # cryptsetup remove sdc1 # Отсоединить зашифрованный раздел Делайте тоже самое, (без создания fs), что-бы переподключить раздел. При вводе некорректного пароля команда mount не будет выполнена. В таком случае просто удалите отображение sdc1 (cryptsetup remove sdc1 ) и создайте по новой.FreeBSD
Пара популярных модулей для шифрования дисков в , это gbde и geli . Geli более быстрый т.к использует аппаратное ускорение. Смотрите FreeBSD handbook Chapter 18.6 для более подробного описания. Для работы, geli должен быть загружен как модуль ядра, или встроен в него на стадии компиляции. options GEOM_ELI device crypto # Или загрузить в качестве модуля ядра: # echo "geom_eli_load="YES"" >> /boot/loader.conf # Или kldload geom_eliИспользование пароля и ключа
Автор пользуется данными настройками для типичного шифрования разделов, он использует пароль и ключ для шифрования "Master key - основного ключа". Что-бы смонтировать зашифрованный раздел, понадобится и пароль и ключ /root/ad1.key . "Master key " хранится вутри раздела и невидим. Следующий пример типичен для USB или файлового образа.Создаем шифрованный раздел
# dd if=/dev/random of=/root/ad1.key bs=64 count=1 # Этот ключ шифрует Master key # geli init -s 4096 -K /root/ad1.key /dev/ad1 # -s 8192 и OK для дисков # geli attach -k /root/ad1.key /dev/ad1 # DO создает резервную копию /root/ad1.key # dd if=/dev/random of=/dev/ad1.eli bs=1m # Опционально и занимает много времени # newfs /dev/ad1.eli # Создать файловую систему # mount /dev/ad1.eli /mnt # Монтирование шифрованного разделаAttach
# geli attach -k /root/ad1.key /dev/ad1 # fsck -ny -t ffs /dev/ad1.eli # Если есть сомнения, проверьте файловую систему # mount /dev/ad1.eli /mntDetach
Процедура размонтирования производится автоматически при выключении. # umount /mnt # geli detach /dev/ad1.eli/etc/fstab
Монтирование шифрованного раздела можно сконфигурировать через /etc/fstab . Пароль будет запрошен при загрузке. # grep geli /etc/rc.conf geli_devices="ad1" geli_ad1_flags="-k /root/ad1.key" # grep geli /etc/fstab /dev/ad1.eli /home/private ufs rw 0 0Только по паролю
Это более подходящий способ для шифрования флэшки или образа на основе файла, запрашивается только пароль. В данном случае не нужно волноваться о файлах ключей. Процедура напоминает вышеописанную, за исключением создания файлов ключей. Зашифруем образ размером 1 Гб, созданный из файла /cryptedfile . # dd if=/dev/zero of=/cryptedfile bs=1M count=1000 # Создаем 1Гб файл # mdconfig -at vnode -f /cryptedfile # geli init /dev/md0 # Зашифровать только по паролю # geli attach /dev/md0 # newfs -U -m 0 /dev/md0.eli # mount /dev/md0.eli /mnt # umount /dev/md0.eli # geli detach md0.eli Теперь этот образ можно примонтировать на другую машину, просто введя пароль. # mdconfig -at vnode -f /cryptedfile # geli attach /dev/md0 # mount /dev/md0.eli /mntШифрование домашнего каталога обеспечивает надежную защиту данных, хранящихся на жёстком диске или ином носителе. Шифрование особенно актуально на переносных ПК, на компьютерах с множественным доступом, а также в любых других условиях. Шифрование домашнего каталога предлагается при установке Linux Mint.
Основная загвоздка при полном шифровании домашнего каталога состоит в том, что необходимо «вынести» каталог с зашифрованными данными за пределы точки монтирования.
Производительность снижается незначительно, по крайней мере пока не пользуется SWAP. SWAP – это специальный раздел на диске или файл в который операционная система перемещает отдельные блоки оперативной памяти в случае когда оперативной памяти не хватает для работы приложений. SWAP тоже шифруется, если в инсталляторе выбрать шифрование домашнего каталога, и при этом перестает работать спящий режим.
Не шифровать SWAP при шифрованном домашнем каталоге – потенциально опасно, так как там могут оказаться данные из шифрованных файлов в открытом виде – весь смысл шифрования теряется. Начиная с 14-ой версти Linux Mint, при установке есть возможность выбрать вариант шифрования всего диска. Этот вариант наиболее подходит для сохранения персональных данных на переносных устройствах (у которых, как правило, только один пользователь).
1.3 Шифрование в gnome – Seahorse
В Linux Mint есть встроенная утилита «Пароли и ключи» или же Seahorse. Используя её возможности пользователь может оперировать всеми ключами, паролями, а также сертификатами которые имеются в данной ОС.
По сути Seahorse – это приложение для GNOME (GNOME – свободная среда рабочего стола для Unix-подобных операционных систем), являющееся фронтэндом к GnuPG (свободная программа для шифрования информации и создания электронных цифровых подписей) и предназначенное для управления ключами шифрования и паролями. Пришел на замену GNOME Keyring, которого полностью заменил в GNOME 2.22, хотя был анонсирован еще в GNOME 2.18. Позволяет производить все операции которые ранее необходимо делать в командной строке и объединяя их под едиными интерфесом:
управлять безопасностью своей рабочей среды и ключами OpenPGP и SSH;
шифровать, расшировывать и проверять файлы и текст;
добавлять и проверять цифровые подписи к документам;
синхронизировать ключи с ключевыми серверами;
создавать и публиковать ключи;
резервировать ключевую информацию;
добавлять к изображениями в любом поддерживаемом GDK как OpenGPG photo ID;
1.4 TrueCrypt
TrueCrypt обладает достаточно удобным графическим интерфейсом, но, к сожалению, разработчики жестко зашили в код интеграцию с файловым менеджером Nautilus.
Для шифрования данных можно использовать разные методы.
Для начала нужно создать так называемый контейнер, в котором будут содержаться файлопапки, предназначенные для шифрования. Контейнером может служить файл с произвольным названием или даже целый раздел диска. Для доступа к контейнеру необходимо указать пароль, а также можно сделать файл ключа (необязательная опция), с помощью которого будет шифроваться информация. Размер контейнера ограниченный.
Создание зашифрованных разделов/файлов
Создание файл ключа:
truecrypt -create-keyfile /home/user/test/file , где file – название файла-ключа.
Создание контейнера, в данном случае раздела:
sudo truecrypt -k /home/user/test/file -c /dev/sda9
Вместо раздела /dev/sda9 вполне можно указать и файл, например /home/user/test/cryptofile, но в этом случае необходимо будет указать его размер, это делается параметром -size=5G до параметра -c. В указанном примере создастся файл cryptofile размером 5 Гбайт. Иногда TrueCrypt принимает размер только в байтах, для 5 Гбайт можно или высчитать значение заранее и указать -size=5368709120, или же записать следующим образом: -size=`echo 1024^3*5 | bc`.
Для шифрования будет использоваться сделанный уже файл-ключ.
При создании будет предложен выбор типа контейнера (нормальный / скрытый), файловой системы (FAT, ext2/3/4 или без ФС), в данном примере был выбран режим без использования ФС. Также будет предложен выбор алгоритма шифрования (например, AES), а так же hash-алгоритм (например, SHA-1) для шифрования потоков данных.
TrueCrypt используется для шифрования данных налету, то есть можно, подмонтировав контейнер, работать с находящимися в нём файлами как обычно (открывать/редактировать/закрывать/создавать/удалять), что очень удобно.
Шифрованный раздел/файл был создан. Теперь, если необходимо его внутреннюю файловую систему (далее ФС) отформатировать под нужную, следует сделать следующее.
Выбрать необходимый раздел используя Truecrypt:
truecrypt -k /home/user/test/file /dev/sda9
По умолчанию будет задействован созданный Truecrypt девайс /dev/mapper/truecrypt0. По обращению к этому девайсу, можно менять, например ФС в шифрованном контейнере. В данном случае это нужно сделать.
sudo mkfs.ext4 -v /dev/mapper/truecrypt0
Этим самым была сделана ФС ext4 внутри данного шифрованного контейнера.
Далее, так как данный контейнер уже «прикреплён» к девайсу /dev/mapper/truecrypt0, то осталось его просто примонтировать к какой-нибудь директории. Эта директория для монтирования должна уже существовать в системе.
sudo mount /dev/mapper/truecrypt0 /mnt/crypto , где /mnt/crypto – директория, к которой примонтирован шифрованный контейнер.
truecrypt -d
Теперь без знания файла-ключа и пароля никто не сможет прочесть спрятанную информацию.
Каждый из нас хранит на жестком диске изрядное количество конфиденциальной информации. Для кого-то это всего лишь пароли от различных сетевых сервисов, другие ответственны за хранение важной документации, третьи уже не первый год занимаются разработкой инновационной программы. В любом случае, данные необходимо беречь от посторонних, что в нашем мобильном мире сделать довольно проблематично без использования систем шифрования.
Взглянув на список шифрующего ПО для Linux и проанализировав степень популярности и актуальности каждого из них, мы придем к выводу, что есть только четыре безопасные и поддерживаемые криптосистемы для шифрования жестких дисков и других носителей информации на лету:
WARNING
В целях безопасности индексацию зашифрованных разделов лучше отключить, отредактировав конфигурационный файл /etc/updatedb.conf. Файлы, зашифрованные EncFS, не могут иметь жестких ссылок, так как система шифрования привязывает данные не к inode, а к имени файла.
В данной статье я попытаюсь сравнить производительность различных систем шифрования под linux. В теории, конечно, известно, какая система производительнее, и попытки посчитать производительность разных систем были (). Truecrypt даже содержит встроенный бенчмарк (который показывает, однако, производительность на RAM, его можно использовать разве что для оценки скорости разных алгоритмов шифрования). Я же сделаю несколько другое - измерю скорость файловой системы, зашифрованной разными средствами, в процентном соотношении по сравнению с обычной нешифрованной файловой системой.
Шифровать будем отдельный раздел на отдельном HDD, не содержащий корневую файловую систему, алгоритмом, использующимся по-умолчанию в каждом конкретном случае. Как обычный пользователь, я не разбираюсь в нюансах стандартов шифрования (например, чем отличается хэширование RIPEMD-160 от Whirpool, какой из этих режимов быстрее, какой способствует более высокой защите), поэтому просто положимся на то, что производители каждого программного продукта выбрали достаточно криптостойкие параметры по-умолчанию. Может, это и не совсем корректно, т. к. производительность различных алгоритмов шифрования неодинакова. При желании, конечно можно сменить тип шифрования, но я не уверен, что во всех тестируемых продуктах существует абсолютно идентичный набор алгоритмов. Тестировать будем:
3) eCryptfs - система, по умолчанию предлагаемая пользователям Ubuntu для шифрования домашних каталогов, поэтому и включена в данный тест. Работает поверх уже существующей ФС. Шифрует каждый файл отдельно, поэтому всем видны права, даты изменения, количество зашифрованных файлов; по-умолчанию также видны имена файлов, хотя и существует опция для их шифрования. Самое малофункциональное средство из представленных.
4) EncFS - примерный аналог eCryptfs, но использует FUSE.
Итак, для тестов выделена отдельная машина довольно преклонного возраста в следующей конфигурации: ЦП - Intel Celeron 2000Mhz, ОЗУ - 512 Mb DDR PC2700, системный HDD - WD Caviar SE 5400 RPM 80Gb, тестовый HDD - WD Caviar SE 7200 RPM 80Gb.
ОС - Ubuntu 12.04 LTS, версии всего ПО актуальные для репозиториев этой ОС на момент написания статьи (Truecrypt 7.1a-linux-x86 не из репозиториев).
Тестировать будем дефолтную для большинства дистрибутивов файловую систему ext4. Для тестирования производительности будем использовать утилиту iozone3 и написанный «на коленке» shell-скрипт для измерения процентной разницы в тестах.
Скрипт для подсчёта. Особое внимание чистоте кода не уделялось, единственным критерием при написании было наличие правильного результата.
#!/bin/sh
gendifffile () {
#процедура генерирует файл, который удобно анализировать. Во-первых, обрезаются
#не подлежащие анализу строки; во-вторых, в каждой строке обрезаются первых два числа, обозначающие
#размер файла и размер записи соответственно; в-третьих, весь файл выводится построчно -
#один результат теста на одну строку
cat $1 | while read LINE ; do
echo $LINE| grep "^[[:space:]]*[[:digit:]]" | awk "{for (i=3;i<=NF;i++) {print $i}}"
done >> $2
}
getline () {
#процедура выводит строку номер $2 файла $1
head -n $2 "$1" | tail -n 1
}
compare () {
#процедура сравнивает построчно файлы $1 и $2, вычисляя процентную разницу каждой пары тестов
#затем вычисляется среднее арифметическое значение, на сколько процентов быстрее или медленнее
#файл, содержащий первую группу тестов, файла, содержащего вторую группу
P=0
MAX=0
L1=`cat "$1" | wc -l` #количество тестов в файле
L2=`cat "$2" | wc -l`
if [ $L1 -ne $L2 ]; then #если файлы содержат разное количество тестов, то сравнивать их мы не будем
echo error
return
fi
STEP=$(($L1*5/100))
J=0
for I in `seq 1 $L1`; do
J=$(($J+1))
if [ $J -eq $STEP ]; then
J=0
echo "$((100*$I/$L1))% завершено ($I из $L1)"
fi
A=`getline "$1" $I`
B=`getline "$2" $I`
if [ `echo $A \> $B|bc -l` -eq 1 ]; then
D=`echo "100-($B*100/$A)"|bc -l`
if [ `echo $D \> $MAX| bc -l` -eq "1" ]; then
MAX=$D
sleep 5
fi
else
D=`echo "100-($A*100/$B)"|bc -l`
if [ `echo $D \> $MAX| bc -l` -eq "1" ]; then
MAX=$D
sleep 5
fi
D="-$D" #если значение имеет знак "-", значит, данный тест был выполнен быстрее
#во втором файле, а не в первом
fi
P=`echo "$P+$D"| bc -l`
done
P=`echo $P/$L1| bc -l` #вычислим среднее арифметическое
echo PERCENT=$P MAX_PERCENT=$MAX
}
genaverage () {
#процедура генерации подготовленного к анализу файла, каждой строкой которого является
#среднее арифметическое соответствующих строк всех файлов отчётов, лежащих в анализируемой директории
AVG=`mktemp`
F=`ls "$1"|wc -l` #количество файлов с отчётами в заданной директории
#при условии, что там хранятся только такие файлы и больше ничего другого
#проверять корректность данного допущения мы не будем
if [ ! -d "$1" -o $F -lt 2 ]; then
echo error >/dev/stderr #в этой процедуре будем выводить все сообщения в stderr, т.к.
#stdout подставляется в другую процедуру
rm -f $AVG
exit
fi
TMP=`mktemp`
find "$1" -type f| while read FILE; do #для каждого файла отчёта iozone, лежащего в заданной директории
I=`mktemp` #сгенерируем временный файл, подготовленный для анализа
gendifffile "$FILE" "$I" #имена всех таких файлов запишем в "TMP" построчно
echo "$I">>$TMP
done
L=`cat \`getline "$TMP" 1\`|wc -l`
cat "$TMP"| while read LINE; do #немного проверок не помешает
L1=`cat "$LINE"| wc -l` #все ли файлы содержат одинаковое количество тестов
if [ $L -ne $L1 ]; then
echo error >/dev/stderr
exit
fi
done
STEP=$(($L*5/100))
J=0
for I in `seq 1 $L`; do
J=$(($J+1))
if [ $J -eq $STEP ]; then
J=0
echo "$((100*$I/$L))% завершено ($I из $L)" >/dev/stderr
fi
SUMFILE=`mktemp` #таким образом я получаю значение переменной SUM из вложенного цикла
SUM=0
cat "$TMP"| while read LINE; do
SUM=$((`getline "$LINE" $I`+$SUM))
echo $SUM > "$SUMFILE"
done
echo `tail -n 1 "$SUMFILE"`/$F|bc -l >> $AVG #получаем среднее арифметическое
#и запишем его в соответствующее место
#файла AVG
rm -f "$SUMFILE"
done
cat "$TMP"| while read LINE; do #удалим временныe файлы
rm -f "$LINE"
done
rm -f "$TMP"
echo $AVG
}
printf %b "\\033}