כיצד לעבוד עם יומני Zimbra OSE

רישום של כל האירועים המתרחשים הוא אחת הפונקציות החשובות ביותר של כל מערכת ארגונית. יומנים מאפשרים לך לפתור בעיות צצות, לבקר את פעולת מערכות המידע וגם לחקור אירועי אבטחת מידע. Zimbra OSE גם שומרת יומנים מפורטים של פעולתו. הם כוללים את כל הנתונים מביצועי השרת ועד שליחה וקבלה של מיילים על ידי משתמשים. עם זאת, קריאת היומנים שנוצרו על ידי Zimbra OSE היא משימה לא טריוויאלית למדי. במאמר זה, בעזרת דוגמה ספציפית, נספר לכם כיצד לקרוא את יומני Zimbra OSE, כמו גם כיצד להפוך אותם לריכוזיים.

כיצד לעבוד עם יומני Zimbra OSE
Zimbra OSE מאחסן את כל היומנים המקומיים בתיקייה /opt/zimbra/log, וניתן למצוא יומנים גם בקובץ /var/log/zimbra.log. החשוב שבהם הוא mailbox.log. הוא מתעד את כל הפעולות המתרחשות בשרת הדואר. אלה כוללים העברת הודעות דוא"ל, נתוני אימות משתמשים, ניסיונות התחברות כושלים ואחרים. ערכים ב-mailbox.log הם מחרוזת טקסט המכילה את השעה שבה התרחש האירוע, רמת האירוע, מספר השרשור שבו התרחש האירוע, שם המשתמש וכתובת ה-IP, וכן תיאור טקסט של האירוע. .

כיצד לעבוד עם יומני Zimbra OSE

רמת היומן מציינת את מידת ההשפעה של האירוע על פעולת השרת. כברירת מחדל, ישנן 4 רמות אירועים: INFO, WARN, ERROR ו-FATAL. בואו נסתכל על כל הרמות בסדר גובר של חומרה.

  • INFO - אירועים ברמה זו נועדו בדרך כלל ליידע על ההתקדמות של Zimbra OSE. הודעות ברמה זו כוללות דיווחים על יצירה או מחיקה של תיבת דואר וכן הלאה.
  • אזהרה - אירועים ברמה זו מודיעים על מצבים שעלולים להיות מסוכנים, אך אינם משפיעים על פעולת השרת. לדוגמה, רמת WARN מסמנת הודעה על ניסיון כניסה של משתמש שנכשל.
  • ERROR - רמת אירועים זו ביומן מודיעה על התרחשות שגיאה בעלת אופי מקומי ואינה מפריעה לפעולת השרת. רמה זו יכולה לסמן שגיאה שבה נתוני האינדקס של משתמש בודד נפגמו.
  • FATAL - רמה זו מצביעה על שגיאות שבגללן השרת לא יכול להמשיך לפעול כרגיל. לדוגמה, רמת ה-FATAL תהיה עבור רשומה המציינת את חוסר היכולת להתחבר ל-DBMS.

קובץ היומן של שרת הדואר מתעדכן מדי יום. לגרסה העדכנית ביותר של הקובץ יש תמיד את השם Mailbox.log, בעוד שליומנים לתאריך מסוים יש תאריך בשם והם כלולים בארכיון. למשל mailbox.log.2020-09-29.tar.gz. זה מקל הרבה יותר על גיבוי יומני פעילות וחיפוש ביומנים.

לנוחיות מנהל המערכת, התיקיה /opt/zimbra/log/ מכילה יומנים אחרים. הם כוללים רק ערכים הקשורים לאלמנטים ספציפיים של Zimbra OSE. לדוגמה, audit.log מכיל רק רשומות על אימות משתמשים, clamd.log מכיל נתונים על פעולת האנטי וירוס וכן הלאה. דרך אגב, שיטה מצוינת להגנה על שרת Zimbra OSE מפני פולשים היא הגנת שרת באמצעות Fail2Ban, שפשוט עובד על סמך audit.log. זה גם תרגול טוב להוסיף משימת cron לביצוע הפקודה grep -ir "סיסמה לא חוקית" /opt/zimbra/log/audit.logכדי לקבל מידע יומי על כשל בכניסה.

כיצד לעבוד עם יומני Zimbra OSE
דוגמה לאופן שבו audit.log מציג סיסמה שהוזנה פעמיים בצורה שגויה וניסיון כניסה מוצלח.

יומנים ב-Zimbra OSE יכולים להיות שימושיים ביותר בזיהוי הגורמים לכשלים קריטיים שונים. ברגע שמתרחשת שגיאה קריטית, למנהל בדרך כלל אין זמן לקרוא את היומנים. יש צורך לשחזר את השרת בהקדם האפשרי. עם זאת, מאוחר יותר, כאשר השרת מגבה ומייצר הרבה יומנים, יכול להיות קשה למצוא את הערך הנדרש בקובץ גדול. כדי למצוא במהירות רשומת שגיאה, מספיק לדעת את השעה שבה השרת הופעל מחדש ולמצוא ערך ביומנים המתוארכים לזמן זה. הערך הקודם יהיה תיעוד של השגיאה שהתרחשה. אתה יכול גם למצוא את הודעת השגיאה על ידי חיפוש מילת המפתח FATAL.

יומני Zimbra OSE מאפשרים גם לזהות כשלים לא קריטיים. לדוגמה, כדי למצוא חריגים של מטפל, אתה יכול לחפש חריג מטפל. לעתים קרובות, שגיאות שנוצרו על ידי מטפלים מלוות במעקב מחסנית שמסביר מה גרם לחריגה. במקרה של שגיאות במשלוח דואר, עליך להתחיל את החיפוש עם מילת המפתח LmtpServer, וכדי לחפש שגיאות הקשורות לפרוטוקולי POP או IMAP, תוכל להשתמש במילות המפתח ImapServer ו-Pop3Server.

