ホーム > カテゴリ > サーバー構築・運用・Linux >

開発者の為のメール送受信サーバー(Postfix)の構築方法 [CentOS]

CentOSで各種サーバー構築(目次)

今回はSMTPサーバーのPostfixで「メールの送受信」を行います。

メールを受信するにはSMTPポートの開放が必要です。そのまま運用してしまうと、誰でもメールを送信できる「オープンリレー状態」になりますので、Cyrus SASL(サイラス サスル)によるSMTP認証(SMTP-AUTH)で対応します。

それだけだと不安ですので、ブルートフォース攻撃(総当たり攻撃)などの不正アクセスからサーバーを守る「Fail2ban」も導入します。

この記事の主な目的は独自ドメインのメールを受信する為です。SSL設定やPOP/IMAPサーバーのdovecot(ダブコット)は導入しません。

Telnet(平文による遠隔操作)によるメール送信テストや、SMTP認証のテストは行いますが、基本的なメール操作は次回の記事で導入する「Webメール」で行う事とします。 ※Webメールはサーバー内のローカルで実行。

前提条件

開発者の為のメール送信サーバー(Postfix)の構築方法

事前準備

最初にTelnetを利用できるようにします。

「Windowsの設定」(コントロールパネル)を開き[設定の検索]で「Windowsの機能の有効化または無効化」を入力する。そして「Telnet Client」のチェックボタンをオンにする。

OKボタンを押せばTelnetが有効化されます。

25番ポートブロック(Outbound Port25 Blocking)

ご利用のプロバイダーによってはスパム対策(メール送信の規制)でSMTPの25番ポートがプロバイダーによってブロックされている場合があります。

その場合はSMTPサーバーに接続できません。今回は代わりに587番ポートのサブミッションポートを利用します。ただ、両方とも塞がれている場合は接続できませんのでご了承ください。

今回のようにメールサーバーの外部から接続する場合はSMTP(25番)はメール受信でSMTP-Submission(587番)がメール送信のイメージです。

1. Cyrus SASLのインストール

sudo yum -y install cyrus-sasl

// サービスの開始
sudo systemctl start saslauthd
// サービスの自動起動設定
sudo systemctl enable saslauthd
// サービスの状態
sudo systemctl status saslauthd

2. メールユーザーの追加

// Linuxにログインできないユーザー(info)を作成する 
// ※SSHによるリモート接続が禁止されるユーザーの作成
sudo useradd  -s /sbin/nologin info
// パスワード設定
sudo passwd info

// ユーザー一覧
cat /etc/passwd

3. main.cf/master.cfの編集

sudo vi /etc/postfix/main.cf

[main.cf]

# (メールシステム)外部からのメール受信を許可する
inet_interfaces = all

# (メールシステム)受信するドメインリスト(@以降)
# ※末尾に自ドメイン($mydomain)を追加しています。
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# 信頼されたIPリスト
# ※複数の場合は「,」(カンマ)で区切る
# ※127.0.0.0/8は「127.0.0.0~127.255.255.255」
mynetworks = 127.0.0.0/8, パソコン側のグローバルIPアドレス

# (デフォルト設定)リレーを許可するアドレスを指定する
relay_domains = $mydestination

# 存在しないユーザー宛のメールをunknown_user@localhostへ送る
# ※local_recipient_mapsの「=」の右は空です。
local_recipient_maps =
luser_relay = unknown_user@localhost

# メール格納形式
# ※デフォルトは「Mailbox」で/var/spool/mail/にユーザー毎の1ファイルにメールが保存される
# ※次の「Maildir/」にすると/home/user/Maildirにユーザー毎に1件づつメールが保存される
home_mailbox = Maildir/


# 以下、ファイルの末尾に追記する

# [メールサイズ関連]

# 受信メールの1通の最大サイズ(1MB x 1024 x 1024 = 1,048,576)
message_size_limit = 1048576
# メールボックスの最大容量(10MB x 1024 x 1024 = 10,485,760)
mailbox_size_limit = 10485760

# [SMTP認証設定]
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

sudo vi /etc/postfix/master.cf

[master.cf]

# 以下の行のコメントを解除
submission inet n       -       n       -       -       smtpd
-o smtpd_sasl_auth_enable=yes

4. 存在しないユーザー宛のメールを破棄する

sudo vi /etc/aliases

