ZimbraOSEログの操作方法

発生するすべてのイベントのログ記録は、企業システムの最も重要な機能の1つです。ログを使用すると、新たな問題の解決、情報システムの運用の監査、および情報セキュリティインシデントの調査を行うことができます。 Zimbra OSEは、その作業の詳細なログも保持します。サーバーのパフォーマンスからユーザーによるメールの送受信まで、すべてのデータが含まれています。ただし、Zimbra OSEによって生成されたログを読み取ることは、かなり簡単な作業ではありません。この記事では、特定の例を使用して、ZimbraOSEログを読み取る方法とそれらを一元化する方法について説明します。



画像

すべてのローカルログは、ZimbraOSEによって/ opt / zimbra / logフォルダーに保存され、ログは/var/log/zimbra.logファイルにもあります。これらの中で最も重要なのはmailbox.logです。メールサーバーで実行されるすべてのアクションを記録します。その中には、手紙の送信、ユーザー認証に関するデータ、ログイン試行の失敗などがあります。メールボックス.logのエントリは、イベントが発生した時刻、イベントのレベル、イベントが発生したストリームの番号、ユーザー名とそのIPアドレス、およびイベントのテキストの説明を含むテキスト文字列です。







ログレベルは、イベントがサーバーに与える影響の程度を示します。デフォルトでは、INFO、WARN、ERROR、FATALの4つのレベルのイベントが使用されます。重大度の高い順にすべてのレベルを分析してみましょう。



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


メールサーバーのログファイルは毎日更新されます。ファイルの最新バージョンは常にMailbox.logという名前ですが、特定の日付のログの名前には日付が含まれており、アーカイブに含まれています。たとえば、mailbox.log.2020-09-29.tar.gzです。これにより、アクションログのバックアップとログの検索が大幅に簡素化されます。



システム管理者の便宜のために、/ opt / zimbra / log /フォルダーには他のログが含まれています。これらには、特定のZimbraOSE要素に関連するエントリのみが含まれます。たとえば、audit.logにはユーザー認証に関するエントリのみが含まれ、clamd.logにはアンチウイルス操作に関するデータが含まれます。ちなみに、Zimbra OSEサーバーを侵入者から保護する優れた方法は、Fail2Banを使用してサーバーを保護することです。これはaudit.logに基づいて機能します。失敗したログイン試行に関する毎日の情報を受信するために、コマンドgrep -ir "invalid password" /opt/zimbra/log/audit.logを実行するcronタスクを追加することもお勧めします。





2回誤って入力されたパスワードと成功したログイン試行がaudit.logに表示される方法の例



Zimbra OSEのログは、さまざまな重大な障害の原因を特定するのに非常に役立ちます。重大なエラーが発生した時点で、管理者は通常、ログを読み取る時間がありません。できるだけ早くサーバーの動作を復元する必要があります。ただし、後でサーバーが再度実行されて多くのログが生成されると、大きなファイルで必要なエントリを見つけるのが困難になる可能性があります。エラーレコードをすばやく見つけるには、サーバーが再起動された時刻を知り、その時刻までの日付のエントリをログで見つけるだけで十分です。前のレコードは、発生したエラーのレコードになります。 FATALキーワードを検索して、エラーメッセージを見つけることもできます。



また、Zimbra OSEログを使用すると、重大ではない障害を特定できます。たとえば、ハンドラーの例外を見つけるために、ハンドラーの例外を検索できます。多くの場合、ハンドラーによって生成されたエラーには、例外の原因を説明するスタックトレースが伴います。メール配信でエラーが発生した場合は、LmtpServerキーワードで検索を開始する必要があります。また、POPまたはIMAPプロトコルに関連するエラーを検索するには、ImapServerおよびPop3Serverキーワードを使用できます。



また、ログは情報セキュリティインシデントの調査に役立ちます。具体的な例を考えてみましょう。 9月20日、従業員の1人がウイルスに感染した手紙をクライアントに送信しました。その結果、クライアントのコンピューター上のデータは暗号化されました。しかし、従業員は何も送っていないと誓います。インシデント調査の一環として、エンタープライズセキュリティサービスは、調査中のユーザーに関連付けられた9月20日のメールサーバーログをシステム管理者に要求します。タイムスタンプのおかげで、システム管理者はログを含む必要なファイルを見つけ、必要な情報を抽出してセキュリティ担当者に転送します。次に、それらを調べて、このレターの送信元のIPアドレスがユーザーのコンピューターのIPアドレスと一致していることを確認します。CCTVの映像は、手紙が送られたときに従業員が職場にいたことを確認しました。このデータは、彼が情報セキュリティ規則に違反していると非難し、彼を解雇するのに十分でした。 





Mailbox.logから別のファイルにアカウントの1つに関するレコードを抽出する例



マルチサーバーインフラストラクチャに関しては、すべてがはるかに複雑になります。ログはローカルで収集されるため、マルチサーバーインフラストラクチャでログを操作するのは非常に不便であり、ログの収集を一元化する必要があります。これは、ログを収集するようにホストを構成することで実行できます。インフラストラクチャに専用のホストを追加する必要は特にありません。すべてのメールサーバーは、ログを収集するためのノードとして機能できます。この場合、これは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

$ UDPServerRun514




次のコマンドを入力します。



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


コマンドzmprovgacf |ですべてが機能していることを確認できます。 grepzimbraLogHostname。コマンドを実行すると、ログを収集するホストの名前が表示されます。これを変更するには、コマンドzmprov mcf zimbraLogHostnamemailstore01.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サーバーにのみ表示されます。







管理者にとってのもう1つの問題は、特定の電子メールメッセージを追跡することです。 Zimbra OSEのメールは、一度にいくつかの異なるイベントを通過するため、管理者にとって、受信または送信される前に、アンチウイルス、アンチスパムなどによるチェックが行われるため、メールが届かない場合、どの段階で失われたかを追跡するのは非常に問題になる可能性があります。 ..。



この問題を解決するために、情報セキュリティのスペシャリストであるViktor Dukhovnyによって開発され、Postfix開発者による使用が推奨されている特別なスクリプトを使用できます。このスクリプトは、特定のプロセスのログのレコードを連結します。これにより、識別子に基づいて特定の文字の送信に関連するすべてのレコードをすばやく表示できます。その作業は、8.7以降のすべてのバージョンのZimbraOSEでテストされています。これがスクリプトのテキストです。



#! /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で記述されており、実行するには、collat​​e.plファイルに保存し て実行可能にしてから、ログファイルを指定し、pgrepを使用して必要な文字の識別情報を強調表示するファイルを実行する必要があります 。collat​​e.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社のEkaterinaTriandafilidiの代表者に電子メールkaterina@zextras.comで連絡できます。



All Articles