Sistema de arquivos criptografado assimetricamente

3

Estou lidando com alguns dados que são regidos por regulamentações específicas e que devem ser tratados de maneira específica.

Eu estou achando que esses dados acabam em alguns dos meus arquivos de log como resultado do funcionamento do sistema como pretendido. Gostaria de encontrar uma maneira de registrar mensagens no servidor que recebe esses dados, mas de forma que os dados sejam criptografados enquanto são gravados no disco e não possam ser descriptografados pelo mesmo servidor.

Meu pensamento é que deveria haver um sistema de arquivos (escrito como um sistema FUSE ou algo assim - estou usando o Linux) que expõe a estrutura de diretórios como texto claro, mas grava o conteúdo dos arquivos de acordo com uma metade de um arquivo assimétrico. conjunto de chaves. Isso permitiria que eu registrasse as mensagens e enfileirasse-as para serem enviadas para um servidor de logs onde a chave de decodificação reside.

A natureza ineficiente (em termos de CPU) da criptografia assimétrica pode inviabilizar isso, mas suspeito que possa haver uma solução por aí. Eu não encontrei nada em minha busca ainda; Existe uma solução lá fora que pode operar da maneira descrita? Obrigado por qualquer dica!

    
por Justin Thomas 29.11.2009 / 07:41

2 respostas

3

Eu recomendaria que você fizesse isso na camada de aplicativos.

Nesse caso, mova o thread para o StackOverflow, no entanto, minha resposta seria aproximadamente:

  • A maneira normal de usar criptografia assimétrica em quantidades significativas de dados (ou seja, em qualquer lugar) é usá-la para criptografar uma chave escolhida aleatoriamente que é usada para criptografar o restante dos dados usando uma cifra simétrica
  • Isso ocorre porque as cifras simétricas são muito mais rápidas e geralmente fazem mais do que você deseja

Eu o criaria de tal forma que o arquivo de log fosse escrito em trechos que contivessem um cabeçalho contendo uma chave criptografada usando uma cifra assimétrica, que seria então usada para criptografar uma certa quantidade de dados usando uma cifra simétrica.

Então, por exemplo, você poderia usar o AES / CBC para os próprios dados de log, o que será bem rápido (além de várias implementações).

Então, de vez em quando, seu aplicativo descarta a chave e inicia um novo "chunk" - assim que a chave é removida, ela não pode mais descriptografar a parte anterior.

Portanto, você pode usar (digamos) o RSA para criptografar (usando uma chave pública) a chave simétrica de um fragmento, que seria escolhida aleatoriamente com segurança para esse fragmento. A chave simétrica permanece na memória por um tempo, até que o pedaço termine e seja eliminado.

Um sistema de arquivos que suportava isso seria de utilidade limitada porque você só poderia montá-lo somente para gravação ou somente leitura; sistemas operacionais normalmente não entendem o conceito de sistemas de arquivos somente de gravação:)

    
por 29.11.2009 / 13:31
1

Eu fiz algumas pesquisas, codificação e documentação; aqui está um link para um cenário de uso ...

link

... escrevi apenas para você e administradores de servidores que enfrentam regulamentações semelhantes. Teste antes de colocar em produção e leia os avisos.

Eu sei que os links, por si só, não são suficientes para responder à pergunta, por isso vou entrar no processo de pensamento por trás da solução proposta.

Como os logs são gravados em poucas linhas por vez, fazendo um sistema de arquivos criptografado unidirecional é um pouco mais kill e fora das habilidades que tenho, em vez disso, o script automatiza a configuração de um específico tipo de arquivo ( mkfifo ) que atua como um pipe nomeado e um conjunto de regras de script que escutam as ações de gravação no arquivo de pipe nomeado. Este par de arquivos, em seguida, gera o terceiro arquivo, aquele que você está pedindo, um arquivo de log anexado criptografado que o host não pode ler. As operações do script são semelhantes a echo 'log message' | gpg -a -r [email protected] >> server.log em execução para cada ação de log, mas com um canal nomeado em vez de | e a lógica do script manipula o gpg'ing e anexa a um arquivo. Usar pipes nomeados em vez de pipes anônimos significa que apenas o caminho de saída do serviço de geração de log precisa ser atualizado para usar o caminho do pipe nomeado, em vez de ser um arquivo padrão para usar as tarefas de criptografia.

