Ako pracovať s denníkmi Zimbra OSE

Zaznamenávanie všetkých udalostí je jednou z najdôležitejších funkcií každého podnikového systému. Protokoly vám umožňujú riešiť vznikajúce problémy, auditovať fungovanie informačných systémov a tiež vyšetrovať incidenty informačnej bezpečnosti. Zimbra OSE tiež vedie podrobné záznamy o svojej prevádzke. Zahŕňajú všetky údaje od výkonu servera až po odosielanie a prijímanie e-mailov používateľmi. Čítanie protokolov generovaných Zimbra OSE je však pomerne netriviálna úloha. V tomto článku vám na konkrétnom príklade povieme, ako čítať denníky Zimbra OSE a ako ich centralizovať.

Ako pracovať s denníkmi Zimbra OSE
Zimbra OSE ukladá všetky lokálne protokoly do priečinka /opt/zimbra/log a protokoly možno nájsť aj v súbore /var/log/zimbra.log. Najdôležitejším z nich je mailbox.log. Zaznamenáva všetky akcie, ktoré sa vyskytnú na poštovom serveri. Ide napríklad o prenos e-mailov, autentifikačných údajov používateľa, neúspešných pokusov o prihlásenie a iné. Záznamy v mailbox.log sú textový reťazec, ktorý obsahuje čas, kedy k udalosti došlo, úroveň udalosti, číslo vlákna, v ktorom k udalosti došlo, meno používateľa a IP adresu, ako aj textový popis udalosti. .

Ako pracovať s denníkmi Zimbra OSE

Úroveň protokolu udáva mieru vplyvu udalosti na prevádzku servera. Štandardne sú k dispozícii 4 úrovne udalostí: INFO, WARN, ERROR a FATAL. Pozrime sa na všetky úrovne v rastúcom poradí závažnosti.

  • INFO – Udalosti na tejto úrovni sú zvyčajne určené na informovanie o pokroku Zimbra OSE. Správy na tejto úrovni zahŕňajú správy o vytvorení alebo odstránení poštovej schránky atď.
  • WARN - udalosti tejto úrovne informujú o situáciách, ktoré sú potenciálne nebezpečné, ale neovplyvňujú chod servera. Napríklad úroveň WARN označuje správu o neúspešnom pokuse o prihlásenie používateľa.
  • ERROR - táto úroveň udalosti v protokole informuje o výskyte chyby, ktorá je lokálneho charakteru a nenarúša chod servera. Táto úroveň môže označiť chybu, pri ktorej došlo k poškodeniu indexových údajov jednotlivých používateľov.
  • FATAL - táto úroveň označuje chyby, kvôli ktorým server nemôže ďalej normálne fungovať. Napríklad úroveň FATAL bude pre záznam označujúci nemožnosť pripojenia k DBMS.

Súbor denníka poštového servera sa aktualizuje každý deň. Najnovšia verzia súboru má vždy názov Mailbox.log, pričom protokoly k určitému dátumu majú v názve dátum a sú obsiahnuté v archíve. Napríklad mailbox.log.2020-09-29.tar.gz. Vďaka tomu je oveľa jednoduchšie zálohovať protokoly aktivít a prehľadávať protokoly.

Pre pohodlie správcu systému obsahuje priečinok /opt/zimbra/log/ ďalšie protokoly. Zahŕňajú iba položky, ktoré sa týkajú konkrétnych prvkov Zimbra OSE. Napríklad audit.log obsahuje iba záznamy o autentifikácii používateľa, clamd.log obsahuje údaje o fungovaní antivírusu atď. Mimochodom, vynikajúci spôsob ochrany servera Zimbra OSE pred votrelcami je ochrana servera pomocou Fail2Ban, ktorý funguje len na základe audit.log. Je tiež dobrým zvykom pridať úlohu cron na vykonanie príkazu grep -ir „neplatné heslo“ /opt/zimbra/log/audit.logdostávať denné informácie o zlyhaní prihlásenia.

Ako pracovať s denníkmi Zimbra OSE
Príklad toho, ako audit.log zobrazuje dvakrát nesprávne zadané heslo a úspešný pokus o prihlásenie.

Protokoly v Zimbra OSE môžu byť mimoriadne užitočné pri identifikácii príčin rôznych kritických zlyhaní. V momente, keď dôjde ku kritickej chybe, administrátor zvyčajne nemá čas čítať logy. Je potrebné čo najskôr obnoviť server. Avšak neskôr, keď je server zálohovaný a generuje veľa protokolov, môže byť ťažké nájsť požadovaný záznam vo veľkom súbore. Na rýchle nájdenie chybového záznamu stačí poznať čas, kedy bol server reštartovaný a nájsť záznam v protokoloch z tohto času. Predchádzajúci záznam bude záznamom chyby, ktorá sa vyskytla. Chybové hlásenie môžete nájsť aj vyhľadaním kľúčového slova FATAL.

