Loggning av alla hÀndelser Àr en av de viktigaste funktionerna i varje företagsystem. Loggar gör det möjligt att hantera uppkomna problem, utföra revision av informationssystemens arbete samt utreda incidenter inom informationssÀkerhet. Zimbra OSE hÄller ocksÄ detaljerade loggar över sin verksamhet. Dessa innehÄller all data frÄn serverns prestanda till avsÀndning och mottagning av e-post av anvÀndarna. Att lÀsa loggarna som genereras av Zimbra OSE Àr emellertid en ganska komplicerad uppgift. I denna artikel kommer vi med ett konkret exempel att berÀtta hur man lÀser loggarna för Zimbra OSE samt hur man kan centralt hantera dem.

Alla lokala loggar för Zimbra OSE lagras i mappen /opt/zimbra/log, och loggar kan ocksÄ hittas i filen /var/log/zimbra.log. Den viktigaste av dem Àr mailbox.log. I den registreras alla ÄtgÀrder som sker pÄ e-postservern. Bland dessa finns överföring av e-post, anvÀndarautentisering, misslyckade inloggningsförsök och sÄ vidare. Poster i mailbox.log Àr textstrÀngar som innehÄller tidpunkten för hÀndelsen, hÀndelsens nivÄ, trÄdnummer dÀr hÀndelsen Àgde rum, anvÀndarnamn och dess ip-adress samt en textuell beskrivning av hÀndelsen.

LoggnivÄn anger graden av pÄverkan av hÀndelsen pÄ serverns arbete. Som standard anvÀnds fyra nivÄer av hÀndelser: INFO, WARN, ERROR och FATAL. Vi gÄr igenom dessa nivÄer i ordning av ökad allvarlighet.
- INFO â hĂ€ndelser pĂ„ denna nivĂ„ Ă€r avsedda att informera om Zimbra OSE:s drift. Bland meddelandena pĂ„ denna nivĂ„ finns rapporter om skapande eller radering av e-postlĂ„dor och sĂ„ vidare.
- WARN â hĂ€ndelser pĂ„ denna nivĂ„ informerar om situationer som Ă€r potentiellt otrygga men som inte pĂ„verkar serverns drift. En WARN-nivĂ„ anvĂ€nds till exempel för att markera ett meddelande om ett misslyckat inloggningsförsök av en anvĂ€ndare.
- ERROR â denna nivĂ„ av hĂ€ndelsen i loggen informerar om att ett fel har uppstĂ„tt som Ă€r lokalt och inte hindrar serverns drift. En sĂ„dan nivĂ„ kan markera ett fel dĂ€r indexdata för en enskild anvĂ€ndare har blivit korrupt.
- FATAL â denna nivĂ„ markerar fel som gör att servern inte kan fortsĂ€tta fungera normalt. Till exempel kommer en FATAL-nivĂ„ att finnas i posten om att det inte gĂ„r att ansluta till databashanteraren.
Loggfilerna frÄn e-postservern uppdateras varje dag. Den senaste versionen av filen har alltid namnet Mailbox.log, medan loggarna för ett visst datum har datum i namnet och finns i ett arkiv. Till exempel mailbox.log.2020-09-29.tar.gz. Tack vare detta förenklas sÀkerhetskopiering av aktivitetsloggar och sökning i loggar avsevÀrt.
För systemadministratörens bekvÀmlighet finns andra loggar i mappen /opt/zimbra/log/. Dessa loggar innehÄller endast de poster som rör specifika delar av Zimbra OSE. Till exempel innehÄller audit.log endast poster om anvÀndarautentisering, clamd.log innehÄller data om antivirusets arbete och sÄ vidare. För övrigt Àr en utmÀrkt metod för att skydda Zimbra OSE-servern frÄn intrÄng , som fungerar baserat pÄ audit.log. En god praxis Àr ocksÄ att lÀgga till en cron-uppgift för att köra kommandot grep -ir "invalid password" /opt/zimbra/log/audit.log, för att dagligen fÄ information om misslyckade inloggningsförsök.

