Cách làm việc với nhật ký Zimbra OSE

Ghi nhật ký tất cả các sự kiện xảy ra là một trong những chức năng quan trọng nhất của bất kỳ hệ thống công ty nào. Nhật ký cho phép bạn giải quyết các vấn đề mới nổi, kiểm tra hoạt động của hệ thống thông tin và cũng điều tra các sự cố bảo mật thông tin. Zimbra OSE cũng lưu giữ nhật ký chi tiết về hoạt động của nó. Chúng bao gồm tất cả dữ liệu từ hiệu suất máy chủ đến việc gửi và nhận email của người dùng. Tuy nhiên, việc đọc nhật ký do Zimbra OSE tạo ra là một nhiệm vụ không hề đơn giản. Trong bài viết này, bằng một ví dụ cụ thể, chúng tôi sẽ cho bạn biết cách đọc nhật ký Zimbra OSE cũng như cách tập trung hóa chúng.

Cách làm việc với nhật ký Zimbra OSE
Zimbra OSE lưu trữ tất cả nhật ký cục bộ trong thư mục /opt/zimbra/log và cũng có thể tìm thấy nhật ký trong tệp /var/log/zimbra.log. Điều quan trọng nhất trong số này là hòm thư.log. Nó ghi lại tất cả các hành động xảy ra trên máy chủ thư. Chúng bao gồm việc truyền email, dữ liệu xác thực người dùng, các lần đăng nhập không thành công và các dữ liệu khác. Các mục trong hộp thư.log là một chuỗi văn bản chứa thời gian xảy ra sự kiện, cấp độ của sự kiện, số luồng nơi sự kiện xảy ra, tên người dùng và địa chỉ IP cũng như mô tả văn bản về sự kiện .

Cách làm việc với nhật ký Zimbra OSE

Mức độ nhật ký cho biết mức độ ảnh hưởng của sự kiện đến hoạt động của máy chủ. Theo mặc định có 4 cấp độ sự kiện: INFO, WARN, ERROR và FATAL. Chúng ta hãy xem xét tất cả các cấp độ theo thứ tự mức độ nghiêm trọng tăng dần.

  • THÔNG TIN - Các sự kiện ở cấp độ này thường nhằm mục đích thông báo về tiến trình của Zimbra OSE. Thư ở cấp độ này bao gồm các báo cáo về việc tạo hoặc xóa hộp thư, v.v.
  • CẢNH BÁO - các sự kiện ở cấp độ này thông báo về các tình huống có khả năng nguy hiểm nhưng không ảnh hưởng đến hoạt động của máy chủ. Ví dụ: mức WARN đánh dấu một thông báo về nỗ lực đăng nhập của người dùng không thành công.
  • LỖI - cấp độ sự kiện này trong nhật ký thông báo về việc xảy ra lỗi mang tính chất cục bộ và không ảnh hưởng đến hoạt động của máy chủ. Cấp độ này có thể gắn cờ một lỗi trong đó dữ liệu chỉ mục của một người dùng cá nhân đã bị hỏng.
  • FATAL - mức này biểu thị lỗi do máy chủ không thể tiếp tục hoạt động bình thường. Ví dụ: mức FATAL sẽ dành cho một bản ghi cho biết không thể kết nối với DBMS.

Tệp nhật ký máy chủ thư được cập nhật hàng ngày. Phiên bản mới nhất của tệp luôn có tên Mailbox.log, trong khi nhật ký cho một ngày nhất định có ngày trong tên và được chứa trong kho lưu trữ. Ví dụ: hộp thư.log.2020-09-29.tar.gz. Điều này giúp việc sao lưu nhật ký hoạt động và tìm kiếm qua nhật ký trở nên dễ dàng hơn nhiều.