Protokoly Zimbra OSE vám tiež umožňujú identifikovať nekritické zlyhania. Ak chcete napríklad nájsť výnimky obsluhy, môžete vyhľadať výnimku obsluhy. Chyby generované obslužnými programami sú často sprevádzané sledovaním zásobníka, ktoré vysvetľuje, čo spôsobilo výnimku. V prípade chýb pri doručovaní pošty by ste mali začať vyhľadávanie kľúčovým slovom LmtpServer a na vyhľadávanie chýb súvisiacich s protokolmi POP alebo IMAP môžete použiť kľúčové slová ImapServer a Pop3Server.

Protokoly môžu tiež pomôcť pri vyšetrovaní incidentov v oblasti bezpečnosti informácií. Pozrime sa na konkrétny príklad. Jeden zo zamestnancov poslal 20. septembra klientovi list nakazený vírusom. V dôsledku toho boli údaje na počítači klienta zašifrované. Zamestnanec sa však zaprisahá, že nič neposlal. V rámci vyšetrovania incidentu si podniková bezpečnostná služba vyžiada od správcu systému protokoly poštového servera za 20. september spojené s vyšetrovaným používateľom. Vďaka časovej pečiatke správca systému nájde potrebný log súbor, extrahuje potrebné informácie a odovzdá ich bezpečnostným špecialistom. Tí si ho prezrú a zistia, že IP adresa, z ktorej bol tento list odoslaný, zodpovedá IP adrese počítača používateľa. Zábery CCTV potvrdili, že zamestnanec bol v čase odoslania listu na svojom pracovisku. Tieto údaje stačili na to, aby ho obvinili z porušenia pravidiel informačnej bezpečnosti a vyhodili z práce. 

Ako pracovať s denníkmi Zimbra OSE
Príklad extrahovania záznamov o jednom z účtov z denníka Mailbox.log do samostatného súboru

Všetko sa stáva oveľa komplikovanejším, pokiaľ ide o infraštruktúru viacerých serverov. Keďže sa protokoly zhromažďujú lokálne, práca s nimi vo viacserverovej infraštruktúre je veľmi nepohodlná, a preto je potrebné zhromažďovanie protokolov centralizovať. Dá sa to dosiahnuť nastavením hostiteľa na zhromažďovanie protokolov. Do infraštruktúry nie je potrebné pridávať špeciálneho hostiteľa. Akýkoľvek poštový server môže fungovať ako uzol na zhromažďovanie protokolov. V našom prípade to bude uzol Mailstore01.

Na tomto serveri musíme zadať nasledujúce príkazy:

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

Upravte súbor /etc/sysconfig/rsyslog a nastavte SYSLOGD_OPTIONS=”-r -c 2″

Upravte súbor /etc/rsyslog.conf a odkomentujte nasledujúce riadky:
$ModLoad imudp
$UDPServerRun 514

Zadajte nasledujúce prí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

Či všetko funguje, môžete skontrolovať pomocou príkazu zmprov gacf | grep zimbraLogNázov hostiteľa. Po vykonaní príkazu by sa mal zobraziť názov hostiteľa, ktorý zhromažďuje protokoly. Ak ho chcete zmeniť, musíte zadať príkaz zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na všetkých ostatných serveroch infraštruktúry (LDAP, MTA a iné poštové sklady) spustite príkaz zmprov gacf |grep zimbraLogHostname, aby ste videli názov hostiteľa, ktorému sa protokoly odosielajú. Ak ho chcete zmeniť, môžete tiež zadať príkaz zmprov mcf zimbraLogHostname mailstore01.company.ru

Na každom serveri musíte zadať aj nasledujúce prí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

Potom sa všetky protokoly zaznamenajú na vami zadaný server, kde si ich možno pohodlne prezerať. V administrátorskej konzole Zimbra OSE sa na obrazovke s informáciami o stave serverov zobrazí spustená služba Logger len pre server mailstore01.

Ako pracovať s denníkmi Zimbra OSE

Ďalšou bolesťou hlavy správcu môže byť sledovanie konkrétneho e-mailu. Keďže e-maily v Zimbra OSE prechádzajú niekoľkými rôznymi udalosťami naraz: skenovaním antivírusom, antispamom atď. stratilo sa to.

Na vyriešenie tohto problému môžete použiť špeciálny skript, ktorý vyvinul špecialista na informačnú bezpečnosť Viktor Dukhovny a ktorý odporúčajú vývojári Postfixu. Tento skript spája záznamy z protokolov pre konkrétny proces a vďaka tomu vám umožňuje rýchlo zobraziť všetky záznamy spojené s odoslaním konkrétneho listu na základe jeho identifikátora. Jeho práca bola testovaná na všetkých verziách Zimbra OSE od 8.7. Tu je text scenára.

#! /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 napísaný v jazyku Perl a na jeho spustenie je potrebné ho uložiť do súboru collate.pl, spravte ho spustiteľným a potom spustite súbor špecifikujúci súbor denníka a pomocou pgrep extrahujte identifikačné informácie písmena, ktoré hľadáte collate.pl /var/log/zimbra.log | pgrep[chránené e-mailom]>'. Výsledkom bude sekvenčný výstup riadkov obsahujúci informácie o pohybe písmena na serveri.

# 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

So všetkými otázkami týkajúcimi sa apartmánu Zextras sa môžete e-mailom obrátiť na zástupkyňu Zextras Ekaterinu Triandafilidi [chránené e-mailom]

Zdroj: hab.com