วิธีการทำงานกับบันทึก 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 ลองดูทุกระดับตามลำดับความรุนแรงที่เพิ่มขึ้น

  • ข้อมูล - กิจกรรมในระดับนี้มักจะมีจุดมุ่งหมายเพื่อแจ้งเกี่ยวกับความคืบหน้าของ Zimbra OSE ข้อความในระดับนี้รวมถึงรายงานเกี่ยวกับการสร้างหรือการลบเมลบ็อกซ์ และอื่นๆ
  • คำเตือน - เหตุการณ์ในระดับนี้จะแจ้งเกี่ยวกับสถานการณ์ที่อาจเป็นอันตราย แต่ไม่ส่งผลกระทบต่อการทำงานของเซิร์ฟเวอร์ ตัวอย่างเช่น ระดับคำเตือนจะทำเครื่องหมายข้อความเกี่ยวกับการพยายามเข้าสู่ระบบของผู้ใช้ที่ล้มเหลว
  • ข้อผิดพลาด - ระดับเหตุการณ์นี้ในบันทึกจะแจ้งเกี่ยวกับการเกิดข้อผิดพลาดที่เกิดขึ้นในเครื่องและไม่รบกวนการทำงานของเซิร์ฟเวอร์ ระดับนี้สามารถตั้งค่าสถานะข้อผิดพลาดที่ข้อมูลดัชนีของผู้ใช้แต่ละรายเสียหาย
  • 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 การป้อนข้อมูล
$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 และหากต้องการรันคุณต้องบันทึกลงในไฟล์ เปรียบเทียบ.plทำให้สามารถเรียกใช้งานได้ จากนั้นรันไฟล์ที่ระบุไฟล์บันทึก และใช้ pgrep เพื่อแยกข้อมูลการระบุตัวตนของตัวอักษรที่คุณกำลังมองหา collate.pl /var/log/zimbra.log | พีเกรป '[ป้องกันอีเมล]> '. ผลลัพธ์จะเป็นผลลัพธ์ตามลำดับของบรรทัดที่มีข้อมูลเกี่ยวกับการเคลื่อนไหวของตัวอักษรบนเซิร์ฟเวอร์

# 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

สำหรับคำถามทั้งหมดที่เกี่ยวข้องกับ Zextras Suite คุณสามารถติดต่อตัวแทนของ Zextras Ekaterina Triandafilidi ทางอีเมล [ป้องกันอีเมล]

ที่มา: will.com