Шифрование отдельных директорий с помощью OpenSSL

Денис Каледин, 23.07.2003

Рано или поздно перед многими из нас встает проблема конфидециальности данных. Причины и обстоятельства бывают самыми разными - одним домашним компьютером пользуются несколько человек, тогда хочется максимально обезопасить личные данные. Однако чаще всего о криптографической защите данных мы начинаем задумываться в том случае, когда сами эти данные представляют огромный интерес для ваших конкурентов или же правоохранительных органов. Как говорится, когда в ваш дом врывается ФСБ или ФАПСИ, уже можно пожалеть о том, что единственной защитой ваших данных были права доступа "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 по поводу скриптов, экспериментируйте! =)



Источник - LinuxBegin.ru
http://linuxbegin.ru

Адрес этой статьи:
http://linuxshop.ru/linuxbegin/article401.html