descriptografa arquivos AES em um módulo do apache?

2

Eu tenho um cliente com um requisito de conformidade com política de segurança para criptografar determinados arquivos no disco . A maneira óbvia de fazer isso é com Device-mapper e um módulo de criptografia AES . No entanto, o sistema atual que já está em vigor é configuração para gerar arquivos individuais que são criptografados.

Basicamente, eles têm um servidor apache usando SSL e autenticação de estilo básico / digest e precisam descriptografar arquivos criptografados do AES em disco, antes de criptografá-los novamente com um SSL. (obviamente eu posso usar mod_php, mod_perl, no entanto a idéia era manter arquivos estáticos apenas nesta caixa)

Eu tenho alguma opção para descriptografar arquivos on-the-fly no apache?

Eu vejo que mod_ssl e mod_session_crypto fazem criptografia / descriptografia ou algo semelhante, mas não exatamente o que eu estou procurando, pois são criptografias on-the-wire e estou procurando criptografia on-line disco.

Eu poderia imaginar que um PerlSetOutputFilter funcionaria com um script Perl adequado configurado, e eu também veria o mod_ext_filter para que eu pudesse apenas bifurcar um comando unix e descriptografar o arquivo, mas ambos se sentem como um hack.

Eu estou surpreso que não há mod_crypto disponível ... ou estou faltando algo óbvio aqui?

Presumivelmente, em termos de recursos, o filtro perl é o caminho a seguir?

    
por Tom H 22.03.2012 / 23:42

3 respostas

1

Este é um problema fascinante. Eu tenho estado em situações semelhantes, onde fui obrigado a resolver um problema da maneira errada. Dito isto, não tenho conhecimento de um módulo de criptografia de uso geral que permita a você descriptografar arquivos estáticos enquanto são exibidos. Eu procurei por várias horas, mas não consegui encontrar nada. Isso não é surpreendente, pois parece um problema bastante especializado.

No entanto, vejo várias opções.

  1. Escreva seu próprio módulo C e implemente-o como um manipulador de filtro.
  2. Use mod_ext_filter e um executável externo 1 para descriptografar arquivo.
  3. Se todos os arquivos tiverem uma extensão específica, adicione um manipulador para chamar um script CGI para descriptografar e servir o arquivo. Por exemplo, Action decrypt /cgi-bin/decrypt.pl e AddHandler decrypt .html farão com que todas as solicitações de arquivos terminados em .html chamem /cgi-bin/decrypt.pl, que precisará ler, descriptografar e exibir o arquivo. Consulte o link .
  4. Use mod_php e mod_rewrite para descriptografar e exibir transparentemente arquivos estáticos de qualquer tipo de um ou mais localizações mais específicas.

Tomei a liberdade de implementar uma prova de conceito da quarta opção que compartilharei aqui. Eu escolhi o PHP neste exemplo porque é onipresente, ele geralmente contém as funções de criptografia necessárias, e é rápido, já que é um módulo do Apache escrito em C.

Supondo que todos os arquivos criptografados estejam armazenados em um diretório chamado data e sejam criptografados usando a mesma chave, criei o diretório na raiz do meu documento e criei um arquivo criptografado usando o OpenSSL.

cd /var/www
mkdir data
echo 'This is my plaintext content.' | openssl aes-256-cbc -a -k secret -out data/test.txt

Em seguida, criei decrypt.php no meu documento raiz com o seguinte conteúdo:

<?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);
}
?>

Se o seu conteúdo não for codificado em base64, você poderá remover a primeira linha da função de decriptografia que ler $encrypted_data = base64_decode($encrypted_data); .

Finalmente, na minha configuração do Apache, adicionei as seguintes entradas:

<directory /var/www/>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME}    -f
    RewriteRule ^data/                 /decrypt.php  [L]
</directory>

Agora, qualquer arquivo solicitado de http://www.example.com/data será descriptografado e exibido, inclusive de subdiretórios. Como a condição de reescrita está limitando a reescrita aos arquivos, os índices de diretório ainda funcionam. Eu tenho o script PHP determinar o tipo MIME do conteúdo descriptografado e atualizar o cabeçalho de acordo para que eu possa servir imagens criptografadas, documentos, páginas da web e assim por diante.

Isso provavelmente não será tão rápido quanto um módulo personalizado do Apache, mas deve estar próximo. Se você estiver indo para servir um monte de conteúdo criptografado e desempenho é um problema, você pode ser capaz de acelerar um pouco as coisas, instalando o Cache PHP Alternativo para que a página PHP não precise ser compilada para cada solicitação.

Por favor, tenha em mente que você pode precisar aumentar as configurações para o uso de memória do PHP se você estiver descriptografando arquivos grandes.

1 Você disse que sente que esta opção é um hack. Por quê? Embora o resultado possa ser lento, mod_ext_filter é um módulo principal suportado e fará o trabalho assim que você escrever um programa de filtro para ser usado.

2 Eu pedi emprestada a função decrypt () do link .

    
por 25.09.2012 / 22:06
0

Se estiver protegendo os arquivos que você procura e fornecendo uma rota de comércio segura, talvez seja melhor pesquisar no webdav protegido com mod_ssl:

No entanto, isso não codificará arquivos em um arquivo criptografado. Ele só transferirá o arquivo criptografado e fornecerá um nível de autenticação e autorização para acesso ao arquivo.

    
por 23.03.2012 / 19:21
0

Não role sua própria criptografia . Apenas não faça. Você nunca pode ter certeza de que é seguro, e o primeiro que você ouvirá a respeito disso será quando o Anonymous publicar seus segredos da empresa no Pastebin.

Use as ferramentas que já existem (por exemplo, dm-crypt / LUKS para sistemas Linux ou BitLocker para sistemas Windows). Eles são bem compreendidos e qualquer auditor de segurança razoável saberá quais são e que eles trabalham.

Se o auditor de segurança insistir nessa configuração abaixo do ideal, envie-os para a incompetência .

    
por 25.09.2012 / 23:24