開発者の為のメール送受信サーバー(Postfix)の構築方法 [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 メール送信用サーバー