Ett exempel pÄ hur en felaktigt inmatad lösenord upprepas tvÄ gÄnger i audit.log samt en lyckad inloggning
Loggarna i Zimbra OSE kan vara ytterst anvÀndbara för att ta reda pÄ orsakerna till olika kritiska fel. NÀr en kritisk fel intrÀffar har administratören vanligtvis inte tid att lÀsa loggar. Det krÀvs att servern ÄterstÀlls sÄ snabbt som möjligt. Men senare, nÀr servern fungerar igen och genererar mÄnga loggar, kan det vara besvÀrligt att hitta rÀtt post i den stora filen. För att snabbt hitta en felpost rÀcker det att veta tidpunkten dÄ servern startades om och leta efter en post i loggarna som Àr daterad vid den tiden. Den föregÄende posten kommer att vara posten om det intrÀffade felet. Du kan ocksÄ hitta felmeddelandet genom att söka efter nyckelordet FATAL.
Zimbra OSE-loggarna kan ocksÄ identifiera icke-kritiska fel. Till exempel, för att hitta undantagshanterare kan man söka efter frasen handler exception. Ofta Ätföljs de fel som genereras av hanterarna av en stacktrace som förklarar orsaken till att undantaget uppstod. NÀr det gÀller fel med e-postleverans bör man börja sökningen med nyckelordet LmtpServer, och för att söka efter fel relaterade till POP- eller IMAP-protokollen kan man anvÀnda nyckelorden ImapServer och Pop3Server.
Loggarna kan ocksĂ„ vara till hjĂ€lp vid utredningar av informationssĂ€kerhetsincidenter. LĂ„t oss övervĂ€ga ett konkret exempel. Den 20 september skickade en av de anstĂ€llda ett virusinficerat e-postmeddelande till en klient. Som ett resultat blev data pĂ„ klientens dator krypterade. Men den anstĂ€llde svĂ€r att han inte skickade nĂ„got. I samband med utredningen av incidenten begĂ€r sĂ€kerhetstjĂ€nsten vid företaget loggar frĂ„n e-postservern för den 20 september, relaterade till den anvĂ€ndare som utredningen gĂ€ller. Tack vare tidsstĂ€mpeln hittar systemadministratören den nödvĂ€ndiga loggfilen, extraherar den information som behövs och överlĂ€mnar den till sĂ€kerhetstjĂ€nsten. Dessa granskar den och upptĂ€cker att IP-adressen frĂ„n vilken detta e-postmeddelande skickades motsvarar IP-adress anvĂ€ndarens dator. Inspelningar frĂ„n övervakningskameror bekrĂ€ftade att den anstĂ€llde befann sig pĂ„ sin arbetsplats nĂ€r han skickade e-postmeddelandet. Denna information rĂ€ckte för att anklaga honom för att ha brutit mot reglerna för informationssĂ€kerhet och avskeda honom.Â

Exempel pÄ att extrahera poster för ett av anvÀndarkontona frÄn loggen Mailbox.log till en separat fil
Det blir betydligt mer komplicerat nÀr det handlar om en flerserverinfrastruktur. Eftersom loggarna samlas lokalt Àr det mycket opraktiskt att hantera dem i en miljö med flera servrar, vilket motiverar behovet av centralisering av logginsamling. Detta kan göras genom att konfigurera en vÀrd för logginsamling. Det finns ingen sÀrskild anledning att lÀgga till en dedikerad vÀrd i infrastrukturen. Vilken e-postserver som helst kan fungera som logginsamlingsnod. I vÄrt fall kommer detta att vara noden Mailstore01.
PÄ denna server mÄste vi ange de kommandon som anges nedan:
sudo su â zimbra
zmcontrol stop
exit
sudo /opt/zimbra/libexec/zmfixperms -e -vRedigera filen /etc/sysconfig/rsyslog och stÀll in parametern SYSLOGD_OPTIONS="-r -c 2"
Redigera /etc/rsyslog.conf och avkommentera följande rader:
$ModLoad imudp
$UDPServerRun 514
Skriv följande kommandon:
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/zmupdateauthkeysKontrollera att allt fungerar med kommandot zmprov gacf | grep zimbraLogHostname. Efter körning av kommandot ska vÀrdnamnet som samlar loggar visas. För att Àndra detta, skriv kommandot zmprov mcf zimbraLogHostname mailstore01.company.ru.
PÄ alla andra servrar i infrastrukturen (LDAP, MTA och andra e-postlagringstjÀnster) kör kommandot zmprov gacf | grep zimbraLogHostname för att se namnet pÄ vÀrden som tar emot loggar. För att Àndra detta kan du ocksÄ skriva kommandot zmprov mcf zimbraLogHostname mailstore01.company.ru.
Ăven pĂ„ varje server behöver du skriva följande kommandon:
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 restartefter detta kommer alla loggar att registreras pÄ den server som du angav, dÀr de enkelt kan ses. Dessutom kommer den aktiva Logger-tjÀnsten att visas endast pÄ servern mailstore01 i Zimbra OSE-administratörskonsolen pÄ sidan med serverstatus.

En annan huvudvÀrk för administratörer kan vara att spÄra ett visst e-postmeddelande. Eftersom e-post i Zimbra OSE gÄr igenom flera olika hÀndelser: antiviruskontroll, skrÀppostkontroll och sÄ vidare, innan det accepteras eller skickas, kan det för administratören vara problematiskt att följa upp var meddelandet försvann om det inte kommer fram.
För att lösa detta problem kan man anvÀnda ett specialskript, som har utvecklats av informationssÀkerhetsspecialisten Viktor Dukhonov och rekommenderas för anvÀndning av utvecklare av Postfix. Detta skript konkatenerar register frÄn loggarna för en specifik process, vilket snabbt gör det möjligt att visa alla poster relaterade till sÀndningen av ett specifikt mejl baserat pÄ dess identifierare. Det har testats pÄ alla versioner av Zimbra OSE, frÄn och med 8.7. HÀr Àr skriptets text.
#! /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";
}Skriptet Àr skrivet i Perl och för att köra det mÄste du spara det i en fil collate.pl, göra det exekverbart och sedan köra filen med angivande av loggfilen och anvÀnda pgrep för att extrahera identifieringsinformationen för det sökta mejlet collate.pl /var/log/zimbra.log | pgrep ''. Resultatet blir en sekventiell utskrift av rader som innehÄller information om mejlets rörelse pÄ servern.
# 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: removedFör alla frÄgor relaterade till Zextras Suite kan ni kontakta företagets representant "Zextras", Ekaterina Triandafiliidi, via e-post katerina@zextras.com
KĂ€lla: habr.com
