كيفية العمل مع سجلات 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. من بين رسائل هذا المستوى تقارير حول إنشاء صندوق بريد أو حذفه ، وما إلى ذلك.
  • تحذير - تشير أحداث هذا المستوى إلى المواقف التي يحتمل أن تكون خطرة ، ولكنها لا تؤثر على تشغيل الخادم. على سبيل المثال ، يمثل مستوى WARN رسالة حول محاولة تسجيل دخول غير ناجحة للمستخدم.
  • خطأ - يُعلم مستوى الحدث هذا في السجل بحدوث خطأ محلي بطبيعته ولا يتداخل مع تشغيل الخادم. يمكن أن يشير هذا المستوى إلى خطأ يتم فيه إتلاف بيانات الفهرس لمستخدم فردي.
  • فادح - الأخطاء التي تمنع الخادم من الاستمرار في العمل بشكل طبيعي يتم تمييزها بهذا المستوى. على سبيل المثال ، سيكون المستوى FATAL في السجل حول عدم القدرة على الاتصال بنظام DBMS.

يتم تحديث ملف سجل خادم البريد يوميًا. دائمًا ما يُطلق على أحدث إصدار من الملف اسم 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لتلقي معلومات يومية حول محاولات تسجيل الدخول الفاشلة.

كيفية العمل مع سجلات Zimbra OSE
مثال على كيفية إظهار Audit.log كلمة مرور مزدوجة غير صالحة ومحاولة تسجيل دخول ناجحة

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

كما تسمح لك سجلات 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 $ imudp
UDPServer تشغيل 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 '[البريد الإلكتروني محمي]> ". ستكون النتيجة ناتجًا تسلسليًا للأسطر التي تحتوي على معلومات حول حركة الحرف على الخادم.

# 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 عن طريق البريد الإلكتروني [البريد الإلكتروني محمي]

المصدر: www.habr.com