Назад | Перейти на главную страницу

расшифровывать файлы AES в модуле apache?

У меня есть клиент с политика безопасности требование соответствия зашифровать определенные файлы на диске. Очевидный способ сделать это с помощью Устройство-сопоставитель и модуль шифрования AES Однако текущая система, которая уже существует, настроена на создание отдельных зашифрованных файлов.

В основном у них есть сервер apache, использующий SSL и аутентификацию в базовом / дайджест-стиле, и им необходимо расшифровать зашифрованные файлы с AES на диске, прежде чем повторно зашифровать их с помощью SSL. (очевидно, я могу использовать mod_php, mod_perl, однако идея заключалась в том, чтобы хранить статические файлы только в этом поле)

Есть ли у меня варианты дешифрования файлов на лету в apache?

я вижу это mod_ssl и mod_session_crypto делать шифрование / дешифрование или что-то подобное, но не совсем то, что мне нужно, поскольку они являются шифрованием по сети, и я ищу шифрование на диске.

Я мог представить, что PerlSetOutputFilter будет работать с подходящим настроенным сценарием Perl, и я также вижу mod_ext_filter, поэтому я могу просто создать команду unix и расшифровать файл, но они оба кажутся взломанными.

Я немного удивлен, что mod_crypto недоступен ... или мне здесь не хватает чего-то очевидного?

По-видимому, с точки зрения ресурсов фильтр Perl - это правильный путь?

Это серьезная проблема. Я был в подобных ситуациях, когда от меня требовалось решить проблему неправильно. При этом я не знаю криптографического модуля общего назначения, который позволил бы вам расшифровывать статические файлы по мере их обслуживания. Я искал несколько часов, но ничего не нашел. Это не удивительно, поскольку кажется, что это довольно специализированная проблема.

Тем не менее, я вижу несколько вариантов.

  1. Напишите свой собственный модуль C и реализуйте его как обработчик фильтра.
  2. Использовать mod_ext_filter и внешний исполняемый файл1 расшифровать файл.
  3. Если все файлы имеют определенное расширение, добавить обработчик для вызова сценария CGI для расшифровки и обслуживания файла. Например, Action decrypt /cgi-bin/decrypt.pl и AddHandler decrypt .html приведет к тому, что все запросы для файлов, заканчивающихся на .html, будут вызывать /cgi-bin/decrypt.pl, который должен будет прочитать, расшифровать и обслужить файл. Видеть http://httpd.apache.org/docs/current/handler.html#examples.
  4. Используйте mod_php и mod_rewrite для прозрачного дешифрования и обслуживания статических файлов любого типа из одного или нескольких определенных мест.

Я взял на себя смелость реализовать доказательство концепции четвертого варианта, которым я поделюсь здесь. В данном случае я выбрал 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:

Однако это не приведет к кодированию файлов в зашифрованном архиве. Он передает только зашифрованный файл и обеспечивает уровень аутентификации и авторизации для доступа к файлу.