Ключевые слова:crypt, ssl, fs, (найти похожие документы)
From: Денис Каледин <hannibal at nline ru>
Date: Mon, 24 Jul 2003 14:31:37 +0000 (UTC)
Subject: Шифрование отдельных директорий с помощью OpenSSL
Шифрование отдельных директорий с помощью OpenSSL
- -------------------------------------------------
Рано или поздно перед многими из нас встает проблема конфидециальности
данных. Причины и обстоятельства бывают самыми разными - одним домашним
компьютером пользуются несколько человек, тогда хочется максимально
обезопасить личные данные. Однако чаще всего о криптографической защите
данных мы начинаем задумываться в том случае, когда сами эти данные
представляют огромный интерес для ваших конкурентов или же
правоохранительных органов. Как говорится, когда в ваш дом врывается ФСБ или
ФАПСИ, уже можно пожалеть о том, что единственной защитой ваших данных были
права доступа "600". ;)
Однако это все лирика. Современные криптографические средства для *NIX
платформ зачастую предлагают нам шифрование единичных файлов, либо партиций.
В последнем случае все осложняется необходимостью пропатчивания и пересборки
ядра, для поддержки всевозможных EFS/EVFS (Encrypted FileSystem / Encrypted
Virtual FileSystem). Часто данные решения подходят только для определенной
официальной версии исходников ядра, т.е. пропатчить ядро от Alan Cox,
например, может не получиться. Шифрование единичных файлов не совсем удобно,
однако, за основу я беру именно этот путь.
Я столкнулся с необходимостью шифрования отдельных директорий, к примеру
/home/user/stuff, без значительных на это временных затрат, т.е. выполнение
простенького скрипта, как для шифровки, так и для дешифровки данных. В
идеале - шифрование директории /home/user, например, при выходе пользователя
из системы, однако, об этом в следующий раз.
Убедитесь, что у вас установлен пакет OpenSSL, и можем начинать. Я пошел
простым путем: для шифрования, пользователь вводит команду: sslenc
<директория> <шифр>
ВНИМАНИЕ! Необходимо указывать путь к директории полностью, т.к.
дальнейшая работа ведется в каталоге /tmp.Скрипт sslenc с помощью
команды tar сжимает директорию, затем командой openssl шифрует полученный
файл заданным шифром. Если все ОК, содержимое исходной директории очищается
и туда помещается зашифрованный tarball. Незашифрованный tarball рекомендуется
удалять вручную, однако, если вы уверены в своих действиях, эту команду
можно включить в скрипт (в моем скрипте она включена). Помнить необходимо
две вещи - использованный шифр и пароль, который попросит задать команда
openssl. Ниже приведен мой вариант скрипта sslenc:
<--------start script--------->
#!/bin/bash
# OpenSSL directory encryption script.
# 2003 Denis A. Kaledin, <hannibal at nline dot ru>
cd /tmp
if [ ! -e "$1" ]; then
echo "Directory not found!"
exit 1
else
echo "Preparing to encrypt directory "$1"..."
fi
if [ "$2" = "base64" ] || [ "$2" = "bf-cbc" ] || [ "$2" = "bf" ] || \
[ "$2" = "bf-cfb" ] || [ "$2" = "bf-ecb" ] || [ "$2" = "bf-ofb" ] || \
[ "$2" = "cast-cbc" ] || [ "$2" = "cast" ] || [ "$2" = "cast5-cbc" ] || \
[ "$2" = "cast5-cfb" ] || [ "$2" = "cast5-ecb" ] || [ "$2" = "cast5-ofb" ] || \
[ "$2" = "des-cbc" ] || [ "$2" = "des" ] || [ "$2" = "des-cfb" ] || \
[ "$2" = "des-ofb" ] || [ "$2" = "des-ecb" ] || [ "$2" = "des-ede-cbc" ] || \
[ "$2" = "des-ede" ] || [ "$2" = "des-ede-cfb" ] || [ "$2" = "des-ede-ofb" ] ||\
[ "$2" = "des-ede3-cbc" ] || [ "$2" = "des-ede3" ] || [ "$2" = "des3" ] || \
[ "$2" = "des-ede3-cfb" ] || [ "$2" = "des-ede3-ofb" ] || [ "$2" = "desx" ] || \
[ "$2" = "rc2-cbc" ] || [ "$2" = "rc2" ] || [ "$2" = "rc2-cfb" ] || \
[ "$2" = "rc2-ecb" ] || [ "$2" = "rc2-ofb" ] || [ "$2" = "rc2-64-cbc" ] || \
[ "$2" = "rc2-40-cbc" ] || [ "$2" = "rc4" ] || [ "$2" = "rc4-40" ] || \
[ "$2" = "aes-128-cbc" ] || [ "$2" = "aes-128-ecb" ] || [ "$2" = "aes-192-cbc" ] || \
[ "$2" = "aes-192-ecb" ] || [ "$2" = "idea" ] || [ "$2" = "aes-256-cbc" ] || \
[ "$2" = "aes-256-ecb" ] || [ "$2" = "rc5" ]; then
echo "Good...loading "$2" algorithm"
else
echo "Cipher "$2" is not supported by OpenSSL!"
exit 1
fi
echo "Encrypting "$1" directory with "$2" cipher..."
tar -cvvf encrypted.tar "$1"/ -P
/usr/bin/openssl "$2" -salt -in encrypted.tar -out encrypted.tar.sec
if [ ! -e encrypted.tar.sec ]; then
echo "Incorrect password!"
exit 1
else
rm -Rf "$1"/
mkdir "$1"
mv encrypted.tar.sec "$1"/
rm encrypted.tar
echo "Directory "$1" has been encrypted with "$2" cipher!"
fi
<-------end script-------->
Итак, теперь в /home/user/stuff у нас лежит зашифрованный tarball. Для его
расшифровки пользователь вводит команду: ssldec <директория> <шифр>, вводит
пароль. Опять же, путь к директории должен быть полным! Программа openssl
расшифрует файл, затем команда tar расворачивает его в исходной директории.
Зашифрованный tarball, опять же, можно удалять руками, а можно с помощью
скрипта.
Вот мой вариант скрипта ssldec:
<------start script------->
#!/bin/bash
# OpenSSL directory decryption.
# 2003 Denis A. Kaledin <hannibal at nline dot ru>
cd /tmp
if [ "$2" = "base64" ] || [ "$2" = "bf-cbc" ] || [ "$2" = "bf" ] || \
[ "$2" = "bf-cfb" ] || [ "$2" = "bf-ecb" ] || [ "$2" = "bf-ofb" ] || \
[ "$2" = "cast-cbc" ] || [ "$2" = "cast" ] || [ "$2" = "cast5-cbc" ] || \
[ "$2" = "cast5-cfb" ] || [ "$2" = "cast5-ecb" ] || [ "$2" = "cast5-ofb" ] || \
[ "$2" = "des-cbc" ] || [ "$2" = "des" ] || [ "$2" = "des-cfb" ] || \
[ "$2" = "des-ofb" ] || [ "$2" = "des-ecb" ] || [ "$2" = "des-ede-cbc" ] || \
[ "$2" = "des-ede" ] || [ "$2" = "des-ede-cfb" ] || [ "$2" = "des-ede-ofb" ] ||\
[ "$2" = "des-ede3-cbc" ] || [ "$2" = "des-ede3" ] || [ "$2" = "des3" ] || \
[ "$2" = "des-ede3-cfb" ] || [ "$2" = "des-ede3-ofb" ] || [ "$2" = "desx" ] || \
[ "$2" = "rc2-cbc" ] || [ "$2" = "rc2" ] || [ "$2" = "rc2-cfb" ] || \
[ "$2" = "rc2-ecb" ] || [ "$2" = "rc2-ofb" ] || [ "$2" = "rc2-64-cbc" ] || \
[ "$2" = "rc2-40-cbc" ] || [ "$2" = "rc4" ] || [ "$2" = "rc4-40" ] || \
[ "$2" = "aes-128-cbc" ] || [ "$2" = "aes-128-ecb" ] || [ "$2" = "aes-192-cbc" ]|| \
[ "$2" = "aes-192-ecb" ] || [ "$2" = "idea" ] || [ "$2" = "aes-256-cbc" ] || \
[ "$2" = "aes-256-ecb" ] || [ "$2" = "rc5" ]; then
echo "Muy bien....preparing to decrypt"
else
echo "Cipher "$2" is not supported by OpenSSL!"
exit 1
fi
if [ ! -e "$1"/encrypted.tar.sec ]; then
echo "There is nothing to decrypt!"
exit 1
else
echo "Decrypting encrypted.tar.sec..."
cp "$1"/encrypted.tar.sec /tmp
/usr/bin/openssl "$2" -d -salt -in "$1"/encrypted.tar.sec -out encrypted.tar
rm -Rf "$1"/
tar -xvvf encrypted.tar -P
if [ ! -e "$1"/ ]; then
echo "Invalid password!"
mkdir "$1"
cp encrypted.tar.sec "$1"/encrypted.tar.sec
exit 1
else
rm encrypted.tar
echo "Directory "$1" has been successfully decrypted."
fi
fi
<------end script-------->
Вот, собственно, и все. Скрипты можно положить в /usr/bin или /usr/local/bin
и начинать экспериментировать.
P.S. Конфидециальную информацию имеет смысл хранить на партиции с
журналируемой файловой системой, т.к. это сводит к нулю шансы злоумышленника
воспользоваться утилитами типа undelete. ReiserFS в этом плане оптимальна,
можно Ext3. По поводу XFS и JFS ничего сказать не могу, не в курсе. Параноики
после процесса зашифровки могут произвести какие-либо действия на диске,
например покопировать или постирать файлы, это сделает восстановление
невозможным.
P.P.S. Список доступных алгоритмов шифрования - команда 'openssl help' . По
умолчанию, бинарные пакеты OpenSSL не включают в себя достаточно мощные
шифры - IDEA и RC5. Если вы не страдаете помешательством на почве соблюдения
патентов, доставайте исходники с http://www.openssl.org/ и пересобирайте
руками с теми алгоритмами, которые считаете необходимыми.
Хотелось бы получить feedback по поводу скриптов, экспериментируйте! =)
Денис Каледин, 23.07.2003
hannibal at nline ru
Toze samoje mozno sdelat' 4ere gpg/pgp, no ne v etom cyt'. Cyt' v tom 4to glypo raspakovivat'/zapakovivat' tar-arxiv.
Esli trydno propatchit' jadro, to est' encryption 4erez NFS(ported to linux from BSD).
BTW, nazvanije stat'i oshibo4'no - re4' idet o encrypted tar-arxiv, a ne o encrypted dir's/hdd
Большая дыра в этой "защите" то, что данные необходимо расшифровывать. Т.е. они фигурируют незашифрованными. Даже если их потом шифровать, то часть информации можно будет найти в .bak-файлах, дампах ядра, просто в уцелевших секторах диска. Кроме того, данные можно подглядеть, пока они не зашифрованы. Вобщем, уровень защиты стремится к нулю.
Так можно защищать только backupы или что-то ещё, что распаковывать не придётся никогда.
На мой взгляд, если есть необходимость зашифровать данные (без разницы дир или отдельные файлы), проще создать закриптованную партицию (с криптофс)
и переместить туда всё - что необходимо. И работать в последующем с этими данными уже с этой криптофс-партиции