יומני רישום יכולים גם להיות מועילים בחקירת אירועי אבטחת מידע. בואו ניקח דוגמה ספציפית: ב-20 בספטמבר, עובד שלח דוא"ל נגוע בווירוס ללקוח. כתוצאה מכך, הנתונים במחשב הלקוח הוצפנו. עם זאת, העובד נשבע שלא שלח דבר. כחלק מחקירת האירוע, שירות האבטחה של החברה מבקש ממנהל המערכת לספק יומני רישום של שרת הדואר ל-20 בספטמבר הקשורים למשתמש הנבדק. באמצעות חותמת הזמן, מנהל המערכת מאתר את קובץ הרישום הרלוונטי, מחלץ את המידע הדרוש ומעביר אותו למומחי אבטחה. הם, בתורם, בודקים את היומנים ומגלים שכתובת ה-IP שממנה נשלח הדוא"ל תואמת. כתובת ה - IP מחשב המשתמש. צילומי מצלמות אבטחה אישרו כי העובד היה ליד שולחנו בעת שליחת האימייל. ראיות אלו הספיקו כדי להאשים אותו בהפרת תקנות אבטחת מידע ולפטר אותו. 

כיצד לעבוד עם יומני Zimbra OSE
דוגמה לחילוץ רשומות על אחד החשבונות מההתחברות Mailbox.log לקובץ נפרד

הכל הופך להרבה יותר מסובך כשמדובר בתשתית מרובת שרתים. היות והיומנים נאספים באופן מקומי, העבודה איתם בתשתית מרובת שרתים היא מאוד לא נוחה ולכן יש צורך לרכז את איסוף היומנים. ניתן לעשות זאת על ידי הגדרת מארח לאיסוף יומנים. אין צורך מיוחד להוסיף מארח ייעודי לתשתית. כל שרת דואר יכול לשמש כצומת לאיסוף יומנים. במקרה שלנו, זה יהיה הצומת Mailstore01.

בשרת זה עלינו להזין את הפקודות הבאות:

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

ערוך את הקובץ /etc/sysconfig/rsyslog, והגדר את SYSLOGD_OPTIONS=”-r -c 2″

ערוך את /etc/rsyslog.conf ובטל את ההערה לשורות הבאות:
$ModLoad iudp
$UDPServerRun 514

הזן את הפקודות הבאות:

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

אתה יכול לבדוק שהכל עובד באמצעות הפקודה zmprov gacf | grep zimbraLogHostname. לאחר ביצוע הפקודה, יש להציג את שם המארח שאוסף יומנים. כדי לשנות אותו, עליך להזין את הפקודה zmprov mcf zimbraLogHostname mailstore01.company.ru.

בכל שרתי התשתית האחרים (LDAP, MTA וחנויות דואר אחרות), הפעל את הפקודה zmprov gacf |grep zimbraLogHostname כדי לראות את שם המארח שאליו נשלחים היומנים. כדי לשנות אותו, אתה יכול גם להזין את הפקודה zmprov mcf zimbraLogHostname mailstore01.company.ru

עליך להזין גם את הפקודות הבאות בכל שרת:

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

לאחר מכן, כל היומנים יתועדו בשרת שציינת, שם ניתן לצפות בהם בצורה נוחה. כמו כן, בקונסולת המנהלים של Zimbra OSE, על המסך עם מידע על מצב השרתים, שירות Logger הפועל יוצג רק עבור שרת mailstore01.

כיצד לעבוד עם יומני Zimbra OSE

כאב ראש נוסף למנהל יכול להיות מעקב אחר אימייל ספציפי. מכיוון שהודעות דוא"ל ב-Zimbra OSE עוברות מספר אירועים שונים בבת אחת: סריקה באמצעות אנטי וירוס, אנטי ספאם וכדומה, לפני קבלתן או שליחתן, עבור המנהל, אם המייל לא מגיע, זה יכול להיות די בעייתי להתחקות באיזה שלב זה היה אבוד.

על מנת לפתור בעיה זו, ניתן להשתמש בסקריפט מיוחד, אשר פותח על ידי מומחה אבטחת המידע Viktor Dukhovny והומלץ לשימוש על ידי מפתחי Postfix. סקריפט זה משרשר ערכים מיומנים עבור תהליך ספציפי, ובשל כך, מאפשר לך להציג במהירות את כל הערכים הקשורים לשליחת מכתב מסוים על סמך המזהה שלו. עבודתו נבדקה בכל הגרסאות של Zimbra OSE, החל מ-8.7. הנה הטקסט של התסריט.

#! /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";
}

הסקריפט כתוב ב-Perl וכדי להפעיל אותו צריך לשמור אותו בקובץ collate.pl, הפוך אותו לניתן להפעלה ולאחר מכן הרץ את הקובץ המציין את קובץ היומן ושימוש ב-pgrep כדי לחלץ את פרטי הזיהוי של האות שאתה מחפש collate.pl /var/log/zimbra.log | pgrep '<20200929164500.user@mail.company.ru>'. התוצאה תהיה פלט רציף של שורות המכילות מידע על תנועת האות בשרת.

# 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

לכל השאלות הקשורות ל-Zextras Suite, ניתן ליצור קשר עם נציגת Zextras, Ekaterina Triandafilidi, במייל katerina@zextras.com

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster