Использование шифрованого swap раздела через nfs
Содержание
1 Введение
2 Что потребуется
3 Создание
3.1 Создание swap-раздела
3.2 Конфигурация swap-раздела в первый раз
4 Использование swap раздела при каждой перезагрузке
5 Некоторые вопросы и замечания
6 Дополнительная иформация
Введение
Становится все более и более популярным использование swap раздела с поддержкой шифрования. Однако, это не тривиальная задача для swap разделов подмонтированных с NFS сервера. Поддержка swap раздела подмонтиованного с удаленного NFS сервера может быть включена следующей строчкой в вашем файле etc/fstab:
server:/usr/swapfile none swap sw,-w=8192,nfsmntpt=/swap 0 0
Но содержимое этого swap раздела не будет шифроваться. Однако, мы прибегнем к небольшой хитрости и воспользуемся vnd(4) интерфейсом.
Описанный ниже метод я использую на моей Jornada 680 с ядром 3.99.15
Что нам потребуется
Ядро с поддержкой vnd(4) и cgd(4)
Создание
Создание swap-раздела
Сначала нам нужно создать swap-раздел что бы мы могли его использовать в дальнейшем. Важно, что-бы swap-раздел находился в директории, которая подмонтирована когда запущен скрипт /etc/rc.d/swap2. Также Вы можете определить значение переменной $critical_filesystems_remote.
Теперь выполните команду:
# dd if=/dev/zero of=/usr/swapfile bs=1m count=64
Будет создан 64Мб swap-раздел. Будьте уверены, что он имеет корректные права доступа и атрибуты владельца.
# chown root:wheel /usr/swapfile
# chmod 600 /usr/swapfile
Конфигурация swap раздела в первый раз.
Сейчас мы должны сконфигурировать наш раздел что бы операционная система могла использовать его.
Сконфигурируйте paramsfile для cgd(4).
# cgdconfig -g -o /etc/cgd/swapfile -V none -k randomkey blowfish-cbc
Теперь мы можем сконфигурировать устройство.
# vnconfig vnd0 /usr/swapfile
# cgdconfig cgd0 /dev/vnd0c /etc/cgd/swapfile
Замените имя устройства с /dev/vnd0c на /dev/vnd0d если это необходимо. Разметьте устройство cgd0 при помощи команды
disklabel -I -e cgd0
и на экране терминала Вы увидите примерно следущее:
# /dev/rcgd0c:
type: cgd
disk: cgd
label: default label
flags:
bytes/sector: 512
sectors/track: 2048
tracks/cylinder: 1
sectors/cylinder: 2048
cylinders: 64
total sectors: 131072
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
3 partitions:
# size offset fstype [fsize bsize cpg/sgs]
c: 131072 0 swap # (Cyl. 0 - 63)
Замечание: В зависимости от архитектуры, которую Вы используете, Вам может потребоваться другая схема разбивки раздела.
Например на архитектуре i386 она выглядит так:
a: 131072 0 swap # (Cyl. 0 - 63)
d: 131072 0 unused 0 0 # (Cyl. 0 - 63)
В зависимости от того на каком разделе ваша архитектура использует raw раздел. Получить эту информацию можно следущей командой:
# sysctl kern.rawpartition
kern.rawpartion=3
Создайте бэкап разбивки так, что бы вы смогли его использовать позже.
# disklabel cgd0 > /etc/cgd/swapfile.disklabel
Теперь Вы можете его использовать.
# swapctl -a /dev/cgd0c
Теперь, Вы можете работать с шифруюмым swap разделом через nfs сервер. Для проверки работоспособности выполните следущую команду:
# swapctl -l
Device 512-blocks Used Avail Capacity Priority
/dev/cgd0c 131072 9696 121376 7% 0
Использование swap раздел во время каждой загрузки.
Использование swap раздлела автоматически, во время загрузки немного затруднительно, так как данные о точке монтирования, так как и другая информация не могут быть прописаны в файле /etc/fstab. Но мы можем сделать это подругому. И я уже сделал эту работу для Вас. ;-) Проверьте, что соответствующие переменные в системе установлены правильно. Например, наличие файлов устройств в директории /dev cgd0 и vnd0 ? и значение RAW_PART корректно для вашей архитектуры. Создайте файл /etc/rc.conf.d/swap содержащий следущее.
# Инициилизация cgd через vnd swap.
#
#Замечание Мы НЕ можем вставить данные о swap разделе в файл /etc/fstab
#
# Если это единственный swap раздел который Вы сконфигурировали Вы можете установить
#переменную no_swap=YES в файле rc.conf, с другой стороны система будет "ругаться" при каждой загрузке.
#
#ВАЖНО:
# Файл на который указывает переменная $swapfile должен быть в директории на которую указывает переменная $critical_filesystems_remote. Директория /usr используется по умолчанию.
#
vnd_device="vnd0"
cgd_device="cgd0"
swapfile="/usr/swapfile"
paramsfile="/etc/cgd/swapfile"
swap_disklabel="/etc/cgd/swapfile.disklabel"
RAW_PART="c" # <- измените для вашей архитектуры
SWAP_PART="c" # <- измените на тот раздел который использует disklabel
start_postcmd="cryptovnd_swap"
stop_cmd="cryptovnd_stop" # Заметка: We have to override stop_cmd
cryptovnd_swap()
{
# С момента когда есть только одна swap переменная в файле rc.conf мы должны
# проверить что мы были вызваны из скрипта с именем swap2.
if [ $name = "swap1" ]; then
return
fi
if [ -f $swapfile ]; then
echo "Configuring cgd over vnd swap."
eval `stat -L -s $swapfile`
if [ `echo $st_uid+$st_gid|bc` != 0 ]; then
echo "$swapfile MUST be owned by root and group wheel"
echo "$swapfile not used as swap."
return 1
else
if [ ! -f $swap_disklabel ]; then
echo "No $swap_disklabel."
echo "$swapfile can not be used as swap."
return 1
fi
if [ $st_mode != "0100600" ]; then
echo "$swapfile MUST have permission 600"
echo "$swapfile not used as swap."
return 1
fi
fi
vnconfig $vnd_device $swapfile
cgdconfig $cgd_device /dev/${vnd_device}$RAW_PART $paramsfile
disklabel -R -r $cgd_device $swap_disklabel
swapctl -a /dev/${cgd_device}$SWAP_PART
fi
}
cryptovnd_stop()
{
if [ $name = "swap2" ]; then
swapctl -d /dev/${cgd_device}$SWAP_PART
cgdconfig -u $cgd_device
vnconfig -u $vnd_device
swapctl -U -t noblk
else
swap1_stop
fi
}
Некоторый вопросы и заметки
Не включайте данные об параметрах использованного в примере cgd в файле /etc/cgd/cgd.conf
Может случиться так, что в ядре хватит энтропии для того, что бы инициилизировать swap раздел. Если так происходит, Вы можете добавить пул энтропии вашей NIC карты в файл /etc/rc.conf с /sbin/rndctl -ced ne0, если у вас имеется такая сетевая карты (ne(4) NIC). Если это единственный сконфигурированный swap раздел, то установите переменную no_swap=YES в файле /etc/rc.conf или система будет "ругаться" во время каждой загрузки.
Дополнительная иформация
vnconfig(8) Manpage
cgdconfig(8) Manpage
swapctl(8) Manpage
disklabel(8) Manpage