Jak pracovat s logy Zimbra OSE

Logování všech událostí je jednou z nejdůležitějších funkcí jakéhokoli firemního systému. Záznamy umožňují řešit vzniklé problémy, provádět audity práce informačních systémů a také vyšetřovat incidenty v oblasti informační bezpečnosti. Zimbra OSE také vedou podrobné záznamy o své činnosti. Ty zahrnují všechna data od výkonu serveru až po odesílání a přijímání e-mailů uživateli. Čtení záznamů generovaných Zimbra OSE je však poměrně složitý úkol. V tomto článku na konkrétním příkladu vám ukážeme, jak číst záznamy Zimbra OSE a jak je centralizovat.

Jak pracovat s logy Zimbra OSE
Všechny místní záznamy Zimbra OSE se ukládají do složky /opt/zimbra/log, kromě toho lze záznamy nalézt ve souboru /var/log/zimbra.log. Nejvýznamnějším z nich je mailbox.log. Ten zaznamenává veškeré akce, které probíhají na poštovním serveru. Mezi nimi je přenos e-mailů, údaje o autentizaci uživatelů, neúspěšné pokusy o přihlášení a další. Záznamy v mailbox.log představují textový řádek, který obsahuje čas, kdy událost nastala, úroveň události, číslo vlákna, v rámci kterého se událost odehrála, jméno uživatele a jeho ip-adresu, stejně jako textový popis události.

Jak pracovat s logy Zimbra OSE

Úroveň záznamu znamená míru vlivu události na chod serveru. Ve výchozím nastavení se používají čtyři úrovně událostí: INFO, WARN, ERROR a FATAL. Podíváme se na všechny úrovně podle rostoucí závažnosti.

  • INFO — události na této úrovni mají obvykle informovat o průběhu práce Zimbra OSE. Mezi zprávami této úrovně jsou například zprávy o vytvoření nebo odstranění poštovní schránky a podobně.
  • WARN — události této úrovně informují o situacích, které jsou potenciálně nebezpečné, ale neovlivňují chod serveru. Úroveň WARN například označuje zprávu o neúspěšném pokusu o přihlášení uživatele.
  • ERROR — tato úroveň události v záznamu informuje o vzniku chyby, která má místní charakter a nebrání chodu serveru. Takovou úroveň může mít chyba, při které došlo k poškození indexových dat jednotlivého uživatele.
  • FATAL — touto úrovní jsou označovány chyby, kvůli kterým server nemůže nadále normálně fungovat. Například úroveň FATAL bude mít záznam o nemožnosti připojit se k databázovému systému.

Soubor s logy poštovního serveru se aktualizuje každý den. Nová verze souboru vždy nese název Mailbox.log, zatímco logy za určité dny mají v názvu datum a jsou uloženy v archivu. Například mailbox.log.2020-09-29.tar.gz. Díky tomu je výrazně usnadněno zálohování logů činnosti a vyhledávání v logách.

Pro pohodlí systémového administrátora jsou ve složce /opt/zimbra/log/ umístěny také další logy. Obsahují pouze ty záznamy, které se vztahují ke konkrétním prvkům Zimbra OSE. Například v audit.log jsou zahrnuty výhradně záznamy o autentizaci uživatelů, v clamd.log údaje o činnosti antiviru a tak dále. Mimochodem, skvělým způsobem, jak chránit server Zimbra OSE před útočníky, je ochrana serveru pomocí Fail2Ban, která funguje na základě audit.log. Také je dobrou praxí přidat cron úlohu pro provádění příkazu grep -ir „invalid password“ /opt/zimbra/log/audit.log, abyste denně dostávali informace o případech neúspěšných pokusů o přihlášení.

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

Logy v Zimbra OSE mohou být mimořádně užitečné při zjišťování příčin různých kritických selhání. V okamžiku, kdy dojde k kritické chybě, nemá administrátor obvykle čas na čtení logů. Je nutné co nejdříve obnovit činnost serveru. Nicméně následně, když server znovu funguje a generuje množství logů, může být obtížné najít požadovaný záznam ve velkém souboru. Pro rychlé nalezení záznamu o chybě stačí vědět čas, kdy byl server znovu spuštěn, a najít v logách záznam s tímto datem. Předchozí záznam pak bude záznamem o nastalé chybě. Také lze najít chybové hlášení pomocí vyhledávání podle klíčového slova FATAL.