Để thuận tiện cho quản trị viên hệ thống, thư mục /opt/zimbra/log/ chứa các nhật ký khác. Chúng chỉ bao gồm các mục liên quan đến các phần tử Zimbra OSE cụ thể. Ví dụ: Audit.log chỉ chứa các bản ghi về xác thực người dùng, Clamd.log chứa dữ liệu về hoạt động của phần mềm chống vi-rút, v.v. Nhân tiện, một phương pháp tuyệt vời để bảo vệ máy chủ Zimbra OSE khỏi những kẻ xâm nhập là bảo vệ máy chủ bằng Fail2Ban, chỉ hoạt động dựa trên Audit.log. Bạn cũng nên thêm tác vụ cron để thực thi lệnh grep -ir "mật khẩu không hợp lệ" /opt/zimbra/log/audit.logđể nhận thông tin lỗi đăng nhập hàng ngày.

Cách làm việc với nhật ký Zimbra OSE
Một ví dụ về cách Audit.log hiển thị mật khẩu được nhập sai hai lần và lần đăng nhập thành công.

Nhật ký trong Zimbra OSE có thể cực kỳ hữu ích trong việc xác định nguyên nhân của nhiều lỗi nghiêm trọng khác nhau. Tại thời điểm xảy ra lỗi nghiêm trọng, quản trị viên thường không có thời gian để đọc nhật ký. Cần phải khôi phục máy chủ càng sớm càng tốt. Tuy nhiên, sau này, khi máy chủ sao lưu và tạo ra nhiều nhật ký, có thể khó tìm thấy mục nhập cần thiết trong một tệp lớn. Để nhanh chóng tìm thấy bản ghi lỗi, chỉ cần biết thời điểm máy chủ được khởi động lại và tìm một mục trong nhật ký kể từ thời điểm đó là đủ. Mục nhập trước đó sẽ là bản ghi lỗi đã xảy ra. Bạn cũng có thể tìm thông báo lỗi bằng cách tìm kiếm từ khóa FATAL.

Nhật ký Zimbra OSE cũng cho phép bạn xác định các lỗi không nghiêm trọng. Ví dụ: để tìm ngoại lệ của trình xử lý, bạn có thể tìm kiếm ngoại lệ của trình xử lý. Thông thường, các lỗi do trình xử lý tạo ra sẽ đi kèm với dấu vết ngăn xếp giải thích nguyên nhân xảy ra ngoại lệ. Trong trường hợp xảy ra lỗi khi gửi thư, bạn nên bắt đầu tìm kiếm bằng từ khóa LmtpServer, và để tìm kiếm các lỗi liên quan đến giao thức POP hoặc IMAP, bạn có thể sử dụng từ khóa ImapServer và Pop3Server.

Nhật ký cũng có thể hữu ích khi điều tra các sự cố bảo mật thông tin. Hãy xem xét một ví dụ cụ thể. Vào ngày 20 tháng 20, một nhân viên đã gửi một lá thư bị nhiễm virus cho khách hàng. Kết quả là dữ liệu trên máy tính của khách hàng đã được mã hóa. Tuy nhiên, nhân viên này thề rằng mình không gửi gì cả. Là một phần của cuộc điều tra về vụ việc, dịch vụ bảo mật doanh nghiệp yêu cầu quản trị viên hệ thống ghi nhật ký máy chủ thư vào ngày XNUMX tháng XNUMX liên quan đến người dùng đang bị điều tra. Nhờ dấu thời gian, quản trị viên hệ thống tìm thấy tệp nhật ký cần thiết, trích xuất thông tin cần thiết và chuyển cho các chuyên gia bảo mật. Đến lượt họ, họ xem qua nó và thấy rằng địa chỉ IP mà bức thư này được gửi đi tương ứng với địa chỉ IP của máy tính người dùng. Đoạn phim CCTV xác nhận rằng nhân viên này đang ở nơi làm việc khi bức thư được gửi đi. Dữ liệu này đủ để buộc tội anh ta vi phạm các quy tắc bảo mật thông tin và sa thải anh ta. 

Cách làm việc với nhật ký Zimbra OSE
Ví dụ về trích xuất bản ghi về một trong các tài khoản từ nhật ký Mailbox.log vào một tệp riêng

