У меня есть клиент с политика безопасности требование соответствия зашифровать определенные файлы на диске. Очевидный способ сделать это с помощью Устройство-сопоставитель и модуль шифрования AES Однако текущая система, которая уже существует, настроена на создание отдельных зашифрованных файлов.
В основном у них есть сервер apache, использующий SSL и аутентификацию в базовом / дайджест-стиле, и им необходимо расшифровать зашифрованные файлы с AES на диске, прежде чем повторно зашифровать их с помощью SSL. (очевидно, я могу использовать mod_php, mod_perl, однако идея заключалась в том, чтобы хранить статические файлы только в этом поле)
Есть ли у меня варианты дешифрования файлов на лету в apache?
я вижу это mod_ssl и mod_session_crypto делать шифрование / дешифрование или что-то подобное, но не совсем то, что мне нужно, поскольку они являются шифрованием по сети, и я ищу шифрование на диске.
Я мог представить, что PerlSetOutputFilter будет работать с подходящим настроенным сценарием Perl, и я также вижу mod_ext_filter, поэтому я могу просто создать команду unix и расшифровать файл, но они оба кажутся взломанными.
Я немного удивлен, что mod_crypto недоступен ... или мне здесь не хватает чего-то очевидного?
По-видимому, с точки зрения ресурсов фильтр Perl - это правильный путь?
Это серьезная проблема. Я был в подобных ситуациях, когда от меня требовалось решить проблему неправильно. При этом я не знаю криптографического модуля общего назначения, который позволил бы вам расшифровывать статические файлы по мере их обслуживания. Я искал несколько часов, но ничего не нашел. Это не удивительно, поскольку кажется, что это довольно специализированная проблема.
Тем не менее, я вижу несколько вариантов.
Action decrypt /cgi-bin/decrypt.pl
и AddHandler decrypt .html
приведет к тому, что все запросы для файлов, заканчивающихся на .html, будут вызывать /cgi-bin/decrypt.pl, который должен будет прочитать, расшифровать и обслужить файл. Видеть http://httpd.apache.org/docs/current/handler.html#examples.Я взял на себя смелость реализовать доказательство концепции четвертого варианта, которым я поделюсь здесь. В данном случае я выбрал PHP, потому что он повсеместен, обычно содержит необходимые криптографические функции и работает быстро, поскольку это модуль Apache, написанный на C.
Предполагая, что все зашифрованные файлы хранятся в каталоге с именем data
и зашифрованы с использованием того же ключа, я создал каталог в корне документа, а затем создал зашифрованный файл с помощью OpenSSL.
cd /var/www
mkdir data
echo 'This is my plaintext content.' | openssl aes-256-cbc -a -k secret -out data/test.txt
Затем я создал decrypt.php
в корне моего документа со следующим содержанием:
<?php
# NOTE: This is proof-of-concept code. You should audit it for security before
# using it in a production environment.
# The key to use to decrypt the files
$key = 'secret';
$filename = $_SERVER["DOCUMENT_ROOT"] . htmlspecialchars($_SERVER['REQUEST_URI']);
$data = file_get_contents($filename);
$plaintext = decrypt($key, $data);
# Determine the MIME type of the decrypted content
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$content_type = finfo_buffer($finfo, $plaintext);
finfo_close($finfo);
header("Content-type: $content_type");
print $plaintext;
function decrypt($password, $encrypted_data) {
$encrypted_data = base64_decode($encrypted_data);
$salt = substr($encrypted_data, 8, 8);
$cyphertext = substr($encrypted_data, 16);
$password = $password . $salt;
$md5_hash = array();
$md5_hash[0] = md5($password, true);
$result = $md5_hash[0];
$rounds = 3;
for ($i = 1; $i < $rounds; $i++) {
$md5_hash[$i] = md5($md5_hash[$i - 1] . $password, true);
$result .= $md5_hash[$i];
}
$key = substr($result, 0, 32);
$iv = substr($result, 32,16);
return openssl_decrypt($cyphertext, 'aes-256-cbc', $key, true, $iv);
}
?>
Если ваш контент не закодирован в base64, вы можете удалить первую строку в функции дешифрования, которая читает $encrypted_data = base64_decode($encrypted_data);
.
Наконец, в моей конфигурации Apache я добавил следующие записи:
<directory /var/www/>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^data/ /decrypt.php [L]
</directory>
Теперь любой файл, запрошенный у http://www.example.com/data
будут расшифрованы и обслужены, в том числе из подкаталогов. Поскольку условие перезаписи ограничивает перезапись файлами, индексы каталогов по-прежнему работают. У меня есть скрипт PHP, который определяет MIME-тип расшифрованного содержимого и соответствующим образом обновляет заголовок, чтобы я мог обслуживать зашифрованные изображения, документы, веб-страницы и т. Д.
Вероятно, это будет не так быстро, как настраиваемый модуль Apache, но должно быть близко. Если вы собираетесь обслуживать большой объем зашифрованного контента, а производительность является проблемой, вы можете немного ускорить процесс, установив Альтернативный кеш PHP поэтому страницу PHP не нужно компилировать для каждого запроса.
Имейте в виду, что вам может потребоваться увеличить настройки использования памяти PHP, если вы расшифровываете большие файлы.
1 Вы сказали, что считаете этот вариант взломом. Зачем? Хотя результат может быть медленным, mod_ext_filter является поддерживаемым основным модулем и выполнит свою работу после того, как вы напишете для него программу фильтрации.
2 Я позаимствовал функцию decrypt () из http://us3.php.net/manual/en/function.openssl-decrypt.php#107210.
Не катите собственную криптовалюту. Только не надо. Вы никогда не можете быть уверены, что он безопасен, и первое, что вы услышите о его взломе, - это когда Anonymous публикует секреты вашей компании на Pastebin.
Используйте уже существующие инструменты (например, dm-crypt / LUKS для систем Linux или BitLocker для систем Windows). Они хорошо изучены, и любой разумный аудитор безопасности будет знать, что это такое и что они работают.
Если аудитор безопасности настаивает на этой неидеальной настройке, уволите их за некомпетентность.
Если он защищает файлы, которые вам нужны, и обеспечивает безопасный торговый маршрут, вы можете изучить защищенный webdav w / mod_ssl:
Однако это не приведет к кодированию файлов в зашифрованном архиве. Он передает только зашифрованный файл и обеспечивает уровень аутентификации и авторизации для доступа к файлу.