Jak pracovat s protokoly Zimbra OSE

Protokolování všech událostí je jednou z nejdůležitějších funkcí každého podnikového systému. Protokoly umožňují řešit vznikající problémy, auditovat provoz informačních systémů a také vyšetřovat incidenty informační bezpečnosti. Zimbra OSE také vede podrobné záznamy o svém provozu. Zahrnují všechna data od výkonu serveru až po odesílání a přijímání e-mailů uživateli. Čtení protokolů generovaných Zimbra OSE je však poměrně netriviální úkol. V tomto článku vám na konkrétním příkladu řekneme, jak číst protokoly Zimbra OSE a jak je centralizovat.

Jak pracovat s protokoly Zimbra OSE
Zimbra OSE ukládá všechny místní protokoly do složky /opt/zimbra/log a protokoly lze také nalézt v souboru /var/log/zimbra.log. Nejdůležitější z nich je mailbox.log. Zaznamenává všechny akce, ke kterým dojde na poštovním serveru. Patří mezi ně přenos e-mailů, autentizační údaje uživatele, neúspěšné pokusy o přihlášení a další. Záznamy v mailbox.log jsou textový řetězec, který obsahuje čas, kdy k události došlo, úroveň události, číslo vlákna, ve kterém k události došlo, uživatelské jméno a IP adresu a také textový popis události. .

Jak pracovat s protokoly Zimbra OSE

Úroveň protokolu udává míru vlivu události na chod serveru. Standardně jsou k dispozici 4 úrovně událostí: INFO, WARN, ERROR a FATAL. Podívejme se na všechny úrovně v rostoucím pořadí závažnosti.

  • INFO - Události na této úrovni jsou obvykle určeny k informování o pokroku Zimbra OSE. Zprávy na této úrovni zahrnují zprávy o vytvoření nebo odstranění poštovní schránky a tak dále.
  • WARN - události této úrovně informují o situacích, které jsou potenciálně nebezpečné, ale nemají vliv na chod serveru. Například úroveň WARN označuje zprávu o neúspěšném pokusu o přihlášení uživatele.
  • ERROR - tato úroveň události v protokolu informuje o výskytu chyby, která je lokálního charakteru a nenarušuje chod serveru. Tato úroveň může označit chybu, při které došlo k poškození indexových dat jednotlivého uživatele.
  • FATAL - tato úroveň označuje chyby, kvůli kterým server nemůže dále normálně fungovat. Například FATAL úroveň bude pro záznam indikující nemožnost připojení k DBMS.

Soubor protokolu poštovního serveru je aktualizován každý den. Nejnovější verze souboru má vždy název Mailbox.log, zatímco protokoly k určitému datu mají v názvu datum a jsou obsaženy v archivu. Například mailbox.log.2020-09-29.tar.gz. Díky tomu je mnohem snazší zálohovat protokoly aktivit a prohledávat protokoly.

Pro pohodlí správce systému obsahuje složka /opt/zimbra/log/ další protokoly. Zahrnují pouze položky, které se týkají konkrétních prvků Zimbra OSE. Například audit.log obsahuje pouze záznamy o autentizaci uživatele, clamd.log obsahuje údaje o fungování antiviru a tak dále. Mimochodem, vynikající způsob ochrany serveru Zimbra OSE před vetřelci je ochrana serveru pomocí Fail2Ban, který funguje pouze na základě audit.log. Je také dobrým zvykem přidat úlohu cron pro provedení příkazu grep -ir „neplatné heslo“ /opt/zimbra/log/audit.logpro příjem denních informací o selhání přihlášení.

Jak pracovat s protokoly Zimbra OSE
Příklad, jak audit.log ukazuje dvakrát nesprávně zadané heslo a úspěšný pokus o přihlášení.

Protokoly v Zimbra OSE mohou být velmi užitečné při identifikaci příčin různých kritických selhání. V okamžiku, kdy dojde ke kritické chybě, administrátor většinou nemá čas číst logy. Je nutné co nejdříve obnovit server. Později, když je server zálohován a generuje velké množství protokolů, může být obtížné najít požadovaný záznam ve velkém souboru. Pro rychlé nalezení chybového záznamu stačí znát čas, kdy byl server restartován, a najít záznam v protokolech pocházející z této doby. Předchozí záznam bude záznamem chyby, ke které došlo. Chybovou zprávu můžete také najít vyhledáním klíčového slova FATAL.

Protokoly Zimbra OSE také umožňují identifikovat nekritická selhání. Chcete-li například najít výjimky obslužné rutiny, můžete vyhledat výjimku obslužné rutiny. Chyby generované obslužnými rutinami jsou často doprovázeny trasováním zásobníku, které vysvětluje, co způsobilo výjimku. V případě chyb při doručování pošty byste měli začít hledat pomocí klíčového slova LmtpServer a pro hledání chyb souvisejících s protokoly POP nebo IMAP můžete použít klíčová slova ImapServer a Pop3Server.

