Postfix, Dovecot, Zabbixを入れてサーバーを監視してみる

この記事は[富士通クラウドテクノロジーズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fjct)の7日目の記事です。

Advent Calender 6日目は @ntoofu さんの[「社内CTFを開催しました」](https://tech.fjct.fujitsu.com/entry/2021/12/06/094339)でした。
参加はできなかったのですが、後日の解説を聞きCTFの面白さを知ることが出来ました。
記事のきっかけの部分に、
> 弊社のサービスの開発用の環境で、実際に攻撃を試してみることにしました。
> そして、DEF CON内の発表で初めて知ったある典型的な脆弱性について探してみたところ、その途中にそれとは異なる脆弱性を見つけてしまいました。  

とあり、スキルアップはもちろん実際の業務にも活かされるというのが面白いなと思いました。
次は参加したいなと思っています。
# はじめに  
FJCT新人の @HanchA です。
10月に配属され、それから運用に携わっています。
今回はサーバーの運用や監視を行っていく上で学習した内容について書いていこうと思います。

## 目的
- Zabbixによってサーバーを監視し、障害通知を受けとる

## 概要
- Postfix, Dovecotによるメールサーバーの構築
- Zabbixの構築  
- Zabbixによる障害メールの送信・受信

## 今回使用する環境について
- AWS無料枠のAmazon EC2
  - Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type 
- Postfix, Dovecot, Zabbix-server, Zabbix-agentを全て1サーバー上に構築

## メールの仕組みについて
- メールサーバーとは、メールの送信・受信を行うためのサーバーである
- メールの送信・転送には**SMTP**(Simple Mail Trancefar Protocol)というプロトコルが用いられる
  - Thunderbirdなどのメールソフトからメールを受け取り、送信先（相手）のSMTPサーバーに届ける役割を持つ
- メールの受信には**POP3**(Post Office Protocol), **IMAP**(Internet Message Access Protocol)というプロトコルが用いられる
  - SMTPサーバーから送られてきたメールを受け取り、Thunderbirdなどのメールソフトへメールを取り出す役割を持つ

**参考**
https://blastmail.jp/blog/mail-delivery/mail-server



# PostfixによるSMTPサーバー構築
- まずはPostfixによるSMTPサーバーの構築から行う
  - 参考 
      - [メールサーバー構築(Postfix+Dovecot)](https://centossrv.com/postfix.shtml)  
      - [Postfix詳解: MTAの理解とメールサーバの構築・運用](https://www.amazon.co.jp/Postfix%E8%A9%B3%E8%A7%A3%E2%80%95MTA%E3%81%AE%E7%90%86%E8%A7%A3%E3%81%A8%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E6%A7%8B%E7%AF%89%E3%83%BB%E9%81%8B%E7%94%A8-%E8%8D%92%E6%9C%A8-%E9%9D%96%E5%AE%8F/dp/4274065766)  

### 1. Postfixのインストール  
- `yum -y install postfix`
  -  本環境であるAmazon Linux 2には初期からpostfix-2.10.1-6.amzn2.0.3.x86_64 がインストール済のため省略  

### 2. 設定ファイルの編集
- /etc/postfix 以下のファイル内容を変更する

```main.cf
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = mail.example.com
mydomain = example.com
myorigin = $myhostname
inet_interfaces = localhost
inet_protocols = all
mydestination = $myhostname, localhost.$mydomain, localhost
local_recipient_maps =
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
luser_relay = unknown_user@localhost
smtpd_banner = $myhostname ESMTP unknown
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
message_size_limit = 1048576
```

### 3. メールボックスの作成  
```
$ mkdir -p /etc/skel/Maildir/{new,cur,tmp}
$ chmod -R 700 /etc/skel/Maildir/
$ echo unknown_user: /dev/null >> /etc/aliases
$ newaliases
```

### 4. Postfixの起動
```
systemctl restart postfix
systemctl enable postfix
```

### 5. Postfixの動作確認
```
$ yum -y install telnet
$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 xxxxxx ESMTP unknown
MAIL FROM: test@localhost
250 2.1.0 Ok
RCPT TO: ec2-user@localhost
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
FROM: test@localhost
Subject: test
test1413
.
250 2.0.0 Ok: queued as 72BC27A1B0
quit
221 2.0.0 Bye
Connection closed by foreign host.
```

- ↑によってホームディレクトリにMaildirが作成される  
  -  `/home/ec2-user/Maildir/new`
  - `/home/ec2-user/Maildir/cur`
  - `/home/ec2-user/Maildir/tmp`　　

- `/home/ec2-user/Maildir/new`に↑で作成したメールがあることが確認できる
![testmail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/a04d40e7-3cd2-c62e-c27c-ad5b5d7e3062.png)



## Zabbixによる監視
### 1. Zabbix-server, Zabbix-agentの構築
- 以下の記事を参考に、Zabbix5.0のインストール・各種設定を行う（本記事では手順は省きます）  

https://qiita.com/yes_dog/items/36a7f474e03806ef46ba

### 2. Zabbix-serverの動作確認
- EC2 コントロールパネルの「ネットワーク&セキュリティ」->「セキュリティグループ」からインバウンドルールを追加
  - タイプ「`HTTP`」, ソース「`マイ IP`」
- ブラウザから「http://\<IPアドレス>/zabbix」にアクセスし、設定を進める  
![zabbix-server_conf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/421ca51e-a97c-1aaa-af38-3330cabcc4d2.png)

### 3. ホストの追加  
- 左にある項目「Configuration」->「Hosts」->「Create host」からZabbix-agentを追加する
  - Host name「`zabbix agent`」, Groups「`Linux servers`」, Interfaces「`127.0.0.1`」, Port「`10050`」
![zabbix-addhost2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/4903999b-55ba-1db2-9ff7-a9e2456ae141.png)

### 4. テンプレートの追加
- 今回はアイテム、トリガーの作成を省き、テンプレートでの基本的な項目のみ追加する
- 「Hosts」->「zabbix agent」を選択し、「`Template Module Zabbix agent`」を追加する
  - これによりagentとの疎通やagentのバージョンを監視するアイテム、エージェントタイムアウトによるトリガーが追加される  
![zabbix-addtemplate1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/f6d33fc2-4698-16e2-df97-21e06fa61ae2.png)

### 5. 監視項目の確認
- 「Monitoring」->「Latest data」から取得したデータが確認できる
- 「Last value」に取得したデータが表示される
  - 「Configuration」->「Hosts」->「Items」からアイテムを選択し、「Execute now」を押すことで監視間隔を無視してデータを取得することができる
      - アイテムをテストする際に便利

## Zabbixからの障害メール送信
### 1. ユーザーのメディアの追加
- 今回、ユーザーは「Admin」を選択する
- 「Administration」->「Users」->「Admin」->「Media」->「Add」を選択する
  - Type「`Email`」, Send to「`ec2-user@mail.example.com`」 
![user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/13213d4e-9c7c-728b-aaeb-c171700e3006.png)


### 2. メディアタイプの追加
- 「Administration」->「Media types」->「Email」を選択する
  - SMTP server「`127.0.0.1`」, SMTP helo「`127.0.0.1`」, SMTP email「`zabbix@mail.example.com`」
![mediatype.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/a1edec17-65b3-5f81-f33b-0dbde18d447b.png)

### 3. メール送信のテスト
- ↑で設定した項目でzabbixからメールが送信されるか確認を行う
  - 「Administration」->「Media types」右の「Test」をクリック 
- うまく設定できている場合、以下のようにメールが送信される
![mail test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/9d410413-fc38-6898-2355-e8df0f2e1c14.png)


- `/home/ec2-user/Maildir/new`でメールが確認できる
![testmail2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/e29481e9-9874-2b28-f97e-efd23eabb03f.png)  

# DovecotによるPOP3サーバー構築
- ここまでで、SMTPサーバーとZabbixを構築し、監視対象サーバーとの疎通が取れなくなったりした際に障害メールを送ることができるようになった
- ここからはDovecotによりPOP3サーバーを構築し、障害メールを受け取れるようにする  

## 1. Dovecotのインストール
- `yum -y install dovecot`

## 2. 設定ファイルの編集
- /etc/dovecot 以下のファイル内容を編集していく

```/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir
```

```/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
```

```/etc/dovecot/conf.d/10-ssl.conf
ssl = no
```

## 3. Dovecotの起動
`systemctl start dovecot`
`systemctl enable dovecot`

## 4. Dovecotの動作確認
```
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
USER ec2-user
+OK
PASS <password>
+OK Logged in.
stat
+OK 9 8059
retr 4
+OK 993 octets
Return-Path: <zabbix@mail.example.com>
X-Original-To: ec2-user@mail.example.com
Delivered-To: ec2-user@mail.example.com
Received: from 127.0.01 (localhost [127.0.0.1])
        by mail.example.com (Postfix) with SMTP id C103F3B5BF
        for <ec2-user@mail.example.com>; Sun, 28 Nov 2021 15:15:40 +0900 (JST)
From: <zabbix@mail.example.com>
To: <ec2-user@mail.example.com>
In-Reply-To: 66.26a02de4aa51cfcd7284bd48afe4addc.1.972ff13a7a8531a0e2bf65aa705a95e0@zabbix.com
Date: Sun, 28 Nov 2021 15:15:40 +0900
Subject: Problem: Zabbix agent is not available (for 3m)
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64
Message-Id: <20211128061540.C103F3B5BF@mail.example.com>

UHJvYmxlbSBzdGFydGVkIGF0IDE1OjE1OjM3IG9uIDIwMjEuMTEuMjgNClByb2JsZW0gbmFtZTog
WmFiYml4IGFnZW50IGlzIG5vdCBhdmFpbGFibGUgKGZvciAzbSkNCkhvc3Q6IFphYmJpeCBzZXJ2
ZXINClNldmVyaXR5OiBBdmVyYWdlDQpPcGVyYXRpb25hbCBkYXRhOiBub3QgYXZhaWxhYmxlICgw
KQ0KT3JpZ2luYWwgcHJvYmxlbSBJRDogNjYNCg==
.
quit
+OK Logging out.
Connection closed by foreign host.
```

# （おまけ）Thunderbirdによるメールの受信
- ここまでだとサーバーに入らないとメールを確認できないため、クライアントPCにThunderbirdを入れてサーバーの障害を受け取れるようにする

## 1. メールユーザーの作成
```
$ useradd -s /sbin/nologin mail-user
$ passwd mail-user
Changing password for user mail-user.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
```

## 2. Zabbixの設定変更
- 「Administration」->「Users」->「Admin」->「Media」を選択
  - Send to「`mail-user@mail.example.com`」

## 3. ポートの解放
- EC2 コントロールパネルの「ネットワーク&セキュリティ」->「セキュリティグループ」からインバウンドルールを追加
  - タイプ「`POP3`」, ソース「`マイ IP`」

## 4. Thunderbirdの設定
- クライアントPCにThunderbirdをインストール
  - https://www.thunderbird.net/ja/
- Thunderbirdを起動し、詳細設定
- POPメールサーバーを設定
  - サーバー名「`<EC2 パブリック IPv4 アドレス>`」, ユーザ名「`mail-user`」、パスワード「`<mail-userのパスワード>`」
![thunder-test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/618d1462-b52b-e467-73d3-288b123e5b5b.png)

## 5. 障害メールの受信確認
- `systemctl stop zabbix-agent` でzabbix-agentを落とし、障害メールが送信・受信されることを確認する
  - Thunderbirdの通知によって、以下のようなメールが確認できた
  - サーバーに障害が起きた際に通知を得ることができるようになった（自宅でのみ）

![thunder-zabbix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2250956/eb48160d-9775-6b8e-c97c-e087820b4956.png)

## 注意
- 通常のメールサーバーとして使用したい場合、設定を適切に行わないとスパムメールの踏み台などにされてしまうので注意してください
  - セキュリティグループ(ファイアウォール)によるアクセス制御
  - Postfixの設定
      - SMTP AUTH（メール送信時のユーザー認証） 
      - /etc/postfix/main.cf の mynetworks（信頼するネットワークの制限）など

# 最後に
- Postfix, Dovecotによるメールサーバーの構築、Zabbixによるサーバーの監視を行った
- また、それらを組み合わせることで障害の通知が受けられるようになった
- 明日の記事は同期の @SogoK 君の「Kubernetes クラスターを自力で組んでトラブルシューティングしてみる【The Hard Way】【ニフクラ】」です。お楽しみに。