Todos los registros locales son almacenados por Zimbra OSE en la carpeta / opt / zimbra / log, y los registros también se pueden encontrar en el archivo /var/log/zimbra.log. El más importante de ellos es mailbox.log. Registra todas las acciones que tienen lugar en el servidor de correo. Entre ellos se encuentran la transmisión de cartas, datos sobre la autenticación de usuarios, intentos de inicio de sesión fallidos y otros. Las entradas en mailbox.log son una cadena de texto que contiene la hora a la que ocurrió el evento, el nivel del evento, el número del flujo dentro del cual ocurrió el evento, el nombre de usuario y su dirección IP, así como la descripción de texto del evento.
El nivel de registro indica el grado en que el evento afecta al servidor. Por defecto, se utilizan 4 niveles de eventos: INFO, WARN, ERROR y FATAL. Analicemos todos los niveles en orden de gravedad creciente.
- INFO — Zimbra OSE.
- WARN — , , . WARN .
- ERROR — , . , .
- FATAL — , - . FATAL .
El archivo de registro del servidor de correo se actualiza todos los días. La última versión del archivo siempre se llama Mailbox.log, mientras que los registros para una fecha determinada tienen una fecha en su nombre y están contenidos en el archivo. Por ejemplo, mailbox.log.2020-09-29.tar.gz. Esto simplifica enormemente la copia de seguridad de los registros de acción y la búsqueda en los registros.
Para comodidad del administrador del sistema, la carpeta / opt / zimbra / log / contiene otros registros. Incluyen solo aquellas entradas que se relacionan con elementos específicos de Zimbra OSE. Por ejemplo, audit.log solo contiene entradas sobre la autenticación de usuarios, clamd.log contiene datos sobre el funcionamiento del antivirus, etc. Por cierto, un método excelente para proteger el servidor Zimbra OSE de intrusos es proteger el servidor mediante Fail2Ban.que solo funciona según audit.log. También es una buena práctica agregar una tarea cron para ejecutar el comando grep -ir "contraseña inválida" /opt/zimbra/log/audit.log para recibir información diaria sobre intentos de inicio de sesión fallidos.
Un ejemplo de cómo una contraseña ingresada dos veces incorrectamente y un intento de inicio de sesión exitoso se muestran en audit.log
Los registros en Zimbra OSE pueden ser extremadamente útiles para determinar las causas de varias fallas críticas. En el momento en que ocurre un error crítico, el administrador generalmente no tiene tiempo para leer los registros. Es necesario restaurar el funcionamiento del servidor lo antes posible. Sin embargo, más tarde, cuando el servidor se está ejecutando nuevamente y genera muchos registros, puede ser difícil encontrar la entrada requerida en un archivo grande. Para encontrar rápidamente el registro de error, es suficiente conocer la hora a la que se reinició el servidor y encontrar una entrada en los registros con fecha para esta hora. El registro anterior será el registro del error que ocurrió. También puede encontrar el mensaje de error buscando la palabra clave FATAL.
Además, los registros de Zimbra OSE le permiten identificar fallas no críticas. Por ejemplo, para buscar excepciones de controlador, puede buscar una excepción de controlador. A menudo, los errores generados por los controladores van acompañados de un seguimiento de la pila, que explica qué causó la excepción. En caso de errores con la entrega de correo, debe comenzar su búsqueda con la palabra clave LmtpServer, y para buscar errores relacionados con los protocolos POP o IMAP, puede usar las palabras clave ImapServer y Pop3Server.
Además, los registros pueden ayudar en la investigación de incidentes de seguridad de la información. Consideremos un ejemplo concreto. El 20 de septiembre, uno de los empleados envió una carta infectada con virus al cliente. Como resultado, los datos en la computadora del cliente estaban encriptados. Sin embargo, el empleado jura que no envió nada. Como parte de la investigación de un incidente, el servicio de seguridad empresarial solicita al administrador del sistema los registros del servidor de correo del 20 de septiembre asociados con el usuario investigado. Gracias al sello de tiempo, el administrador del sistema encuentra el archivo necesario con los registros, extrae la información necesaria y la transfiere al personal de seguridad. Estos, a su vez, lo revisan y descubren que la dirección IP desde la que se envió esta carta coincide con la dirección IP de la computadora del usuario.Las imágenes de CCTV confirmaron que el empleado estaba en su lugar de trabajo cuando se envió la carta. Estos datos fueron suficientes para acusarlo de violar las reglas de seguridad de la información y despedirlo.
Un ejemplo de extracción de registros sobre una de las cuentas del Mailbox.log en un archivo separado.
Todo se vuelve mucho más complicado cuando se trata de una infraestructura multiservidor. Dado que los registros se recopilan localmente, es muy inconveniente trabajar con ellos en una infraestructura de varios servidores y, por lo tanto, es necesario centralizar la recopilación de registros. Esto se puede hacer configurando el host para recopilar registros. No es necesario agregar un host dedicado a la infraestructura. Cualquier servidor de correo puede actuar como un nodo para recopilar registros. En nuestro caso, este será el nodo Mailstore01.
En este servidor, necesitamos ingresar los siguientes comandos:
sudo su – zimbra
zmcontrol stop
exit
sudo /opt/zimbra/libexec/zmfixperms -e -v
Edite el archivo / etc / sysconfig / rsyslog y configure SYSLOGD_OPTIONS = ”- r -c 2 ″
Edite /etc/rsyslog.conf y descomente las siguientes líneas:
$ ModLoad imudp
$ UDPServerRun 514
Ingrese los siguientes 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
Puede comprobar que todo funciona con el comando zmprov gacf | grep zimbraLogHostname. Después de ejecutar el comando, se debe mostrar el nombre del host que recopila los registros. Para cambiarlo, debe ingresar el comando zmprov mcf zimbraLogHostname mailstore01.company.ru.
En todos los demás servidores de infraestructura (LDAP, MTA y otros almacenamientos de correo), ejecute el comando zmprov gacf | grep zimbraLogHostname para ver el nombre del host al que van los registros. Para cambiarlo, también puede ingresar el comando zmprov mcf zimbraLogHostname mailstore01.company.ru
Además, en cada servidor, ingrese los siguientes 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
Después de eso, todos los registros se registrarán en el servidor que especificó, donde se pueden ver cómodamente. También en la consola de administrador de Zimbra OSE en la pantalla con información sobre el estado de los servidores, el servicio Logger en ejecución se mostrará solo en el servidor mailstore01.
Otro dolor de cabeza para un administrador puede ser el seguimiento de un mensaje de correo electrónico específico. Dado que los correos electrónicos en Zimbra OSE pasan por varios eventos diferentes a la vez: verificación por antivirus, antispam, etc., antes de ser recibidos o enviados, para el administrador, si el correo electrónico no llega, puede ser bastante problemático rastrear en qué etapa se perdió. ...
Para resolver este problema, puede utilizar un script especial, que fue desarrollado por el especialista en seguridad de la información Viktor Dukhovny y es recomendado para su uso por los desarrolladores de Postfix. Este script concatena registros de registros para un proceso específico y, debido a esto, le permite mostrar rápidamente todos los registros asociados con el envío de una carta en particular en función de su identificador. Su trabajo ha sido probado en todas las versiones de Zimbra OSE, a partir de la 8.7. Aquí está el texto del guión.
#! /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";
}
El script está escrito en Perl y para ejecutarlo debe guardarlo en el archivo collate.pl , hacerlo ejecutable y luego ejecutar el archivo especificando el archivo de registro y usando pgrep para resaltar la información de identificación de la letra requerida collate.pl /var/log/zimbra.log | pgrep '<20200929164500 \ .user @ mail \ .company \ .ru>' . El resultado será una salida secuencial de líneas que contienen información sobre el movimiento de la carta en el 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 las preguntas relacionadas con Zextras Suite, puede comunicarse con el Representante de la empresa Zextras Ekaterina Triandafilidi por correo electrónico katerina@zextras.com