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.

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. .

Ú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 , 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í.

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 být také užitečné při vyšetřování incidentů v oblasti informační bezpečnosti. Uvažujme konkrétní příklad: 20. září zaměstnanec odeslal klientovi e-mail 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 neodeslal. V rámci vyšetřování incidentu požádá bezpečnostní služba společnosti správce systému o poskytnutí protokolů poštovního serveru za 20. září týkajících se vyšetřovaného uživatele. Pomocí časového razítka správce systému vyhledá příslušný soubor protokolu, extrahuje potřebné informace a předá je bezpečnostním specialistům. Ti jej následně zkontrolují a zjistí, že IP adresa, ze které byl e-mail odeslán, se shoduje. IP adresa Počítač uživatele. Záznam z bezpečnostních kamer potvrdil, že zaměstnanec byl v době odeslání e-mailu u svého stolu. Tento důkaz byl dostatečný k obvinění z porušení předpisů o informační bezpečnosti a k jeho propuštění.

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 -vUpravte 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/zmupdateauthkeysZda 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 restartPoté 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.

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 '<20200929164500.user@mail.company.ru>'. Výsledkem bude sekvenční výstup řádků obsahujících informace o pohybu dopisu 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: removedSe všemi dotazy týkajícími se Zextras Suite se můžete obrátit na zástupce Zextras Ekaterinu Triandafilidi e-mailem katerina@zextras.com
Zdroj: www.habr.com
