Como traballar cos rexistros de Zimbra OSE

O rexistro de todos os eventos que ocorren é unha das funcións máis importantes de calquera sistema corporativo. Os rexistros permítenche resolver problemas emerxentes, auditar o funcionamento dos sistemas de información e tamén investigar incidentes de seguridade da información. Zimbra OSE tamén mantén rexistros detallados do seu funcionamento. Inclúen todos os datos desde o rendemento do servidor ata o envío e a recepción de correos electrónicos por parte dos usuarios. Non obstante, ler os rexistros xerados por Zimbra OSE é unha tarefa pouco trivial. Neste artigo, usando un exemplo específico, dirémosche como ler os rexistros de Zimbra OSE, así como como facelos centralizados.

Como traballar cos rexistros de Zimbra OSE
Zimbra OSE almacena todos os rexistros locais no cartafol /opt/zimbra/log, e os rexistros tamén se poden atopar no ficheiro /var/log/zimbra.log. O máis importante deles é mailbox.log. Rexistra todas as accións que ocorren no servidor de correo. Estes inclúen a transmisión de correos electrónicos, datos de autenticación de usuarios, intentos fallidos de inicio de sesión e outros. As entradas en mailbox.log son unha cadea de texto que contén a hora na que ocorreu o evento, o nivel do evento, o número de fío no que ocorreu o evento, o nome de usuario e o enderezo IP, así como unha descrición de texto do evento. .

Como traballar cos rexistros de Zimbra OSE

O nivel de rexistro indica o grao de influencia do evento no funcionamento do servidor. Por defecto hai 4 niveis de eventos: INFO, WARN, ERROR e FATAL. Vexamos todos os niveis en orde crecente de gravidade.

  • INFORMACIÓN - Os eventos deste nivel adoitan estar destinados a informar sobre o progreso de Zimbra OSE. As mensaxes deste nivel inclúen informes sobre a creación ou eliminación dunha caixa de correo, etc.
  • ADVERTENCIA: os eventos deste nivel informan sobre situacións potencialmente perigosas, pero que non afectan o funcionamento do servidor. Por exemplo, o nivel WARN marca unha mensaxe sobre un intento fallido de inicio de sesión de usuario.
  • ERRO: este nivel de evento no rexistro informa sobre a aparición dun erro de natureza local e que non interfire co funcionamento do servidor. Este nivel pode marcar un erro no que os datos do índice dun usuario individual estean corruptos.
  • FATAL: este nivel indica erros debidos aos cales o servidor non pode seguir funcionando normalmente. Por exemplo, o nivel FATAL será para un rexistro que indica a imposibilidade de conectarse ao DBMS.

O ficheiro de rexistro do servidor de correo actualízase todos os días. A última versión do ficheiro sempre ten o nome Mailbox.log, mentres que os rexistros dunha data determinada teñen unha data no nome e están contidos no arquivo. Por exemplo, mailbox.log.2020-09-29.tar.gz. Isto fai que sexa moito máis fácil facer unha copia de seguranza dos rexistros de actividade e buscar nos rexistros.

Para comodidade do administrador do sistema, o cartafol /opt/zimbra/log/ contén outros rexistros. Só inclúen entradas relacionadas con elementos específicos de Zimbra OSE. Por exemplo, audit.log contén só rexistros sobre a autenticación de usuarios, clamd.log contén datos sobre o funcionamento do antivirus, etc. Por certo, un excelente método para protexer un servidor Zimbra OSE de intrusos é protección do servidor mediante Fail2Ban, que só funciona baseándose en audit.log. Tamén é unha boa práctica engadir unha tarefa cron para executar o comando grep -ir "contrasinal non válido" /opt/zimbra/log/audit.logpara recibir información diaria de fallos de inicio de sesión.

Como traballar cos rexistros de Zimbra OSE
Un exemplo de como audit.log mostra un contrasinal introducido dúas veces incorrectamente e un intento de inicio de sesión exitoso.

Os rexistros en Zimbra OSE poden ser moi útiles para identificar as causas de varios fallos críticos. No momento en que se produce un erro crítico, o administrador normalmente non ten tempo para ler os rexistros. É necesario restaurar o servidor o antes posible. Non obstante, máis tarde, cando o servidor está a realizar unha copia de seguridade e xera moitos rexistros, pode ser difícil atopar a entrada necesaria nun ficheiro grande. Para atopar rapidamente un rexistro de erro, abonda con saber a hora na que se reiniciou o servidor e atopar unha entrada nos rexistros que data deste momento. A entrada anterior será un rexistro do erro que se produciu. Tamén pode atopar a mensaxe de erro buscando a palabra clave FATAL.

Os rexistros de Zimbra OSE tamén permiten identificar fallos non críticos. Por exemplo, para buscar excepcións do controlador, pode buscar unha excepción do controlador. Moitas veces, os erros xerados polos controladores van acompañados dun rastrexo de pila que explica o que causou a excepción. En caso de erros na entrega do correo, debes comezar a busca coa palabra clave LmtpServer e, para buscar erros relacionados cos protocolos POP ou IMAP, podes utilizar as palabras clave ImapServer e Pop3Server.

