Kuidas töötada Zimbra OSE logidega

Kõikide toimuvate sündmuste logimine on mis tahes ettevõtte süsteemi üks olulisemaid funktsioone. Logid võimaldavad lahendada esilekerkivaid probleeme, auditeerida infosüsteemide tööd ning uurida ka infoturbeintsidente. Zimbra OSE peab ka üksikasjalikke logisid oma toimimise kohta. Need hõlmavad kõiki andmeid alates serveri jõudlusest kuni kasutajate e-kirjade saatmise ja vastuvõtmiseni. Zimbra OSE loodud logide lugemine on aga üsna mittetriviaalne ülesanne. Selles artiklis räägime teile konkreetse näite abil, kuidas Zimbra OSE logisid lugeda ja kuidas neid tsentraliseerida.

Kuidas töötada Zimbra OSE logidega
Zimbra OSE salvestab kõik kohalikud logid kausta /opt/zimbra/log ja logid leiate ka failist /var/log/zimbra.log. Olulisim neist on mailbox.log. See salvestab kõik toimingud, mis meiliserveris toimuvad. Nende hulka kuuluvad e-kirjade edastamine, kasutaja autentimisandmed, ebaõnnestunud sisselogimiskatsed ja muud. Kirjed mailbox.logis on tekstistring, mis sisaldab sündmuse toimumise aega, sündmuse taset, lõime numbrit, milles sündmus toimus, kasutajanime ja IP-aadressi, samuti sündmuse tekstilist kirjeldust .

Kuidas töötada Zimbra OSE logidega

Logitase näitab sündmuse mõju astet serveri tööle. Vaikimisi on 4 sündmuse taset: INFO, WARN, ERROR ja FATAL. Vaatame kõiki tasemeid kasvavas raskusastmes.

  • INFO – selle taseme sündmused on tavaliselt mõeldud Zimbra OSE edenemisest teavitamiseks. Selle taseme sõnumid sisaldavad aruandeid postkasti loomise või kustutamise jms kohta.
  • HOIATUS – selle taseme sündmused teavitavad olukordadest, mis on potentsiaalselt ohtlikud, kuid ei mõjuta serveri tööd. Näiteks tase WARN tähistab teadet kasutaja ebaõnnestunud sisselogimiskatse kohta.
  • ERROR - see sündmuse tase logis teavitab vea ilmnemisest, mis on olemuselt lokaalne ja ei sega serveri tööd. See tase võib märgistada tõrke, mille korral üksiku kasutaja registriandmed on rikutud.
  • FATAL – see tase näitab tõrkeid, mille tõttu server ei saa normaalselt edasi töötada. Näiteks on FATAL tase kirje jaoks, mis näitab suutmatust DBMS-iga ühendust luua.

Meiliserveri logifaili uuendatakse iga päev. Faili uusima versiooni nimi on alati Mailbox.log, samas kui teatud kuupäeva logidel on nimes kuupäev ja need sisalduvad arhiivis. Näiteks mailbox.log.2020-09-29.tar.gz. See muudab tegevuslogide varundamise ja logide kaudu otsimise palju lihtsamaks.

Süsteemiadministraatori mugavuse huvides sisaldab kaust /opt/zimbra/log/ muid logisid. Need sisaldavad ainult kirjeid, mis on seotud konkreetsete Zimbra OSE elementidega. Näiteks audit.log sisaldab ainult kirjeid kasutaja autentimise kohta, clamd.log sisaldab andmeid viirusetõrje toimimise kohta jne. Muide, suurepärane viis Zimbra OSE serveri kaitsmiseks sissetungijate eest on serveri kaitse Fail2Bani abil, mis töötab lihtsalt audit.logi põhjal. Samuti on hea tava lisada käsu täitmiseks cron ülesanne grep -ir „kehtetu parool“ /opt/zimbra/log/audit.logigapäevase sisselogimistõrgeteabe saamiseks.

Kuidas töötada Zimbra OSE logidega
Näide sellest, kuidas audit.log näitab kaks korda valesti sisestatud parooli ja edukat sisselogimiskatset.

Zimbra OSE logid võivad olla väga kasulikud erinevate kriitiliste tõrgete põhjuste tuvastamisel. Kriitilise vea ilmnemisel pole administraatoril tavaliselt aega logide lugemiseks. Server tuleb võimalikult kiiresti taastada. Kuid hiljem, kui server on varundatud ja genereerib palju logisid, võib vajaliku kirje leidmine suurest failist olla keeruline. Veakirje kiireks leidmiseks piisab serveri taaskäivitamise kellaajast ja sellest ajast pärineva kirje leidmisest logides. Eelmine kirje on ilmnenud vea kirje. Veateate leiate ka otsides märksõna FATAL.

Zimbra OSE logid võimaldavad tuvastada ka mittekriitilisi tõrkeid. Näiteks töötleja erandite leidmiseks võite otsida töötleja erandit. Sageli kaasneb töötlejate tekitatud vigadega pinu jälg, mis selgitab, mis erandi põhjustas. Kui meili kohaletoimetamisega tekib tõrkeid, tuleks otsingut alustada märksõnaga LmtpServer ning POP- või IMAP-protokolliga seotud vigade otsimiseks kasutada märksõnu ImapServer ja Pop3Server.