Mọi thứ trở nên phức tạp hơn nhiều khi nói đến cơ sở hạ tầng nhiều máy chủ. Vì nhật ký được thu thập cục bộ nên làm việc với chúng trong cơ sở hạ tầng nhiều máy chủ là rất bất tiện và do đó cần phải tập trung hóa việc thu thập nhật ký. Điều này có thể được thực hiện bằng cách thiết lập một máy chủ để thu thập nhật ký. Không có nhu cầu cụ thể để thêm một máy chủ chuyên dụng vào cơ sở hạ tầng. Bất kỳ máy chủ thư nào cũng có thể hoạt động như một nút để thu thập nhật ký. Trong trường hợp của chúng tôi, đây sẽ là nút Mailstore01.

Trên máy chủ này, chúng ta cần nhập các lệnh dưới đây:

sudo su – zimbra 
zmcontrol stop
exit
sudo /opt/zimbra/libexec/zmfixperms -e -v

Chỉnh sửa tệp /etc/sysconfig/rsyslog và đặt SYSLOGD_OPTIONS=”-r -c 2″

Chỉnh sửa /etc/rsyslog.conf và bỏ ghi chú các dòng sau:
$ModLoad imudp
$UDPServerRun 514

Nhập các lệnh sau:

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

Bạn có thể kiểm tra xem mọi thứ có hoạt động hay không bằng lệnh zmprov gacf | grep zimbraLogHostname. Sau khi thực hiện lệnh, tên của máy chủ thu thập nhật ký sẽ được hiển thị. Để thay đổi nó, bạn phải nhập lệnh zmprov mcf zimbraLogHostname mailstore01.company.ru.

Trên tất cả các máy chủ cơ sở hạ tầng khác (LDAP, MTA và các kho thư khác), hãy chạy lệnh zmprov gacf |grep zimbraLogHostname để xem tên của máy chủ lưu trữ nhật ký được gửi tới. Để thay đổi, bạn cũng có thể nhập lệnh zmprov mcf zimbraLogHostname mailstore01.company.ru

Bạn cũng phải nhập các lệnh sau trên mỗi máy chủ:

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

Sau đó, tất cả nhật ký sẽ được ghi lại trên máy chủ mà bạn đã chỉ định, nơi chúng có thể được xem một cách thuận tiện. Ngoài ra, trong bảng điều khiển dành cho quản trị viên Zimbra OSE, trên màn hình có thông tin về trạng thái của các máy chủ, dịch vụ Logger đang chạy sẽ chỉ được hiển thị cho máy chủ mailstore01.

Cách làm việc với nhật ký Zimbra OSE

Một vấn đề đau đầu khác đối với quản trị viên có thể là theo dõi một email cụ thể. Vì email trong Zimbra OSE trải qua nhiều sự kiện khác nhau cùng một lúc: quét bằng phần mềm chống vi-rút, chống thư rác, v.v., trước khi được chấp nhận hoặc gửi, đối với quản trị viên, nếu email không đến, việc theo dõi ở giai đoạn nào có thể khá khó khăn. nó đã bị mất.

Để giải quyết vấn đề này, bạn có thể sử dụng một tập lệnh đặc biệt do chuyên gia bảo mật thông tin Viktor Dukhovny phát triển và được các nhà phát triển Postfix khuyến nghị sử dụng. Tập lệnh này ghép các mục từ nhật ký cho một quy trình cụ thể và do đó, cho phép bạn hiển thị nhanh chóng tất cả các mục liên quan đến việc gửi một bức thư cụ thể dựa trên mã định danh của nó. Công việc của nó đã được thử nghiệm trên tất cả các phiên bản Zimbra OSE, bắt đầu từ 8.7. Đây là nội dung của kịch bản.

#! /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";
}

Kịch bản được viết bằng Perl và để chạy nó bạn cần lưu nó vào một tệp đối chiếu.pl, làm cho nó có thể thực thi được, sau đó chạy tệp chỉ định tệp nhật ký và sử dụng pgrep để trích xuất thông tin nhận dạng của chữ cái bạn đang tìm kiếm collate.pl /var/log/zimbra.log | pgrep '[email được bảo vệ]>’. Kết quả sẽ là xuất ra tuần tự các dòng chứa thông tin về chuyển động của chữ cái trên máy chủ.

# 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

Đối với tất cả các câu hỏi liên quan đến Zextras Suite, bạn có thể liên hệ với Đại diện Zextras Ekaterina Triandafilidi qua email [email được bảo vệ]

Nguồn: www.habr.com