如何使用 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 的進展。 此層級的訊息包括有關建立或刪除郵箱的報告等。
  • 警告 - 此層級的事件通知有潛在危險的情況,但不會影響伺服器的操作。 例如,WARN 等級標記有關使用者登入嘗試失敗的訊息。
  • 錯誤 - 日誌中的此事件等級通知發生的錯誤,該錯誤本質上是本機錯誤,不會幹擾伺服器的操作。 此等級可以標記單一使用者的索引資料已損壞的錯誤。
  • 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日,一名員工向客戶發送了一封感染病毒的信件。 結果,客戶電腦上的資料被加密。 然而,該名員工發誓說他沒有寄過任何東西。 作為事件調查的一部分,企業安全服務要求系統管理員提供與被調查使用者相關的 XNUMX 月 XNUMX 日郵件伺服器日誌。 借助時間戳,系統管理員可以找到必要的日誌文件,提取必要的資訊並將其傳輸給安全專家。 然後,這些人再查看該信件,發現發送這封信的 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
$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 zimbraLog主機名。 執行該指令後,應顯示收集日誌的主機名稱。 為了更改它,您必須輸入命令 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 管理員控制台中,在有關伺服器狀態資訊的畫面上,將僅顯示 mailstore01 伺服器正在執行的 Logger 服務。

如何使用 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 提取您要查找的字母的標識信息 collat​​.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