[aliases]

// infoをコメントにする
// ※infoユーザーは特殊ユーザーなのでこの処理が必要です。
#info:  postmaster

// ファイル末尾に次の1行を追記する ※メールを破棄する設定
unknown_user: /dev/null

// /etc/aliasesの変更を反映する
sudo newaliases

5. Postfixの再起動

// 設定ファイルのエラー確認
sudo postfix check
// Postfixの再起動
sudo systemctl restart postfix
// Postfixのステータス確認
sudo systemctl status postfix

6. ポートの開放

// SMTPを開放
sudo firewall-cmd --permanent --zone=public --add-service=smtp
// SMTPを閉じる
//sudo firewall-cmd --permanent --zone=public --remove-service=smtp

// SMTP(Submission)を開放
sudo firewall-cmd --permanent --zone=public --add-service=smtp-submission
// SMTP(Submission)を閉じる
//sudo firewall-cmd --permanent --zone=public --remove-service=smtp-submission

// firewallのリロード
sudo firewall-cmd --reload

// 状態を確認
sudo firewall-cmd --list-all

// 登録可能なサービス一覧
sudo firewall-cmd --get-services

// ポートの確認
sudo netstat -ltunp4

外部サイトでもポートの確認が行えます。TelnetでSMTPサーバーに接続できない場合で、こちらの方は接続できるときは、プロバイダーがSMTPポートをブロックしている事となります。

7. Telnetによるメール送信

SMTP認証なし

Windows側のコマンドプロンプトで行います。

main.cfのmynetworks=に記載した「信頼されたIPリスト」にあるIPアドレスからの接続はメールを送信できます。

上記以外でメールを送信できる場合はメールサーバーが「オープンリレー状態」です。誰でもメールを送信可能な状態ですので、即座にSMTP(25)及びSMTP-Submission(587)のポートを閉じてください。

telnet mail.example.com 587

HELO mail.example.com

MAIL FROM: info@example.com

RCPT TO: example@gmail.com

DATA
From:info@example.com
To: example@gmail.com
Subject: SMTP connection test
Hello world!
.
// ↑最後に「.」(ピリオド)で送信されます。

quit

次のようなエラーが発生すればIPアドレスによる接続制限が掛かってます。

RCPT TO: example@gmail.com
454 4.7.1 <example@gmail.com>: Relay access denied 

外部サイトでもオープンリレーの状態を確認できます。

SMTP認証あり

AUTH PLAINには「¥0ユーザ名¥0パスワード」をBASE64でエンコードした文字列を設定します。 ※¥は表記上、全角にしています。実際は半角。

次はJavaScriptでBASE64に変換します。※サーバーには送信されません。

ユーザー名
パスワード



EHLO mail.example.com

AUTH PLAIN ここに記述する

MAIL FROM: info@example.com

RCPT TO: example@gmail.com

DATA
From:info@example.com
To: example@gmail.com
Subject: SMTP-AUTH connection test
Hello world!!!!!
.
// ↑最後に「.」(ピリオド)で送信されます。

quit

Telnetではユーザー名、パスワードは平文で流れてしまうので、テストしたらパスワードを変更しましょう。 ※BASE64は元の文字列に戻せます。

8. Fail2banの設定

Fail2banは各自でインストール済みとします。

// 基本設定ファイルは編集しない
sudo vi /etc/fail2ban/jail.conf

// postfix.confを作成する
sudo vi /etc/fail2ban/jail.d/postfix.conf

[postfix.conf]

10分以内に5回認証に失敗すると24時間のBANとなります。24時間経過すると自動的にBANが解除されます。

[postfix-sasl]
enabled = true
maxretry = 5
findtime = 600
bantime =  86400

// 設定の反映
sudo systemctl reload fail2ban

// sshdの監視状態(ステータス)
sudo fail2ban-client status sshd
// postfix-saslの監視状態(ステータス)
sudo fail2ban-client status postfix-sasl

参考文献

ConoHaの薄い本(VPSで自分専用のメールサーバーを立てよう!)
メールサーバー構築(Postfix+Dovecot)
Postfixによる、セキュリティに配慮したメールサーバの構築方法
unknown user のバウンスメールの削除
postfix main.cf メール送信用サーバー





関連記事



公開日:2019年11月20日 最終更新日:2019年11月30日
記事NO:02802