Také logy Zimbra OSE umožňují identifikovat i nekritické chyby. Například pro nalezení výjimek zpracovatele můžete provést hledání podle fráze handler exception. Často jsou chyby, které generují zpracovatelé, doprovázeny trasováním zásobníku, které vysvětluje, co způsobilo vznik výjimky. V případě chyb s doručováním pošty je vhodné začít hledání klíčovým slovem LmtpServer a pro hledání chyb souvisejících s protokoly POP nebo IMAP můžete použít klíčová slova ImapServer a Pop3Server.

Logy mohou také pomoci při vyšetřování incidentů informační bezpečnosti. Zvažme konkrétní příklad. Dne 20. září jeden z zaměstnanců poslal klientovi e-mail infikovaný virem. V důsledku toho byly údaje na počítači klienta zašifrovány. Zaměstnanec však tvrdí, že nic neposlal. V rámci vyšetřování incidentu si bezpečnostní služba podniku vyžaduje od systémového administrátora logy poštovního serveru za 20. září, které se týkají uživatele, jehož vyšetřování probíhá. Díky časovému razítku systémový administrátor nalézá potřebný soubor s logy, extrahuje potřebné informace a předává je bezpečnostním pracovníkům. Ti je následně procházejí a zjišťují, že IP adresa, ze které byl tento e-mail odeslán, odpovídá IP adresu počítači uživatele. Záznamy z kamer potvrdily, že zaměstnanec byl během odesílání e-mailu na svém pracovním místě. Těchto informací bylo dost, aby byl obviněn z porušení pravidel informační bezpečnosti a propuštěn. 

Jak pracovat s logy Zimbra OSE
Příklad extrakce záznamů o jednom z účtů z logu Mailbox.log do samostatného souboru.

Všechno se značně komplikuje v okamžiku, kdy jde o vícero serverovou infrastrukturu. Protože se logy sbírají lokálně, práce s nimi v podmínkách vícero serverové infrastruktury je velmi nepraktická, a proto je třeba centralizovat sběr logů. Toho lze dosáhnout nastavením hostitele pro sběr logů. Není potřeba přidávat do infrastruktury specializovaný hostitel. Jako uzel pro sběr logů může fungovat jakýkoli poštovní server. V našem případě bude uzlem Mailstore01.

Na tomto serveru je třeba zadat níže uvedené příkazy:

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

Upravte soubor /etc/sysconfig/rsyslog a nastavte parametr 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

Zkontrolujte, zda vše funguje pomocí příkazu zmprov gacf | grep zimbraLogHostname. Po provedení příkazu by se měl zobrazit název hostitele, který provádí sběr logů. Pro jeho změnu je nutné zadat příkaz zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na všech ostatních serverech infrastruktury (LDAP, MTA a dalších poštovních úložištích) proveďte příkaz zmprov gacf | grep zimbraLogHostname, abyste viděli název hostitele, na který odcházejí logy. Pro změnu lze také zadat příkaz zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na každém serveru je také nutné 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

Po tomto budou všechny logy zaznamenávány na vámi uvedeném serveru, kde je bude možné pohodlně prohlížet. Také v administrátorské konzoli Zimbra OSE na obrazovce se stavem serverů se spuštěná služba Logger bude zobrazovat pouze na serveru mailstore01.

Jak pracovat s logy Zimbra OSE

Další bolestí hlavy 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í hned několika různými událostmi: kontrolou antivirem, antispamem a tak dále, než jsou přijaty nebo odeslány, může být pro administrátora v případě, že e-mail nedorazí, obtížné sledovat, v jaké fázi se ztratil.

Aby vyřešili tento problém, lze použít speciální skript, který vyvinul odborník na informační bezpečnost Viktor Duchovný a který je doporučován vývojáři Postfixu. Tento skript konsoliduje záznamy z logů podle určitého procesu, což umožňuje rychle zobrazit všechny záznamy související s odesláním konkrétního e-mailu na základě jeho identifikátoru. Jeho funkčnost byla testována na všech verzích Zimbra OSE počínaje 8.7. Zde je text skriptu.

#! /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 nutné jej uložit do souboru collate.pl, učinit ho spustitelným a poté spustit soubor s uvedením souboru logů a pomocí pgrep vyhledat identifikační informace požadovaného e-mailu collate.pl /var/log/zimbra.log | pgrep ''. Výsledkem bude sekvenční výstup řádků, ve kterých jsou obsaženy informace o pohybu e-mailu na serveru.

# 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

Na všechny otázky týkající se Zextras Suite se můžete obrátit na zástupce společnosti „Zextras“ Ekaterinu Triandafilidi na e-mailu katerina@zextras.com

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster