Kako raditi s logovima Zimbra OSE

Evidentiranje svih događaja jedan je od najvažnijih funkcija bilo kojeg korporativnog sustava. Zapisi omogućuju rješavanje nastalih problema, provođenje revizije rada informatičkih sustava, te istraživanje incidenata informacijske sigurnosti. Zimbra OSE također vodi detaljne zapise o svom radu. U njih dolaze svi podaci od performansi poslužitelja do slanja i primanja e-pošte od strane korisnika. Međutim, čitanje zapisa koje generira Zimbra OSE je prilično složen zadatak. U ovom članku ćemo na konkretnom primjeru objasniti kako čitati zapise Zimbra OSE, kao i kako ih centralizirati.

Kako raditi s logovima Zimbra OSE
Svi lokalni zapisi Zimbra OSE se nalaze u mapi /opt/zimbra/log, a zapisi se mogu naći i u datoteci /var/log/zimbra.log. Najvažniji među njima je mailbox.log. U njemu se bilježe sve radnje koje se odvijaju na poslužitelju e-pošte. Među njima su prijenos e-pošte, podaci o autentifikaciji korisnika, neuspjeli pokušaji prijave i drugi. Unosi u mailbox.log predstavljaju tekstualni niz koji sadrži vrijeme kada se događaj dogodio, razinu događaja, broj niti unutar koje se događaj odvijao, ime korisnika i njegovu IP adresu, kao i tekstualni opis događaja.

Kako raditi s logovima Zimbra OSE

Razina zapisa označava stupanj utjecaja događaja na rad poslužitelja. Po defaultu se koriste 4 razine događaja: INFO, WARN, ERROR i FATAL. Razmotrimo sve razine po rastućoj težini.

  • INFO — događaji na ovoj razini obično su namijenjeni informiranju o tijeku rada Zimbra OSE. Među porukama ove razine su izvještaji o kreiranju ili brisanju poštanskog sandučića i slično.
  • WARN — događaji ove razine informiraju o situacijama koje su potencijalno opasne, ali ne utječu na rad poslužitelja. Poruka o neuspjelom pokušaju prijave korisnika označena je razinom WARN.
  • ERROR — ova razina događaja u zapisu obavještava o pogrešci koja je lokalne prirode i ne ometa rad poslužitelja. Ova razina može označiti pogrešku kada su indeksni podaci određenog korisnika oštećeni.
  • FATAL — ovom razinom označavaju se pogreške zbog kojih poslužitelj ne može nastaviti normalno raditi. Na primjer, razina FATAL bit će na zapisu o nemogućnosti povezivanja na DBMS.

Datoteka s logovima poslužitelja e-pošte ažurira se svakodnevno. Svježa verzija datoteke uvijek ima ime Mailbox.log, dok logovi za određeni datum imaju datum u nazivu i nalaze se u arhivi. Na primjer mailbox.log.2020-09-29.tar.gz. To značajno olakšava rezerviranje zapisnika radnji i pretraživanje logova.

Radi lakše upotrebe sistemskog administratora, u mapi /opt/zimbra/log/ nalaze se i drugi logovi. Oni uključuju samo one unose koji se odnose na određene elemente Zimbra OSE. Na primjer, u audit.log nalaze se isključivo zapisi o autentifikaciji korisnika, u clamd.log podaci o radu antivirusnog programa i tako dalje. Usput, odlična metoda zaštite poslužitelja Zimbra OSE od zlonamjernika je zaštita poslužitelja pomoću Fail2Ban, koja se upravo temelji na audit.log. Također je dobra praksa dodavanje cron-zadatka za izvršavanje naredbe grep -ir „invalid password“ /opt/zimbra/log/audit.log, kako bi se svaki dan primale informacije o slučajevima neuspješnih pokušaja prijave.

Kako raditi s logovima Zimbra OSE
Primjer onoga kako se u audit.log prikazuju dvaput netočno unesena lozinka i uspješan pokušaj prijave

Logovi u Zimbra OSE mogu biti iznimno korisni za otkrivanje uzroka raznih kritičnih kvarova. U trenutku kada se dogodi kritična greška, administrator obično nema vremena čitati logove. Potrebno je što prije obnoviti rad poslužitelja. Međutim, kasnije, kada poslužitelj ponovo radi i generira mnoštvo logova, pronaći potrebni unos u velikoj datoteci može biti izazov. Da biste brzo pronašli unos o grešci, dovoljno je znati vrijeme kada je poslužitelj ponovno pokrenut i pronaći u logovima unos datiran tim vremenom. Prethodni unos bit će zapisa o nastaloj grešci. Također, poruku o grešci možete pronaći pomoću pretraživanja ključne riječi FATAL.

Dnevnici Zimbra OSE također omogućuju prepoznavanje i nekritičnih grešaka. Na primjer, za pronalaženje iznimaka obraditelja, možete pretražiti po frazi handler exception. Često se greške koje generiraju obraditelji prate tragovima stoga, koji objašnjavaju uzrok nastanka iznimke. U slučaju grešaka s isporukom e-pošte, trebali biste početi pretraživati s ključnom riječi LmtpServer, a za pronalaženje grešaka povezanih s protokolima POP ili IMAP možete koristiti ključne riječi ImapServer i Pop3Server.

