Como anexar a soma de verificação MD5 do conteúdo de e-mail no bash?

3

Encontrei algumas linhas de saída ausentes de uma notificação de e-mail gerada automaticamente enviada pelo cron. Tendo confirmado que não há nenhum erro AVC, quero descobrir se a integridade do meu email foi comprometida durante o trânsito, anexando uma soma de verificação MD5 do conteúdo do email. Eu tenho o seguinte script que irá gerar o email:

{
  echo -e "\nUptime";
  uptime;

  last -x --since yesterday;
} | mail -s "Info" user

Entendo que posso fazer o seguinte para obter a soma de verificação MD5 separadamente:

{
  echo -e "\nUptime";
  uptime;

  last -x --since yesterday;
} | openssl md5

Mas como faço para combinar a soma de verificação com o conteúdo do email juntos?

    
por Question Overflow 28.02.2015 / 12:35

1 resposta

2

Se você quer uma soma de verificação MD5 especificamente, você poderia enviar o conteúdo para um arquivo e soma de verificação, em seguida, enviar o arquivo e a soma de verificação (com um delimitador) para o correio.

Usando o MD5

Se você quiser usar uma soma MD5, poderá editar seu script para o seguinte, que gravará em um arquivo temporário, gerará a soma de verificação, anexará e enviará o email.

#!/bin/sh

outfile=$(mktemp)
echo -e "\nUptime"                                    > $outfile 2>&1
uptime                                               >> $outfile  2>&1
last -x --since yesterday                            >> $outfile  2>&1

md5=$(md5sum $outfile | cut -f1 -d' ')
echo-e  "\n==============================\n${md5}\n" >> $outfile 2>&1
cat $outfile | mail -s "Info" user

rm $outfile  # don't forget this - clean up your /tmp!

Isto irá capturar todas as mensagens STDERR e STDOUT no arquivo de log e enviá-lo por e-mail com a soma de verificação MD5 adicionada à parte inferior, para que você possa colocar a saída novamente em um arquivo e reconfigurá-la.

Usando o GPG

Como alternativa, você pode criar (ou usar um existente) uma chave GPG que possa ser usada para assinar mensagens provenientes do seu servidor. Dado que isso será configurado para assinar mensagens de forma automatizada, recomendo enfaticamente não usar essa chave para nada que você precise manter em segurança ou precisar ter alta confiança, assim como sua máquina deve ser violada, essa chave será comprometida .

A maneira mais fácil de fazer isso seria gerar uma chave GPG com gpg --gen-key no servidor (ou seja o que for). A maioria dos detalhes não importa, mas um deles é a frase secreta. Com isso, você pode:

  • Definir uma frase secreta em branco ( não recomendado - nunca criar chaves no-pass)
  • Defina a frase secreta e salve no arquivo restrito ( chmod 400 )
  • Defina a passphrase e passe-a no comando GPG

Para este exemplo, mostrarei uma chave que tenha uma frase secreta que tenha sido adicionada a um arquivo com permissões adequadas. Crie sua chave e configure a frase secreta da seguinte forma:

~ » gpg --gen-key
# enter in details for key
    ...
    pub   2048R/B44FD582 2015-02-28 [expires: 2015-03-01]
          Key fingerprint = CFAD 2D53 BB7F CA22 147C  9300 E858 EE8A B44F D582
    uid                  mytestkey (This is my key) <[email protected]>
    sub   2048R/D3AEDE76 2015-02-28 [expires: 2015-03-01]

~ » echo -n 'mypassphrase' > ~/.ssh/gpgsignkey
~ » chmod 400 ~/.ssh/gpgsignkey
~ » gpg -a --export [email protected] > myserver.key.asc

Até agora você terá uma chave em seu servidor que pode ser usada para assinatura, com a frase secreta em um arquivo restrito em um local seguro (~ / .ssh é mantido bem apertado), e você tem a chave pública em myserver.key.asc que você pode importar em sua máquina local para verificar a mensagem recebida.

Você pode então modificar seu cron job para executar um script que executa seu comando e, em seguida, canaliza a saída pelo gpg para assinar a mensagem a caminho do seu servidor de e-mail.

#!/bin/sh

outfile=$(mktemp)
echo -e "\nUptime"                                    > $outfile 2>&1
uptime                                               >> $outfile  2>&1
last -x --since yesterday                            >> $outfile  2>&1

cat $outfile | gpg --clearsign -u [email protected] --passphrase-file /root/.ssh/gpgsignkey | mail -s "Info" user

rm $outfile

Você pode então importar a chave pública para o seu cliente de E-Mail (desde que o suporte) ou outro mecanismo de verificação de chave, e autenticar que a mensagem recebida realmente foi a mensagem que foi enviada.

    
por 28.02.2015 / 12:48

Tags