Kako delati z dnevniki Zimbra OSE

Beleženje vseh dogodkov je ena najpomembnejših funkcij vsakega korporativnega sistema. Dnevniki vam omogočajo reševanje nastajajočih težav, revizijo delovanja informacijskih sistemov in tudi raziskovanje incidentov informacijske varnosti. Zimbra OSE vodi tudi podrobne dnevnike svojega delovanja. Vključujejo vse podatke od delovanja strežnika do pošiljanja in prejemanja e-pošte s strani uporabnikov. Vendar pa je branje dnevnikov, ki jih ustvari Zimbra OSE, precej netrivialna naloga. V tem članku vam bomo na konkretnem primeru povedali, kako brati dnevnike Zimbra OSE in kako jih narediti centralizirane.

Kako delati z dnevniki Zimbra OSE
Zimbra OSE shranjuje vse lokalne dnevnike v mapo /opt/zimbra/log, dnevnike pa lahko najdete tudi v datoteki /var/log/zimbra.log. Najpomembnejši med njimi je mailbox.log. Beleži vsa dejanja, ki se zgodijo na poštnem strežniku. Sem spadajo prenos e-pošte, podatki za avtentikacijo uporabnikov, neuspeli poskusi prijave in drugo. Vnosi v mailbox.log so besedilni niz, ki vsebuje čas, ko se je dogodek zgodil, raven dogodka, številko niti, v kateri se je dogodek zgodil, uporabniško ime in naslov IP ter besedilni opis dogodka. .

Kako delati z dnevniki Zimbra OSE

Raven dnevnika označuje stopnjo vpliva dogodka na delovanje strežnika. Privzeto so na voljo 4 ravni dogodkov: INFO, OPOZORILO, NAPAKA in USODNO. Oglejmo si vse ravni v naraščajočem vrstnem redu glede na resnost.

  • INFO – Dogodki na tej ravni so običajno namenjeni obveščanju o napredku Zimbra OSE. Sporočila na tej ravni vključujejo poročila o ustvarjanju ali brisanju nabiralnika itd.
  • OPOZORILO - dogodki te stopnje obveščajo o situacijah, ki so potencialno nevarne, vendar ne vplivajo na delovanje strežnika. Na primer, nivo WARN označuje sporočilo o neuspelem poskusu prijave uporabnika.
  • NAPAKA - ta nivo dogodkov v dnevniku obvešča o pojavu napake, ki je lokalne narave in ne moti delovanja strežnika. Ta raven lahko označi napako, pri kateri so se indeksni podatki posameznega uporabnika poškodovali.
  • FATAL - ta stopnja označuje napake, zaradi katerih strežnik ne more normalno delovati naprej. Na primer, raven FATAL bo za zapis, ki označuje nezmožnost povezave z DBMS.

Datoteka dnevnika poštnega strežnika se posodablja vsak dan. Najnovejša verzija datoteke ima vedno ime Mailbox.log, dnevniki za določen datum pa imajo v imenu datum in so shranjeni v arhivu. Na primer mailbox.log.2020-09-29.tar.gz. To olajša varnostno kopiranje dnevnikov dejavnosti in iskanje po dnevnikih.

Za udobje sistemskega skrbnika mapa /opt/zimbra/log/ vsebuje druge dnevnike. Vključujejo samo vnose, ki se nanašajo na določene elemente Zimbra OSE. Na primer, audit.log vsebuje le zapise o avtentikaciji uporabnika, clamd.log vsebuje podatke o delovanju antivirusa ipd. Mimogrede, odličen način zaščite strežnika Zimbra OSE pred vsiljivci je zaščita strežnika z uporabo Fail2Ban, ki deluje samo na podlagi audit.log. Prav tako je dobra praksa dodati nalogo cron za izvedbo ukaza grep -ir „neveljavno geslo“ /opt/zimbra/log/audit.logprejemati dnevne informacije o napaki pri prijavi.

Kako delati z dnevniki Zimbra OSE
Primer, kako audit.log prikazuje dvakrat nepravilno vneseno geslo in uspešen poskus prijave.

Dnevniki v Zimbra OSE so lahko izjemno koristni pri prepoznavanju vzrokov različnih kritičnih napak. V trenutku, ko pride do kritične napake, skrbnik običajno nima časa brati dnevnikov. Strežnik je potrebno čim prej obnoviti. Vendar pa je pozneje, ko je strežnik varnostno kopiran in ustvarja veliko dnevnikov, lahko težko najti zahtevani vnos v veliki datoteki. Če želite hitro najti zapis o napaki, je dovolj, da poznate čas, ko je bil strežnik znova zagnan, in poiščite vnos v dnevnikih iz tega časa. Prejšnji vnos bo zapis o napaki, ki se je zgodila. Sporočilo o napaki lahko najdete tudi tako, da iščete ključno besedo FATAL.

Dnevniki Zimbra OSE vam omogočajo tudi prepoznavanje nekritičnih napak. Na primer, če želite poiskati izjeme za obravnavo, lahko poiščete izjemo za obravnavo. Napake, ki jih ustvarijo obdelovalci, pogosto spremlja sled sklada, ki pojasnjuje, kaj je povzročilo izjemo. V primeru napak pri dostavi pošte začnite iskanje s ključno besedo LmtpServer, za iskanje napak, povezanih s protokoloma POP ali IMAP, pa lahko uporabite ključni besedi ImapServer in Pop3Server.

