كيفية العمل مع سجلات Zimbra OSE

يعد تسجيل جميع الأحداث التي تحدث أحد أهم وظائف أي نظام مؤسسي. تتيح لك السجلات حل المشكلات الناشئة ، ومراجعة تشغيل أنظمة المعلومات ، والتحقيق في حوادث أمن المعلومات. يحتفظ Zimbra OSE أيضًا بسجلات تفصيلية لعمله. أنها تحتوي على جميع البيانات من أداء الخادم إلى إرسال واستقبال رسائل البريد الإلكتروني من قبل المستخدمين. ومع ذلك ، فإن قراءة السجلات التي تم إنشاؤها بواسطة Zimbra OSE هي مهمة غير تافهة إلى حد ما. في هذه المقالة ، باستخدام مثال محدد ، سنخبرك بكيفية قراءة سجلات Zimbra OSE ، بالإضافة إلى كيفية جعلها مركزية.



صورة

يتم تخزين جميع السجلات المحلية بواسطة Zimbra OSE في مجلد / opt / zimbra / log ، ويمكن أيضًا العثور على السجلات في ملف /var/log/zimbra.log. أهمها هو mailbox.log. يسجل جميع الإجراءات التي تحدث على خادم البريد. من بينها نقل الرسائل والبيانات المتعلقة بمصادقة المستخدم ومحاولات تسجيل الدخول غير الناجحة وغيرها. الإدخالات في mailbox.log عبارة عن سلسلة نصية تحتوي على الوقت الذي حدث فيه الحدث ، ومستوى الحدث ، ورقم التدفق الذي حدث فيه الحدث ، واسم المستخدم وعنوان IP الخاص به ، بالإضافة إلى الوصف النصي للحدث.







يشير مستوى السجل إلى الدرجة التي يؤثر بها الحدث على الخادم. بشكل افتراضي ، يتم استخدام 4 مستويات من الأحداث: INFO و WARN و ERROR و FATAL. دعنا نحلل جميع المستويات بالترتيب من حيث الخطورة المتزايدة.



  • INFO — Zimbra OSE.
  • WARN — , , . WARN .
  • ERROR — , . , .
  • FATAL — , - . FATAL .


يتم تحديث ملف سجل خادم البريد يوميًا. دائمًا ما يكون لأحدث إصدار من الملف اسم Mailbox.log ، في حين أن السجلات الخاصة بتاريخ معين لها تاريخ في الاسم وهي موجودة في الأرشيف. على سبيل المثال mailbox.log.2020-09-29.tar.gz. هذا يبسط بشكل كبير النسخ الاحتياطي لسجلات الإجراءات والبحث في السجلات.



لراحة مسؤول النظام ، يحتوي المجلد / opt / zimbra / log / على سجلات أخرى. وهي تتضمن فقط تلك الإدخالات التي تتعلق بعناصر بيئة نظام تشغيل Zimbra المحددة. على سبيل المثال ، يحتوي Audit.log على إدخالات حول مصادقة المستخدم فقط ، بينما يحتوي clamd.log على بيانات حول عملية مكافحة الفيروسات ، وما إلى ذلك. بالمناسبة ، هناك طريقة ممتازة لحماية خادم Zimbra OSE من المتطفلين وهي حماية الخادم باستخدام Fail2Banوالذي يعمل فقط على أساس Audit.log. من الممارسات الجيدة أيضًا إضافة مهمة cron لتنفيذ الأمر grep -ir "كلمة مرور غير صالحة" /opt/zimbra/log/audit.log لتلقي معلومات يومية عن محاولات تسجيل الدخول غير الناجحة.





مثال على كيفية عرض كلمة المرور مرتين بشكل غير صحيح ومحاولة تسجيل الدخول الناجحة في Audit.log



يمكن أن تكون السجلات في Zimbra OSE مفيدة للغاية في تحديد أسباب العديد من حالات الفشل الحرجة. في الوقت الذي يحدث فيه خطأ فادح ، لا يتوفر لدى المسؤول عادةً وقت لقراءة السجلات. مطلوب لاستعادة عملية الخادم في أسرع وقت ممكن. ومع ذلك ، في وقت لاحق ، عندما يتم تشغيل الخادم مرة أخرى ويقوم بإنشاء العديد من السجلات ، قد يكون من الصعب العثور على الإدخال المطلوب في ملف كبير. من أجل العثور بسرعة على سجل الخطأ ، يكفي معرفة الوقت الذي تم فيه إعادة تشغيل الخادم والعثور على إدخال في السجلات المؤرخة في هذا الوقت. سيكون السجل السابق هو سجل الخطأ الذي حدث. يمكنك أيضًا العثور على رسالة الخطأ من خلال البحث عن الكلمة الأساسية القاتلة.



أيضًا ، تتيح لك سجلات Zimbra OSE تحديد حالات الفشل غير الحرجة. على سبيل المثال ، للبحث عن استثناءات المعالج ، يمكنك البحث عن استثناءات المعالج. غالبًا ما تكون الأخطاء التي يتم إنشاؤها بواسطة المعالجات مصحوبة بتتبع مكدس ، مما يفسر سبب الاستثناء. في حالة وجود أخطاء في تسليم البريد ، يجب أن تبدأ البحث باستخدام الكلمة الأساسية LmtpServer ، وللبحث عن الأخطاء المتعلقة ببروتوكولات POP أو IMAP ، يمكنك استخدام الكلمات الأساسية ImapServer و Pop3Server.



أيضًا ، يمكن أن تساعد السجلات في التحقيق في حوادث أمن المعلومات. لنفكر في مثال محدد. في 20 سبتمبر ، أرسل أحد الموظفين خطابًا مصابًا بالفيروس إلى العميل. نتيجة لذلك ، تم تشفير البيانات الموجودة على كمبيوتر العميل. ومع ذلك ، يقسم الموظف أنه لم يرسل أي شيء. كجزء من التحقيق في الحادث ، تطلب خدمة أمان المؤسسة من مسؤول النظام سجلات خادم البريد في 20 سبتمبر المرتبطة بالمستخدم قيد التحقيق. بفضل الطابع الزمني ، يجد مسؤول النظام الملف الضروري بالسجلات ، ويستخرج المعلومات الضرورية وينقلها إلى أفراد الأمن. هؤلاء ، بدورهم ، ينظرون إليه ويجدون أن عنوان IP الذي تم إرسال هذه الرسالة منه يطابق عنوان IP لجهاز كمبيوتر المستخدم.وأكدت لقطات كاميرات المراقبة أن الموظف كان في مكان عمله عندما تم إرسال الخطاب. كانت هذه البيانات كافية لاتهامه بانتهاك قواعد أمن المعلومات وفصله. 





مثال على استخراج السجلات حول أحد الحسابات من 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 imudp

$ 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 تمر بعدة أحداث مختلفة في وقت واحد: التحقق من خلال برامج مكافحة الفيروسات ومكافحة البريد العشوائي وما إلى ذلك ، قبل استلامها أو إرسالها ، بالنسبة للمسؤول ، إذا لم يصل البريد الإلكتروني ، فقد يكون من الصعب جدًا تتبع المرحلة التي تم فقدها ...



لحل هذه المشكلة ، يمكنك استخدام برنامج نصي خاص تم تطويره بواسطة متخصص أمن المعلومات فيكتور دوخوفني ويوصى باستخدامه بواسطة مطوري 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



All Articles