Todos os logs locais são armazenados pelo Zimbra OSE na pasta / opt / zimbra / log, e os logs também podem ser encontrados no arquivo /var/log/zimbra.log. O mais importante deles é o mailbox.log. Ele registra todas as ações que ocorrem no servidor de correio. Entre eles estão o envio de cartas, dados de autenticação de usuários, tentativas de login malsucedidas, entre outros. As entradas em mailbox.log são uma string de texto que contém a hora em que o evento ocorreu, o nível do evento, o número do stream no qual o evento ocorreu, o nome de usuário e seu endereço IP, bem como a descrição de texto do evento.
O nível de log indica o grau em que o evento afeta o servidor. Por padrão, 4 níveis de eventos são usados: INFO, WARN, ERROR e FATAL. Vamos analisar todos os níveis em ordem crescente de gravidade.
- INFO — Zimbra OSE.
- WARN — , , . WARN .
- ERROR — , . , .
- FATAL — , - . FATAL .
O arquivo de log do servidor de e-mail é atualizado todos os dias. A versão mais recente do arquivo sempre tem o nome Mailbox.log, enquanto os logs de uma determinada data têm uma data no nome e estão contidos no arquivo. Por exemplo, mailbox.log.2020-09-29.tar.gz. Isso simplifica muito o backup dos logs de ação e a pesquisa nos logs.
Para a conveniência do administrador do sistema, a pasta / opt / zimbra / log / contém outros logs. Eles incluem apenas as entradas relacionadas a elementos específicos do Zimbra OSE. Por exemplo, audit.log contém apenas entradas sobre autenticação de usuário, clamd.log contém dados sobre a operação do antivírus e assim por diante. A propósito, um excelente método de proteger o servidor Zimbra OSE de intrusos é proteger o servidor usando Fail2Banque funciona apenas com base em audit.log. Também é uma boa prática adicionar uma tarefa cron para executar o comando grep -ir "senha inválida" /opt/zimbra/log/audit.log para que você possa receber informações diárias sobre tentativas de login malsucedidas.
Um exemplo de como a senha digitada duas vezes incorretamente e a tentativa de login bem-sucedida são exibidos em audit.log
Os registros no Zimbra OSE podem ser extremamente úteis para determinar as causas de várias falhas críticas. No momento em que ocorre um erro crítico, o administrador geralmente não tem tempo para ler os logs. É necessário restaurar a operação do servidor o mais rápido possível. No entanto, posteriormente, quando o servidor estiver em execução novamente e gerar muitos logs, pode ser difícil encontrar a entrada necessária em um arquivo grande. Para encontrar rapidamente um registro de erro, basta saber a hora em que o servidor foi reiniciado e encontrar um registro nos logs dessa hora. O registro anterior será o registro do erro ocorrido. Você também pode encontrar a mensagem de erro pesquisando a palavra-chave FATAL.
Além disso, os logs do Zimbra OSE permitem que você identifique falhas não críticas. Por exemplo, para localizar exceções do manipulador, você pode pesquisar por exceção do manipulador. Freqüentemente, os erros gerados por manipuladores são acompanhados por um rastreamento de pilha, que explica o que causou a exceção. Em caso de erros na entrega do correio, deve-se iniciar sua busca com a palavra-chave LmtpServer, e para buscar erros relacionados aos protocolos POP ou IMAP, pode-se usar as palavras-chave ImapServer e Pop3Server.
Além disso, os logs podem ajudar na investigação de incidentes de segurança da informação. Vamos considerar um exemplo concreto. Em 20 de setembro, um dos funcionários enviou uma carta infectada por vírus ao cliente. Como resultado, os dados no computador do cliente foram criptografados. No entanto, o funcionário jura que não enviou nada. Como parte de uma investigação de incidente, o serviço de segurança corporativa solicita ao administrador do sistema os logs do servidor de e-mail de 20 de setembro associados ao usuário sob investigação. Graças ao carimbo de hora, o administrador do sistema encontra o arquivo necessário com os logs, extrai as informações necessárias e as transfere para o pessoal de segurança. Estes, por sua vez, examinam-na e descobrem que o endereço IP de onde foi enviada esta carta corresponde ao endereço IP do computador do usuário.Imagens de CCTV confirmaram que o funcionário estava em seu local de trabalho quando a carta foi enviada. Esses dados foram suficientes para acusá-lo de violar as regras de segurança da informação e demiti-lo.
Um exemplo de extração de registros sobre uma das contas do Mailbox.log em um arquivo separado
Tudo se torna muito mais complicado quando se trata de infraestrutura de vários servidores. Como os logs são coletados localmente, é muito inconveniente trabalhar com eles em uma infraestrutura de vários servidores e, portanto, é necessário centralizar a coleta de logs. Isso pode ser feito configurando o host para coletar logs. Não há necessidade específica de adicionar um host dedicado à infraestrutura. Qualquer servidor de e-mail pode atuar como um nó para coletar logs. Em nosso caso, esse será o nó Mailstore01.
Neste servidor, precisamos inserir os seguintes comandos:
sudo su – zimbra
zmcontrol stop
exit
sudo /opt/zimbra/libexec/zmfixperms -e -v
Edite o arquivo / etc / sysconfig / rsyslog e defina SYSLOGD_OPTIONS = ”- r -c 2 ″
Edite /etc/rsyslog.conf e descomente as seguintes linhas:
$ ModLoad imudp
$ UDPServerRun 514
Digite os seguintes comandos:
sudo /etc/init.d/rsyslog stop
sudo /etc/init.d/rsyslog start
sudo su – zimbra
zmcontrol start
exit
sudo /opt/zimbra/libexec/zmloggerinit
sudo /opt/zimbra/bin/zmsshkeygen
sudo /opt/zimbra/bin/zmupdateauthkeys
Você pode verificar se tudo está funcionando com o comando zmprov gacf | grep zimbraLogHostname. Depois de executar o comando, o nome do host que coleta os logs deve ser exibido. Para alterá-lo, você deve inserir o comando zmprov mcf zimbraLogHostname mailstore01.company.ru.
Em todos os outros servidores de infraestrutura (LDAP, MTA e outros armazenamentos de correio), execute o comando zmprov gacf | grep zimbraLogHostname para ver o nome do host para o qual os logs vão. Para alterá-lo, você também pode inserir o comando zmprov mcf zimbraLogHostname mailstore01.company.ru
Além disso, em cada servidor, insira os seguintes comandos:
sudo su - zimbra
/opt/zimbra/bin/zmsshkeygen
/opt/zimbra/bin/zmupdateauthkeys
exit
sudo /opt/zimbra/libexec/zmsyslogsetup
sudo service rsyslog restart
sudo su - zimbra
zmcontrol restart
Depois disso, todos os logs serão gravados no servidor que você especificou, onde podem ser convenientemente visualizados. Também no console do administrador do Zimbra OSE na tela com informações sobre o status dos servidores, o serviço Logger em execução será exibido apenas no servidor mailstore01.
Outra dor de cabeça para um administrador pode estar rastreando uma mensagem de e-mail específica. Uma vez que os emails no Zimbra OSE passam por vários eventos diferentes ao mesmo tempo: verificação com antivírus, anti-spam, e assim por diante, antes de serem aceitos ou enviados, para o administrador, se um email não chega, pode ser bastante problemático rastrear em que estágio ele foi perdido ...
Para resolver este problema, você pode usar um script especial que foi desenvolvido pelo especialista em segurança da informação Viktor Dukhovny e é recomendado para uso por desenvolvedores do Postfix. Este script concatena registros de logs para um processo específico e, por isso, permite exibir rapidamente todos os registros associados ao envio de uma determinada carta com base em seu identificador. O seu funcionamento foi testado em todas as versões do Zimbra OSE, a partir da 8.7. Aqui está o texto do roteiro.
#! /usr/bin/perl
use strict;
use warnings;
# Postfix delivery agents
my @agents = qw(discard error lmtp local pipe smtp virtual);
my $instre = qr{(?x)
\A # Absolute line start
(?:\S+ \s+){3} # Timestamp, adjust for other time formats
\S+ \s+ # Hostname
(postfix(?:-[^/\s]+)?) # Capture instance name stopping before first '/'
(?:/\S+)* # Optional non-captured '/'-delimited qualifiers
/ # Final '/' before the daemon program name
};
my $cmdpidre = qr{(?x)
\G # Continue from previous match
(\S+)\[(\d+)\]:\s+ # command[pid]:
};
my %smtpd;
my %smtp;
my %transaction;
my $i = 0;
my %seqno;
my %isagent = map { ($_, 1) } @agents;
while (<>) {
next unless m{$instre}ogc; my $inst = $1;
next unless m{$cmdpidre}ogc; my $command = $1; my $pid = $2;
if ($command eq "smtpd") {
if (m{\Gconnect from }gc) {
# Start new log
$smtpd{$pid}->{"log"} = $_; next;
}
$smtpd{$pid}->{"log"} .= $_;
if (m{\G(\w+): client=}gc) {
# Fresh transaction
my $qid = "$inst/$1";
$smtpd{$pid}->{"qid"} = $qid;
$transaction{$qid} = $smtpd{$pid}->{"log"};
$seqno{$qid} = ++$i;
next;
}
my $qid = $smtpd{$pid}->{"qid"};
$transaction{$qid} .= $_
if (defined($qid) && exists $transaction{$qid});
delete $smtpd{$pid} if (m{\Gdisconnect from}gc);
next;
}
if ($command eq "pickup") {
if (m{\G(\w+): uid=}gc) {
my $qid = "$inst/$1";
$transaction{$qid} = $_;
$seqno{$qid} = ++$i;
}
next;
}
# bounce(8) logs transaction start after cleanup(8) already logged
# the message-id, so the cleanup log entry may be first
#
if ($command eq "cleanup") {
next unless (m{\G(\w+): }gc);
my $qid = "$inst/$1";
$transaction{$qid} .= $_;
$seqno{$qid} = ++$i if (! exists $seqno{$qid});
next;
}
if ($command eq "qmgr") {
next unless (m{\G(\w+): }gc);
my $qid = "$inst/$1";
if (defined($transaction{$qid})) {
$transaction{$qid} .= $_;
if (m{\Gremoved$}gc) {
print delete $transaction{$qid}, "\n";
}
}
next;
}
# Save pre-delivery messages for smtp(8) and lmtp(8)
#
if ($command eq "smtp" || $command eq "lmtp") {
$smtp{$pid} .= $_;
if (m{\G(\w+): to=}gc) {
my $qid = "$inst/$1";
if (defined($transaction{$qid})) {
$transaction{$qid} .= $smtp{$pid};
}
delete $smtp{$pid};
}
next;
}
if ($command eq "bounce") {
if (m{\G(\w+): .*? notification: (\w+)$}gc) {
my $qid = "$inst/$1";
my $newid = "$inst/$2";
if (defined($transaction{$qid})) {
$transaction{$qid} .= $_;
}
$transaction{$newid} =
$_ . $transaction{$newid};
$seqno{$newid} = ++$i if (! exists $seqno{$newid});
}
next;
}
if ($isagent{$command}) {
if (m{\G(\w+): to=}gc) {
my $qid = "$inst/$1";
if (defined($transaction{$qid})) {
$transaction{$qid} .= $_;
}
}
next;
}
}
# Dump logs of incomplete transactions.
foreach my $qid (sort {$seqno{$a} <=> $seqno{$b}} keys %transaction) {
print $transaction{$qid}, "\n";
}
O script é escrito em Perl e para executá-lo você precisa salvá-lo no arquivo collate.pl , torná-lo executável e, em seguida, executar o arquivo especificando o arquivo de log e usando pgrep para destacar as informações de identificação da letra necessária collate.pl /var/log/zimbra.log | pgrep '<20200929164500 \ .user @ mail \ .company \ .ru>' . O resultado será uma saída sequencial de linhas, que contêm informações sobre a movimentação da carta no servidor.
# collate.pl /var/log/zimbra.log | pgrep '<20200929101700\.user@mail\.company\.ru>'
Oct 13 10:17:00 mail postfix/pickup[4089]: 4FF14284F45: uid=1034 from=********
Oct 13 10:17:00 mail postfix/cleanup[26776]: 4FF14284F45: message-id=*******
Oct 13 10:17:00 mail postfix/qmgr[9946]: 4FF14284F45: from=********, size=1387, nrcpt=1 (queue active)
Oct 13 10:17:00 mail postfix/smtp[7516]: Anonymous TLS connection established to mail.*******[168.*.*.4]:25: TLSv1 with cipher ADH-AES256-SHA (256/256 bits)
Oct 13 10:17:00 mail postfix/smtp[7516]: 4FF14284F45: to=*********, relay=mail.*******[168.*.*.4]:25, delay=0.25, delays=0.02/0.02/0.16/0.06, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 878833424CF)
Oct 13 10:17:00 mail postfix/qmgr[9946]: 4FF14284F45: removed
Oct 13 10:17:07 mail postfix/smtpd[21777]: connect from zimbra.******[168.*.*.4]
Oct 13 10:17:07 mail postfix/smtpd[21777]: Anonymous TLS connection established from zimbra.******[168.*.*.4]: TLSv1 with cipher ADH-AES256-SHA (256/256 bits)
Oct 13 10:17:08 mail postfix/smtpd[21777]: 0CB69282F4E: client=zimbra.******[168.*.*.4]
Oct 13 10:17:08 mail postfix/cleanup[26776]: 0CB69282F4E: message-id=zimbra.******
Oct 13 10:17:08 mail postfix/qmgr[9946]: 0CB69282F4E: from=zimbra.******, size=3606, nrcpt=1 (queue active)
Oct 13 10:17:08 mail postfix/virtual[5291]: 0CB69282F4E: to=zimbra.******, orig_to=zimbra.******, relay=virtual, delay=0.03, delays=0.02/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Oct 13 10:17:08 mail postfix/qmgr[9946]: 0CB69282F4E: removed
Para todas as perguntas relacionadas ao Zextras Suite, você pode entrar em contato com o Representante da empresa Zextras Ekaterina Triandafilidi pelo e-mail katerina@zextras.com