Ключевые слова:linux, kernel, crypt, ramdisk, tmpfs, ssl, openssl, (найти похожие документы)
From: Hash <cy-wolf@inbox.ru.>
Newsgroups: http://linux.pk.ru
Date: Mon, 20 May 2005 18:21:07 +0000 (UTC)
Subject: Шифрование данных с хранением временных файлов в рамдиске
Оригинал: http://linux.pk.ru/phorum/read.php?f=5&i=5&t=5
Маниакальное шифрование.
Многим в наше время требуется защита своей информации. Причины могут быть
разные. Существует огромное количество программ шифрования, но все они (по
крайней мере большинство) имеют один существенный недостаток.
Существует потенциальная опасность раскрытия конфеденциальных данных. Дело в том,
что программа шифрования должна хранить незашифрованную копию данных на
диске (если конечно операции чтения/записи не выполняются совместно с
шифрованием/дешифрованием, что отнимает не хило ресурсов)для пользователя и
поэтому существует потенциальная возможность заполучить эту информацию.
Когда к вам врываются в квартиру и попутно вырубают свет, то обратно
зашифровать не остается времени (и электричества :) ), если, конечно,
у вас нету UPS'а.
Но эта проблема отпадает, если хранить незашифрованные данные в
_ЕНЕРГО_ЗАВИСИМОЙ_ПАМЯТИ_ , то бишь в оперативной памяти. После
неожиданного выключения света информация исчезает. Для реализации
этого способа защиты информации в Линуксе вам нужна поддержка ram дисков в
ядре и пакет openssl. Также можно собрать модуль, который называется rd.o , а
исходник соответственно rd.c .
Собрать этот модуль можно поставить m напротив ram disk support в
конфиге ядра и дав команду make modules. После этого переместите этот модуль в
/lib/modules/<версия ядра>/block/. При создании ram диска этот модуль
будет автоматически загружен в память. Теперь отведём объём для нашего
хранилища.
Это делается командой:
dd if=/dev/zero of=/dev/ram1 bs=1k count=4096
где count - размер в килобайтах. Для шифровки/дешифровки я написал два
простеньких скрипта. Назовём их encode и decode.
#!/bin/bash
# Encode
if [ ! -e "$1" ];then
echo "Directory $1 doesn't exist!"
exit 1
fi
echo "Compressing dirctory..."
tar cfz private.tgz $1 # Creating archive and compressing
rm -rf $1
echo "Encoding..."
openssl bf -salt -in private.tgz -out private.tgz.sec #encoding
shred -u private.tgz # Delting strongly
echo "Done."
Вместо bf (BlowFish) в команде openssl можно постаить любой другой
доступный алгоритм шифрования. Подробнее: man openssl
#!/bin/bash
# Decode
if [ ! -e "$1" ];then
echo "File $1 doesn't exist!"
exit 1
fi
echo "Creating file system..."
mke2fs -m 0 /dev/ram1 # making ext2fs
echo "Mounting..."
mount -t ext2 /dev/ram1 /tmp/secret
echo "Decoding..."
openssl bf -d -salt -in $1 -out /tmp/private.tgz
if [ ! -e /tmp/private.tgz ];then
echo "Wrong password!"
exit 1
fi
tar xfz /tmp/private.tgz -C /tmp/secret
shred -u /tmp/private.tgz
echo "Done."
Скопируйте их куда нибудь($HOME/bin) и сделайте исполняемыми (chmod u+x).
Если вы запускаете скрипт дешифровки не из-под root'а, то вам придётся
добавить в /etc/rc.d/rc.local добавить команды создания файловой
системы и её монтирования. Установка suid - бита на скрипт decode ничего не даст
:(
Все! Теперь вы можете быть спокойны за свою информацию во время
неожиданного визита сотрудников спецслужб или других враждебных вам
личностей :) Правда информацию надо часто сохранять. Естественно,
данное решение не подходит для защиты видео и фото материалов не
совсем (совсем не :) этического содержания ввиду их большого размера.
Но для небольших файлов это вполне подходит. Если вы хотите вернуть свою
память обратно выполните команду
dd if=/dev/zero of=/dev/ram1 bs=1k count=0
Благодаря hatred'у был найден ещё один способ решения данной задачи.
Он заключается в использовании tmpfs :
mkdir /tmp/tmpfs
mount -t tmpfs /dev/shm /tmp/tmpfs
...и последующей работе с этим какталогом.
Успехов!
Hash (cy-wolf@inbox.ru)
Большое спасибо Денису Каледину(hannibal@nline.ru) и его статье
"Шифрование отдельных директорий с помощью openssl"
http://linuxshop.ru/linuxbegin/article401.html