Kako raditi sa zapisima Zimbra OSE

Zapisivanje svih događaja jedna je od najvažnijih funkcija svakog korporativnog sustava. Dnevnici vam omogućuju rješavanje novonastalih problema, reviziju rada informacijskih sustava, kao i istraživanje incidenata informacijske sigurnosti. Zimbra OSE također vodi detaljne zapise o svom radu. Oni uključuju sve podatke od performansi poslužitelja do slanja i primanja e-pošte od strane korisnika. Međutim, čitanje zapisa koje generira Zimbra OSE prilično je netrivijalan zadatak. U ovom članku ćemo vam na konkretnom primjeru reći kako čitati Zimbra OSE zapisnike, kao i kako ih učiniti centraliziranim.

Kako raditi sa zapisima Zimbra OSE
Zimbra OSE pohranjuje sve lokalne zapise u /opt/zimbra/log mapu, a zapisi se također mogu pronaći u datoteci /var/log/zimbra.log. Najvažniji od njih je mailbox.log. Bilježi sve radnje koje se događaju na poslužitelju e-pošte. To uključuje prijenos e-pošte, podatke za provjeru autentičnosti korisnika, neuspjele pokušaje prijave i drugo. Unosi u mailbox.log su tekstualni niz koji sadrži vrijeme kada se događaj dogodio, razinu događaja, broj niti u kojoj se događaj dogodio, korisničko ime i IP adresu, kao i tekstualni opis događaja .

Kako raditi sa zapisima Zimbra OSE

Razina dnevnika označava stupanj utjecaja događaja na rad poslužitelja. Standardno postoje 4 razine događaja: INFO, WARN, ERROR i FATAL. Pogledajmo sve razine prema rastućem redoslijedu ozbiljnosti.

  • INFO - Događaji na ovoj razini obično su namijenjeni informiranju o napretku Zimbra OSE. Poruke na ovoj razini uključuju izvješća o stvaranju ili brisanju poštanskog sandučića i tako dalje.
  • WARN - događaji ove razine informiraju o situacijama koje su potencijalno opasne, ali ne utječu na rad poslužitelja. Na primjer, razina WARN označava poruku o neuspješnom pokušaju prijave korisnika.
  • GREŠKA - ova razina događaja u zapisniku obavještava o pojavi greške koja je lokalne prirode i ne ometa rad poslužitelja. Ova razina može označiti pogrešku u kojoj su indeksni podaci pojedinog korisnika oštećeni.
  • FATAL - ova razina označava greške zbog kojih poslužitelj ne može nastaviti s normalnim radom. Na primjer, razina FATAL bit će za zapis koji ukazuje na nemogućnost povezivanja na DBMS.

Dnevnik poslužitelja pošte ažurira se svaki dan. Najnovija verzija datoteke uvijek ima naziv Mailbox.log, dok dnevnici za određeni datum imaju datum u nazivu i nalaze se u arhivi. Na primjer mailbox.log.2020-09-29.tar.gz. Ovo znatno olakšava sigurnosno kopiranje dnevnika aktivnosti i pretraživanje kroz zapise.

Radi praktičnosti administratora sustava, mapa /opt/zimbra/log/ sadrži druge zapise. Oni uključuju samo unose koji se odnose na određene elemente Zimbra OSE. Na primjer, audit.log sadrži samo zapise o autentifikaciji korisnika, clamd.log sadrži podatke o radu antivirusa i tako dalje. Usput, izvrsna metoda zaštite Zimbra OSE poslužitelja od uljeza je zaštita poslužitelja koristeći Fail2Ban, koji radi samo na temelju audit.log. Također je dobra praksa dodati cron zadatak za izvršavanje naredbe grep -ir „nevažeća lozinka“ /opt/zimbra/log/audit.logprimati dnevne informacije o neuspješnoj prijavi.

Kako raditi sa zapisima Zimbra OSE
Primjer kako audit.log prikazuje dva puta pogrešno unesenu lozinku i uspješan pokušaj prijave.

Dnevnici u Zimbra OSE-u mogu biti iznimno korisni u identificiranju uzroka raznih kritičnih kvarova. U trenutku kada se dogodi kritična greška, administrator obično nema vremena čitati zapisnike. Potrebno je vratiti poslužitelj što je prije moguće. Međutim, kasnije, kada poslužitelj radi sigurnosnu kopiju i generira mnogo zapisa, može biti teško pronaći traženi unos u velikoj datoteci. Da biste brzo pronašli zapis o pogrešci, dovoljno je znati vrijeme u kojem je poslužitelj ponovno pokrenut i pronaći unos u zapisnicima koji datira iz tog vremena. Prethodni unos bit će zapis o pogrešci koja se dogodila. Poruku o pogrešci možete pronaći i pretraživanjem ključne riječi FATAL.

Zimbra OSE zapisnici također vam omogućuju da identificirate nekritične kvarove. Na primjer, da biste pronašli iznimke rukovatelja, možete tražiti iznimku rukovatelja. Često su pogreške koje generiraju obrađivači popraćene praćenjem stoga koje objašnjava što je uzrokovalo iznimku. U slučaju grešaka u isporuci pošte, pretragu trebate započeti ključnom riječi LmtpServer, a za traženje grešaka vezanih uz POP ili IMAP protokole možete koristiti ključne riječi ImapServer i Pop3Server.