Dnevniki so lahko tudi v pomoč pri preiskovanju incidentov na področju informacijske varnosti. Poglejmo konkreten primer. Eden od zaposlenih je 20. septembra stranki poslal z virusom okuženo pismo. Zaradi tega so bili podatki na odjemalčevem računalniku šifrirani. Vendar zaposleni prisega, da ni poslal ničesar. V okviru preiskave incidenta varnostna služba podjetja od skrbnika sistema zahteva dnevnike poštnega strežnika za 20. september, povezane s preiskovanim uporabnikom. Zahvaljujoč časovnemu žigu skrbnik sistema najde potrebno datoteko dnevnika, izvleče potrebne informacije in jih prenese varnostnim strokovnjakom. Ti pa ga pregledajo in ugotovijo, da naslov IP, s katerega je bilo to pismo poslano, ustreza naslovu IP uporabnikovega računalnika. Posnetki CCTV so potrdili, da je bil zaposleni na svojem delovnem mestu, ko je bilo pismo poslano. Ti podatki so bili dovolj, da so ga obtožili kršitve pravil informacijske varnosti in ga odpustili. 

Kako delati z dnevniki Zimbra OSE
Primer ekstrahiranja zapisov o enem od računov iz dnevnika Mailbox.log v ločeno datoteko

Vse postane veliko bolj zapleteno, ko gre za večstrežniško infrastrukturo. Ker se dnevniki zbirajo lokalno, je delo z njimi v infrastrukturi z več strežniki zelo neprijetno, zato je treba centralizirati zbiranje dnevnikov. To lahko storite tako, da nastavite gostitelja za zbiranje dnevnikov. Infrastrukturi ni treba posebej dodajati namenskega gostitelja. Vsak poštni strežnik lahko deluje kot vozlišče za zbiranje dnevnikov. V našem primeru bo to vozlišče Mailstore01.

Na tem strežniku moramo vnesti spodnje ukaze:

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

Uredite datoteko /etc/sysconfig/rsyslog in nastavite SYSLOGD_OPTIONS=”-r -c 2″

Uredite /etc/rsyslog.conf in odkomentirajte naslednje vrstice:
$ModLoad imudp
$UDPServerRun 514

Vnesite naslednje ukaze:

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

Če vse deluje, lahko preverite z ukazom zmprov gacf | grep zimbraLogHostname. Po izvedbi ukaza bi moralo biti prikazano ime gostitelja, ki zbira dnevnike. Če ga želite spremeniti, morate vnesti ukaz zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na vseh drugih infrastrukturnih strežnikih (LDAP, MTA in drugih poštnih shrambah) zaženite ukaz zmprov gacf |grep zimbraLogHostname, da vidite ime gostitelja, na katerega so poslani dnevniki. Če ga želite spremeniti, lahko vnesete tudi ukaz zmprov mcf zimbraLogHostname mailstore01.company.ru

Na vsakem strežniku morate vnesti tudi naslednje ukaze:

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 tem bodo vsi dnevniki zabeleženi na strežniku, ki ste ga določili, kjer si jih je mogoče priročno ogledati. Prav tako bo v skrbniški konzoli Zimbra OSE na zaslonu z informacijami o statusu strežnikov prikazana delujoča storitev Logger samo za strežnik mailstore01.

Kako delati z dnevniki Zimbra OSE

Še en glavobol za skrbnika je lahko spremljanje določene e-pošte. Ker gredo e-poštna sporočila v okolju Zimbra OSE skozi več različnih dogodkov hkrati: skeniranje s protivirusnim programom, zaščita pred neželeno pošto itd., preden so sprejeta ali poslana, je za skrbnika, če e-poštno sporočilo ne prispe, lahko zelo problematično izslediti, na kateri stopnji bilo je izgubljeno.

Za rešitev te težave lahko uporabite poseben skript, ki ga je razvil strokovnjak za informacijsko varnost Viktor Dukhovny in ga priporočajo razvijalci Postfixa. Ta skript združuje vnose iz dnevnikov za določen proces in vam zaradi tega omogoča hiter prikaz vseh vnosov, povezanih s pošiljanjem določenega pisma na podlagi njegovega identifikatorja. Njegovo delo je bilo testirano na vseh različicah Zimbra OSE, od 8.7. Tukaj je besedilo scenarija.

#! /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 napisan v Perlu in če ga želite zagnati, ga morate shraniti v datoteko sortiraj.pl, naredite jo izvršljivo in nato zaženite datoteko, ki določa dnevniško datoteko in s pomočjo pgrep ekstrahira identifikacijske podatke pisma, ki ga iščete collate.pl /var/log/zimbra.log | pgrep '[e-pošta zaščitena]>'. Rezultat bo zaporedni izhod vrstic, ki vsebujejo informacije o gibanju črke na strežniku.

# 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

Za vsa vprašanja v zvezi z Zextras Suite se lahko obrnete na predstavnico Zextras Ekaterino Triandafilidi po elektronski pošti. [e-pošta zaščitena]

Vir: www.habr.com