Logid võivad abiks olla ka infoturbeintsidentide uurimisel. Vaatame konkreetset näidet. 20. septembril saatis üks töötajatest kliendile viirusega nakatunud kirja. Selle tulemusena krüpteeriti kliendi arvutis olevad andmed. Töötaja aga vannub, et ei saatnud midagi. Juhtumi uurimise raames küsib ettevõtte turvateenistus süsteemiadministraatorilt uuritava kasutajaga seotud 20. septembri meiliserveri logisid. Tänu ajatemplile leiab süsteemiadministraator vajaliku logifaili, eraldab vajaliku info ja edastab selle turvaspetsialistidele. Need omakorda vaatavad selle läbi ja leiavad, et IP-aadress, millelt see kiri saadeti, vastab kasutaja arvuti IP-aadressile. CCTV kaadrid kinnitasid, et töötaja viibis kirja saatmise ajal oma töökohal. Nendest andmetest piisas, et teda süüdistada infoturbereeglite rikkumises ja vallandada. 

Kuidas töötada Zimbra OSE logidega
Näide ühe konto kohta kirjete ekstraktimiseks logist Mailbox.log eraldi faili

Kõik muutub palju keerulisemaks, kui tegemist on mitme serveri infrastruktuuriga. Kuna logisid kogutakse kohapeal, on nendega töötamine mitme serveri infrastruktuuris väga ebamugav ja seetõttu on vaja logide kogumine tsentraliseerida. Seda saab teha logide kogumiseks hosti seadistamisega. Taristule pole erilist vajadust lisada spetsiaalset hosti. Iga meiliserver võib toimida logide kogumise sõlmena. Meie puhul on selleks Mailstore01 sõlm.

Selles serveris peame sisestama järgmised käsud:

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

Redigeerige faili /etc/sysconfig/rsyslog ja määrake SYSLOGD_OPTIONS=”-r -c 2″

Redigeerige faili /etc/rsyslog.conf ja tühjendage järgmised read:
$ModLoad imudp
$UDPServerRun 514

Sisestage järgmised käsud:

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

Saate kontrollida, kas kõik töötab, kasutades käsku zmprov gacf | grep zimbraLogHostinimi. Pärast käsu täitmist tuleks kuvada logisid koguva hosti nimi. Selle muutmiseks peate sisestama käsu zmprov mcf zimbraLogHostname mailstore01.company.ru.

Kõigis teistes infrastruktuuriserverites (LDAP, MTA ja muud meilipoed) käivitage käsk zmprov gacf |grep zimbraLogHostname, et näha hosti nime, millele logid saadetakse. Selle muutmiseks võite sisestada ka käsu zmprov mcf zimbraLogHostname mailstore01.company.ru

Samuti peate igasse serverisse sisestama järgmised käsud:

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

Pärast seda salvestatakse kõik logid teie määratud serverisse, kus neid saab mugavalt vaadata. Samuti kuvatakse Zimbra OSE administraatorikonsoolis serverite oleku teabega ekraanil töötav Loggeri teenus ainult serveri mailstore01 jaoks.

Kuidas töötada Zimbra OSE logidega

Teine peavalu administraatori jaoks võib olla konkreetse meili jälgimine. Kuna Zimbra OSE e-kirjad läbivad korraga mitu erinevat sündmust: skannimine viirusetõrje, rämpsposti jne abil, enne vastuvõtmist või saatmist, siis administraatori jaoks võib meili mitte saabumise korral olla üsna problemaatiline jälgida, millises etapis see oli kadunud.

Selle probleemi lahendamiseks võite kasutada spetsiaalset skripti, mille töötas välja infoturbe spetsialist Viktor Dukhovny ja mida soovitasid kasutada Postfixi arendajad. See skript ühendab logide kirjed konkreetse protsessi jaoks ja tänu sellele võimaldab teil kiiresti kuvada kõik konkreetse kirja saatmisega seotud kirjed selle identifikaatori alusel. Selle tööd on testitud kõigis Zimbra OSE versioonides, alates versioonist 8.7. Siin on stsenaariumi tekst.

#! /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 on kirjutatud Perlis ja selle käivitamiseks peate selle faili salvestama võrdle.pl, muutke see käivitatavaks ja seejärel käivitage fail, mis määrab logifaili ja kasutades pgrep otsitava tähe identifitseerimisteabe eraldamiseks collate.pl /var/log/zimbra.log | pgrep '[meiliga kaitstud]>’. Tulemuseks on ridade järjestikune väljund, mis sisaldab teavet tähe liikumise kohta serveris.

# 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

Kõigi Zextras Suite'i puudutavate küsimuste korral võite pöörduda Zextras esindaja Ekaterina Triandafilidi poole e-posti teel [meiliga kaitstud]

Allikas: www.habr.com