Protokoly mohou také pomoci při vyšetřování incidentů zabezpečení informací. Podívejme se na konkrétní příklad. 20. září jeden ze zaměstnanců poslal klientovi dopis nakažený virem. V důsledku toho byla data v počítači klienta zašifrována. Zaměstnanec však přísahá, že nic neposlal. V rámci vyšetřování incidentu si podniková bezpečnostní služba vyžádá od správce systému protokoly poštovního serveru pro 20. září spojené s vyšetřovaným uživatelem. Díky časovému razítku najde správce systému potřebný log soubor, vytáhne potřebné informace a předá je bezpečnostním specialistům. Ti si jej prohlédnou a zjistí, že IP adresa, ze které byl tento dopis odeslán, odpovídá IP adrese počítače uživatele. Záznamy CCTV potvrdily, že zaměstnanec byl v době odeslání dopisu na svém pracovišti. Tyto údaje stačily k tomu, aby byl obviněn z porušení pravidel bezpečnosti informací a propuštěn. 

Jak pracovat s protokoly Zimbra OSE
Příklad extrahování záznamů o jednom z účtů z protokolu Mailbox.log do samostatného souboru

Všechno je mnohem komplikovanější, pokud jde o multiserverovou infrastrukturu. Protože se protokoly shromažďují lokálně, práce s nimi v multiserverové infrastruktuře je velmi nepohodlná, a proto je potřeba shromažďování protokolů centralizovat. To lze provést nastavením hostitele pro shromažďování protokolů. Není potřeba do infrastruktury přidávat vyhrazeného hostitele. Jakýkoli poštovní server může fungovat jako uzel pro shromažďování protokolů. V našem případě to bude uzel Mailstore01.

Na tomto serveru musíme zadat následující příkazy:

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

Upravte soubor /etc/sysconfig/rsyslog a nastavte SYSLOGD_OPTIONS=”-r -c 2″

Upravte /etc/rsyslog.conf a odkomentujte následující řádky:
$ModLoad imudp
$UDPServerRun 514

Zadejte následující příkazy:

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

Zda vše funguje můžete zkontrolovat pomocí příkazu zmprov gacf | grep zimbraLogNázev hostitele. Po provedení příkazu by se měl zobrazit název hostitele, který shromažďuje protokoly. Chcete-li jej změnit, musíte zadat příkaz zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na všech ostatních infrastrukturních serverech (LDAP, MTA a další úložiště pošty) spusťte příkaz zmprov gacf |grep zimbraLogHostname, abyste viděli název hostitele, kterému jsou protokoly odesílány. Chcete-li jej změnit, můžete také zadat příkaz zmprov mcf zimbraLogHostname mailstore01.company.ru

Na každém serveru musíte také zadat následující příkazy:

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

Poté budou všechny protokoly zaznamenány na vámi zadaný server, kde je lze pohodlně prohlížet. V administrátorské konzoli Zimbra OSE se také na obrazovce s informacemi o stavu serverů zobrazí spuštěná služba Logger pouze pro server mailstore01.

Jak pracovat s protokoly Zimbra OSE

Další starostí pro administrátora může být sledování konkrétního e-mailu. Vzhledem k tomu, že e-maily v Zimbra OSE procházejí několika různými událostmi najednou: skenováním antivirem, antispamem atd., před přijetím nebo odesláním, pro administrátora, pokud e-mail nedorazí, může být docela problematické vysledovat, v jaké fázi bylo to ztraceno.

K vyřešení tohoto problému můžete použít speciální skript, který byl vyvinut specialistou na informační bezpečnost Viktor Dukhovny a doporučen pro použití vývojáři Postfixu. Tento skript spojuje záznamy z protokolů pro konkrétní proces a díky tomu umožňuje rychle zobrazit všechny záznamy spojené s odesláním konkrétního dopisu na základě jeho identifikátoru. Jeho práce byla testována na všech verzích Zimbra OSE, počínaje 8.7. Zde je text scénáře.

#! /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";
}

Skript je napsán v Perlu a pro jeho spuštění je potřeba jej uložit do souboru collate.pl, udělejte jej spustitelným a poté spusťte soubor s uvedením souboru protokolu a pomocí pgrep extrahujte identifikační informace hledaného písmene collate.pl /var/log/zimbra.log | pgrep'[chráněno e-mailem]> '. Výsledkem bude sekvenční výstup řádků obsahujících informace o pohybu dopisu na serveru.

# 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

Se všemi dotazy týkajícími se Zextras Suite můžete kontaktovat zástupkyni Zextras Ekaterinu Triandafilidi e-mailem [chráněno e-mailem]

Zdroj: www.habr.com