Os rexistros tamén poden axudar cando se investigan incidentes de seguridade da información. Vexamos un exemplo específico. O 20 de setembro, un dos empregados enviou unha carta infectada polo virus a un cliente. Como resultado, os datos do ordenador do cliente foron cifrados. Porén, o empregado xura que non enviou nada. Como parte da investigación do incidente, o servizo de seguridade empresarial solicita ao administrador do sistema os rexistros do servidor de correo para o 20 de setembro asociados ao usuario investigado. Grazas ao selo de tempo, o administrador do sistema atopa o ficheiro de rexistro necesario, extrae a información necesaria e transfire aos especialistas en seguridade. Eses, á súa vez, miran a través del e descobren que o enderezo IP desde o que se enviou esta carta corresponde ao enderezo IP do ordenador do usuario. As imaxes de CCTV confirmaron que o empregado estaba no seu lugar de traballo cando se enviou a carta. Estes datos foron suficientes para acusalo de violar as normas de seguridade da información e despedilo. 

Como traballar cos rexistros de Zimbra OSE
Un exemplo de extracción de rexistros sobre unha das contas do rexistro de Mailbox.log nun ficheiro separado

Todo faise moito máis complicado cando se trata de infraestruturas multiservidor. Dado que os rexistros recóllense localmente, traballar con eles nunha infraestrutura multiservidor é moi inconveniente e, polo tanto, é necesario centralizar a recollida de rexistros. Isto pódese facer configurando un host para recoller rexistros. Non hai necesidade particular de engadir un host dedicado á infraestrutura. Calquera servidor de correo pode actuar como un nodo para recoller rexistros. No noso caso, este será o nodo Mailstore01.

Neste servidor necesitamos introducir os seguintes comandos:

sudo su – zimbra 
zmcontrol stop
exit
sudo /opt/zimbra/libexec/zmfixperms -e -v

Edite o ficheiro /etc/sysconfig/rsyslog e configure SYSLOGD_OPTIONS="-r -c 2″

Edite /etc/rsyslog.conf e descomente as seguintes liñas:
$ModLoad imudp
$UDPServerRun 514

Ingrese 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

Podes comprobar que todo funciona usando o comando zmprov gacf | grep zimbraLogHostname. Despois de executar o comando, debería mostrarse o nome do host que recolle rexistros. Para cambialo, debes introducir o comando zmprov mcf zimbraLogHostname mailstore01.company.ru.

En todos os outros servidores de infraestrutura (LDAP, MTA e outras tendas de correo), execute o comando zmprov gacf |grep zimbraLogHostname para ver o nome do host ao que se envían os rexistros. Para cambialo, tamén pode introducir o comando zmprov mcf zimbraLogHostname mailstore01.company.ru

Tamén debe introducir os seguintes comandos en cada servidor:

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

Despois diso, todos os rexistros rexistraranse no servidor que especificaches, onde poden verse convenientemente. Ademais, na consola do administrador de Zimbra OSE, na pantalla con información sobre o estado dos servidores, o servizo Logger en execución só se mostrará para o servidor mailstore01.

Como traballar cos rexistros de Zimbra OSE

Outra dor de cabeza para un administrador pode ser facer un seguimento dun correo electrónico específico. Dado que os correos electrónicos en Zimbra OSE pasan por varios eventos diferentes á vez: dixitalización mediante antivirus, antispam, etc., antes de ser aceptados ou enviados, para o administrador, se o correo electrónico non chega, pode ser bastante problemático rastrexar en que fase estaba perdido.

Para resolver este problema, pode usar un script especial, que foi desenvolvido polo especialista en seguridade da información Viktor Dukhovny e recomendado para o seu uso polos desenvolvedores de Postfix. Este script concatena entradas dos rexistros para un proceso específico e, debido a isto, permítelle mostrar rapidamente todas as entradas asociadas ao envío dunha carta determinada en función do seu identificador. O seu traballo foi probado en todas as versións de Zimbra OSE, a partir da 8.7. Aquí tedes o texto do 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";
}

O script está escrito en Perl e para executalo cómpre gardalo nun ficheiro cotexar.pl, faino executable e, a continuación, execute o ficheiro especificando o ficheiro de rexistro e usando pgrep para extraer a información de identificación da letra que está a buscar colate.pl /var/log/zimbra.log | pgrep '[protexido por correo electrónico]> '. O resultado será unha saída secuencial de liñas que conteñen información sobre o movemento da letra no servidor.

# collate.pl /var/log/zimbra.log | pgrep '<[email protected]>'
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 preguntas relacionadas con Zextras Suite, pode poñerse en contacto coa representante de Zextras Ekaterina Triandafilidi por correo electrónico [protexido por correo electrónico]

Fonte: www.habr.com