Note que há outros recursos que talvez já sejam úteis preparados que permitem criptografar e enviar arquivos de log por e-mail quando atingem um tamanho especificado pelo usuário; esses recursos são separados para permitir que o software IDS / IPS analisar registros ou tornar os logs enviados mais difíceis de espionar quando combinados com criptografia por gravação.

Editar / atualizar: você pode querer verificar o início rápido abreviado para outra pergunta que tenha um escopo mais geral, mas semelhante o suficiente para justificar a inclusão nesta resposta.

link

Editar / Atualizar: parece que os links dentro do markdown no GitHub são muito específicos do navegador, então aqui está uma cópia do primeiro cenário do documento vinculado acima.

Cenário de uso personalizado para o servidor da web

  • Fazer o download e copiar o script para um ${PATH} dir

'' '

git clone https://github.com/S0AndS0/Perinoid_Pipes
cd Perinoid_Pipes
cp Paranoid_Pipes.sh /usr/local/sbin/
chown ${USER}:${USER} /usr/local/sbin/Paranoid_Pipes.sh
chmod 700 /usr/local/sbin/Paranoid_Pipes.sh

'' '

  • Mostrar opções de linha de comando disponíveis & seus valores atuais.

'' '

Paranoid_Pipes.sh --help

'' '

  • Defina opções de linha de comando para gravar um canal nomeado no mesmo sistema de arquivos que o aplicativo do servidor da Web e o analisador de script personalizado no sistema de arquivos de hospedagem.

'' '

Paranoid_Pipes.sh --copy-save-yn='yes'\
 --copy-save-name="/jailer_scripts/website_host/Web_log_encrypter.sh"\
 --copy-save-ownership="notwwwuser:notwwwgroup"\
 --copy-save-permissions='100'\
 --debug-level='6'\
 --listener-quit-string='sOmErAnDoM_sTrInG_wItHoUt_SpAcEs_tHaT_iS_nOt_NoRmAlY_rEaD'\
 --log-level='0'\
 --named-pipe-name="/jailed_servers/website_host/var/log/www/access.log.pipe"\
 --named-pipe-ownership='notwwwuser:wwwgroup'\
 --named-pipe-permissions='420'\
 --output-parse-name="/jailed_logs/website_host/www_access.gpg"\
 --output-parse-recipient="[email protected]"\
 --output-rotate-actions='compress-encrypt,remove-old'\
 --output-rotate-check-requency='25000'\
 --output-rotate-max-bites='8388608'\
 --output-rotate-recipient="[email protected]"\
 --output-rotate-yn='yes'\
 --output-save-yn='yes'\
 --disown-yn='yes' --help

'' '

Observe que se o aplicativo do servidor não estiver em uma cadeia chroot, será necessário modificar os caminhos de arquivo para o pipe nomeado e a cópia do script, porque, acima, pressupõe-se que alguma forma de segregação do sistema de arquivos já tenha sido implementada. Remova o --help acima para que o script execute ações em vez de imprimir os valores atuais das opções da linha de comando.

O caminho do arquivo de pipe nomeado (o caminho do arquivo --named-pipe-name ) deve ser adicionado manualmente ao caminho de log do seu servidor web, isso é diferente para cada daemon / servidor, de forma que os dados registrados dos clientes normais sejam gravados no arquivo de pipe nomeado .

A cópia do script (salva em --copy-save-name caminho do arquivo) é o que faz a magia escutando as ações de gravação em seu arquivo de pipe nomeado relacionado, envia linhas registradas pelo GnuPG e anexa os resultados ( usando a chave pública para --output-parse-recipient para criptografia inicial) no arquivo especificado pela opção de linha de comando --output-parse-name .

O arquivo de log criptografado resultante é monitorado quanto ao tamanho do arquivo e quando isso e o contador de gravação são grandes o suficiente, o arquivo de log é criptografado novamente usando a chave pública para --output-rotate-recipient e movido / renomeado.

Se o seu servidor puder enviar e-mails, modifique as opções --output-rotate-actions para incluir email como uma ação válida e os logs duplamente criptografados serão eventualmente transferidos.

Observe que, se você usar duas chaves públicas diferentes para criptografia, precisará das chaves privadas relacionadas a serem aplicadas na ordem correta de descriptografia.

    
por 06.10.2016 / 00:11