Dnevnici također mogu pomoći pri istraživanju incidenata informacijske sigurnosti. Pogledajmo konkretan primjer. Dana 20. rujna jedan od zaposlenika poslao je virusom zaraženo pismo klijentu. Kao rezultat toga, podaci na računalu klijenta bili su šifrirani. Međutim, djelatnik se kune da nije ništa poslao. Kao dio istrage o incidentu, službe za sigurnost poduzeća od administratora sustava zahtijevaju zapisnike poslužitelja pošte za 20. rujna povezane s korisnikom koji se istražuje. Zahvaljujući vremenskoj oznaci, administrator sustava pronalazi potrebnu log datoteku, izdvaja potrebne informacije i prenosi ih stručnjacima za sigurnost. Oni ga pak pregledavaju i otkrivaju da IP adresa s koje je ovo pismo poslano odgovara IP adresi računala korisnika. Snimke CCTV-a potvrdile su da je zaposlenik bio na svom radnom mjestu kada je pismo poslano. Ti su podaci bili dovoljni da ga se optuži za kršenje pravila informacijske sigurnosti i otpusti. 

Kako raditi sa zapisima Zimbra OSE
Primjer izdvajanja zapisa o jednom od računa iz Mailbox.log prijave u zasebnu datoteku

Sve postaje puno kompliciranije kada je u pitanju multi-server infrastruktura. Budući da se zapisnici prikupljaju lokalno, rad s njima u infrastrukturi s više poslužitelja vrlo je nezgodan i stoga postoji potreba za centraliziranjem prikupljanja zapisa. To se može učiniti postavljanjem hosta za prikupljanje zapisa. Nema posebne potrebe za dodavanjem namjenskog hosta infrastrukturi. Svaki poslužitelj pošte može djelovati kao čvor za prikupljanje zapisa. U našem slučaju, to će biti čvor Mailstore01.

Na ovom poslužitelju moramo unijeti sljedeće naredbe:

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

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

Uredite /etc/rsyslog.conf i odkomentirajte 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

Možete provjeriti radi li sve pomoću naredbe zmprov gacf | grep zimbraLogHostname. Nakon izvršenja naredbe trebao bi se prikazati naziv hosta koji prikuplja zapise. Da biste ga promijenili, morate unijeti naredbu zmprov mcf zimbraLogHostname mailstore01.company.ru.

Na svim drugim infrastrukturnim poslužiteljima (LDAP, MTA i druga spremišta pošte), pokrenite naredbu zmprov gacf |grep zimbraLogHostname da biste vidjeli naziv glavnog računala na koji se šalju zapisi. Da biste ga promijenili, također možete unijeti naredbu zmprov mcf zimbraLogHostname mailstore01.company.ru

Također morate unijeti sljedeće naredbe na svakom poslužitelju:

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 toga, svi zapisnici bit će snimljeni na poslužitelju koji ste naveli, gdje ih je moguće jednostavno pregledati. Također, u Zimbra OSE administratorskoj konzoli, na ekranu s informacijama o statusu poslužitelja, pokrenuta usluga Logger bit će prikazana samo za poslužitelj mailstore01.

Kako raditi sa zapisima Zimbra OSE

Još jedna glavobolja za administratora može biti praćenje određene e-pošte. Budući da e-pošta u Zimbra OSE prolazi kroz nekoliko različitih događaja odjednom: skeniranje od strane antivirusa, antispama i tako dalje, prije nego što se prihvati ili pošalje, za administratora, ako e-pošta ne stigne, može biti prilično problematično pratiti u kojoj je fazi izgubljeno je .

Kako biste riješili ovaj problem, možete koristiti posebnu skriptu koju je razvio stručnjak za informacijsku sigurnost Viktor Dukhovny i preporučio je za korištenje programerima Postfixa. Ova skripta povezuje unose iz dnevnika za određeni proces i, zahvaljujući tome, omogućuje vam da brzo prikažete sve unose povezane sa slanjem određenog pisma na temelju njegovog identifikatora. Njegov rad je testiran na svim verzijama Zimbra OSE, počevši od 8.7. Ovdje je tekst 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";
}

Skripta je napisana u Perlu i da biste je pokrenuli morate je spremiti u datoteku usporediti.pl, učinite ga izvršnim, a zatim pokrenite datoteku navodeći datoteku dnevnika i koristeći pgrep za izdvajanje identifikacijskih informacija slova koje tražite collate.pl /var/log/zimbra.log | pgrep '[e-pošta zaštićena]> '. Rezultat će biti sekvencijalni izlaz redaka koji sadrže informacije o kretanju slova na poslužitelju.

# 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 sva pitanja vezana uz Zextras Suite možete kontaktirati predstavnicu Zextrasa Ekaterinu Triandafilidi putem e-maila [e-pošta zaštićena]

Izvor: www.habr.com