Dnevnici također mogu pomoći u istraživanju incidenata informatičke sigurnosti. Razmotrite konkretan primjer. 20. rujna jedan od zaposlenika poslao je klijentu e-poštu zaraženu virusom. Kao rezultat, podaci na računalu klijenta su šifrirani. Međutim, zaposlenik se kune da ništa nije poslao. U okviru istraživanja incidenta, služba sigurnosti poduzeća traži od sistemskog administratora dnevnike poslužitelja e-pošte za 20. rujna, povezane s korisnikom za kojeg se provodi istraga. Zahvaljujući vremenskoj oznaci, sistemski administrator pronalazi potreban datoteka s dnevnikom, izvlači potrebne informacije i predaje ih sigurnosnom timu. Oni, pak, pregledavaju te informacije i otkrivaju da IP adresa s koje je poslana ta poruka odgovara IP-adresu računalu korisnika. Snimke video nadzora potvrđuju da je zaposlenik tijekom slanja poruke bio na svom radnom mjestu. Ti podaci dovoljni su da ga optuže za kršenje pravila informatičke sigurnosti i otpuste. 

Kako raditi s logovima Zimbra OSE
Primjer izdvajanja zapisa o jednom od računa iz dnevnika Mailbox.log u zasebnu datoteku

Sve se značajno komplicira kada se radi o višeservernoj infrastrukturi. Budući da se dnevnici prikupljaju lokalno, rad s njima u uvjetima višeserverne infrastrukture vrlo je nezgodan, stoga se javlja potreba za centralizacijom prikupljanja dnevnika. To se može postići postavljanjem poslužitelja za prikupljanje dnevnika. Nema posebne potrebe za dodavanjem namjenskog poslužitelja u infrastrukturu. Kao čvor za prikupljanje dnevnika može poslužiti bilo koji poslužitelj e-pošte. U našem slučaju to će biti čvor Mailstore01.

Na ovom poslužitelju trebamo unijeti dolje navedene naredbe:

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

Uredite datoteku /etc/sysconfig/rsyslog i postavite parametar SYSLOGD_OPTIONS=”-r -c 2″

Uredite /etc/rsyslog.conf i otkomentirajte sljedeće retke:
$ModLoad imudp
$UDPServerRun 514

Unesite sljedeće naredbe:

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

Provjerite da li sve radi pomoću naredbe zmprov gacf | grep zimbraLogHostname. Nakon izvršenja naredbe treba se prikazati ime hosta koji prikuplja logove. Da biste ga promijenili, potrebno je unijeti naredbu zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na svim ostalim serverima infrastrukture (LDAP, MTA i drugim poštanskim pohranama) izvršite naredbu zmprov gacf | grep zimbraLogHostname da biste vidjeli naziv hosta na koji odlaze logovi. Da biste ga promijenili, također možete unijeti naredbu zmprov mcf zimbraLogHostname mailstore01.company.ru.

Također je potrebno unijeti sljedeće naredbe na svakom serveru:

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

Nakon ovoga svi logovi će se zapisivati na serveru koji ste naveli, gdje će ih biti moguće lako pregledavati. Također, u konzoli administratora Zimbra OSE, na ekranu s informacijama o stanju servera, pokrenuta usluga Logger će se prikazivati samo na serveru mailstore01.

Kako raditi s logovima Zimbra OSE

Još jedna potencijalna glavobolja za administratora može biti praćenje određenog elektroničkog poruke. S obzirom na to da elektroničke poruke u Zimbra OSE prolaze kroz nekoliko različitih događaja: provjera antivirusom, anti-spamom itd., prije nego što budu prihvaćene ili poslane, administratoru može biti prilično problematično pratiti na kojem je koraku došlo do gubitka poruke.

Kako bi se riješio ovaj problem, može se koristiti posebni skript koji je razvio stručnjak za informatičku sigurnost Viktor Duhovni i koji je preporučen od strane developera Postfixa. Ovaj skript konkatinira zapise iz logova prema određenom procesu i na taj način omogućuje brzo prikazivanje svih zapisa vezanih za slanje određenog e-maila temeljenog na njegovom identifikatoru. Njegov rad testiran je na svim verzijama Zimbra OSE, počevši od 8.7. Donosimo tekst skripta.

#! /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 na Perlu i za njegovu upotrebu potrebno ga je spremiti u datoteku collate.pl, učiniti ga izvršnim, a zatim pokrenuti datoteku navodeći datoteku logova i uz pomoć pgrep izdvojiti identifikacijske informacije traženog e-maila collate.pl /var/log/zimbra.log | pgrep ''. Rezultat će biti uzastopni ispis redaka koji sadrže informacije o kretanju e-maila na poslužitelju.

# 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

Za sva pitanja vezana uz Zextras Suite možete se obratiti predstavnici kompanije „Zextras“ Ekaterini Triandafiliidi putem e-pošte katerina@zextras.com

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster