Postfix とは

MTA といえばSendMail ですが設定運用は複雑怪奇と評されます。qmail は実に素晴らしいのですが、開発は早々に終了しており パッチづくしで無理がたたってます。Posfix は後継MTA として近年人気が高まっています。Postfix はSMTP サーバー単体で、 POP3 やIMAP サーバーにはdovecot を使います。

Postfix のインストール

CentOS6.4 x86_64 にインストールします。複数のドメインを扱いたいので最初からVirtual Mailbox なる仕様で設定を行います。 SMTP-AUTH も行います。

ソースからインストール

CentOS7 にPostfix3.1 をソースインストールします。
yum remove postfix

yum groupinstall "Development Tools" -y
yum groupinstall "Compatibility libraries" -y
yum install openssl-devel zlib-devel -y
yum install pam-devel cyrus-sasl* -y

yum install libicu-devel

//BerkeleyDB のインストール(要ORACLログイン)
cd /usr/local/src
tar zxvf db-6.2.23.NC.tar.gz
cd db-6.2.23.NC/build_unix
../dist/configure --prefix=/usr/local/db-6.2.23
make
make install

ln -s /usr/local/db-6.2.23/include/* /usr/include/
ln -s /usr/local/db-6.2.23/lib/* /usr/lib/

ldconfig

// Building postfix with Dovecot SASL
cd /usr/local/src
wget "ftp://ftp.riken.jp/net/postfix/postfix-release/\
official/postfix-3.1.4.tar.gz"
tar zxvf postfix-3.1.4.tar.gz
cd postfix-3.1.4

make makefiles \
 SHLIB_RPATH=/usr/lib64 \
 CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"'

make

// Accept all default settings.
make install

virtualmail用の管理ユーザーの作成

virtualmail の保存先となる親フォルダになります。
groupadd -g 5000 vmail
useradd -g 5000 -u 5000 -s /sbin/nologin vmail
chmod 700 /home/vmail

メールアカウントと保存先

メールアカウントと保存先ディレクトリを組み合わせを /etc/postfix/vmaildir というファイルで管理します。 保存先ディレクトリは、先ほど作成したユーザーvmail のホームディレクトリ(/home/vmail)からの相対パスになります。
vi /etc/postfix/vmaildir

 test@qt-space.com qt-space.com/test/Maildir/
 test2@qt-space.com qt-space.com/test2/Maildir/
 test2@berible.com berible.com/test/Maildir/

// データベースファイル(vmaildir.db) への変換(更新後は要変換)
postmap /etc/postfix/vmaildir
メールアドレスのドメイン部/ユーザー名というディレクトリ構造です。メールを受け取った時にディレクトリが存在しない場合、 自動的に作成されます。IMAP で読みに行っても作成されないので注意です。Maildir の後ろの / を忘れない事。

エイリアスの設定

今回設定は不要ですが、データベース形式への変換だけ必要です。
postmap /etc/postfix/virtual

Maildir の雛形を定義

Maildir の雛形を作っておくと、ユーザー追加時に自動でコピーを作成してくれます。
// skel(ton) = 雛形
mkdir -p /etc/skel/Maildir/{new,cur,tmp}
chmod -R 700 /etc/skel/Maildir/

postfix の設定ファイルを編集

main.cf で設定します。
vi /etc/postfix/main.cf

 // smtp接続を受けるインターフェイス
 inet_interfaces = all

 // server name
 myhostname = PPServer7.loog

 // default domain
 mydomain = qt-space.com

 // VirtualMailBox で管理したいので空白に。
 // ここを設定するとUNIX ユーザーDir に保存されてしまう。
 mydestination = 

 // nis:mail.aliases を無効にする為に再設定
 alias_maps = hash:/etc/aliases

 // Maildir 形式
 home_mailbox = Maildir/ 

 // 受信サイズ制限
 message_size_limit = 10485760

 // virtual mailbox (本命)
 # Virtual Mailbox
 virtual_mailbox_domains = qt-space.com, example.com
 virtual_mailbox_base = /home/vmail
 virtual_mailbox_maps = hash:/etc/postfix/vmaildir
 virtual_minimum_uid = 100
 virtual_uid_maps = static:5000
 virtual_gid_maps = static:5000
 virtual_alias_maps = hash:/etc/postfix/virtual

sytemd に設定

vi /etc/systemd/system/postfix.service

 [Unit]
 Description=Postfix
 After=network.target

 [Service]
 Type=forking
 PIDFile=/var/spool/postfix/pid/master.pid

 ExecStart=/usr/sbin/postfix start
 ExecStop=/usr/sbin/postfix stop
 ExecReload=/usr/sbin/postfix reload

 [Install]
 WantedBy=multi-user.target
この段階でメールの送信・受信ができるはずです。
yum install -y mailx
echo "Test Content" | mail -s "Subject20170116" -r "ast@qt-space.com" "ast1595@hotmail.co.jp"

Dovecot のセットアップ

Dovecot はIMAP4、POP3 に対応するサーバーです。Postfix で受信したメールをDovecot を通じて読む事ができます。

ソースビルド

DOVECOT から最新版のソースをビルドします。意外に時間が掛かります。
cd /usr/local/src
wget http://www.dovecot.org/releases/2.2/dovecot-2.2.27.tar.gz
tar zxvf
cd dovecot-2.2.27

./configure
make
make install
設定を行います。
// デフォルト設定ファイル郡のコピー
cp -r /usr/local/share/doc/dovecot/example-config/* /usr/local/etc/dovecot/

// /etc/dovecot へのリンク(注:yum インストールではココの為。無くてもいい)
ln -s /usr/local/etc/dovecot /etc
ユーザー・グループを作成します。
// Add user dovecot and dovenull
// Check exist user. view /etc/passwd, view /etc/group
groupadd -g 97 dovecot
useradd -g 97 -u 97 -c "Dovecot IMAP server" -d /usr/libexec/dovecot -s /sbin/nologin dovecot

groupadd -g 499 dovenull
useradd -g 499 -u 499 -c "Dovecot's unauthorized user" -d /usr/libexec/dovecot -s /sbin/nologin dovenull

SSL の設定

/etc/dovecot/conf.d/10-ssl.conf を編集する。
vi /etc/dovecot/conf.d/10-ssl.conf

 // 使用しない
 ssl = no
 #ssl_cert = </etc/ssl/certs/dovecot.pem
 #ssl_key = </etc/ssl/private/dovecot.pem

メールアカウントとパスワードの作成

メールアカウントとパスワードの組み合わせを /etc/dovecot/passwd というファイルで管理します。 パスワードはMD-5 で予め暗号化します。
// 平文パスをCRAM-MD5 で暗号化するツール
doveadm pw -p PASSWORD
// 設定ファイル vi /etc/dovecot/passwd test@qt-space.com:{CRAM-MD5}abcdefg0123456abcdefg0123456

設定ファイルを編集する

プロトコルとListen アドレスを設定する
vi /etc/dovecot/dovecot.conf

 // プロトコル
 protocols = imap pop3 lmtp

 // Listen アドレス
 listen = *, ::

 // 接続挨拶メッセージからdovecot の文字列を隠蔽
 login_greeting = ready.

 // 信頼できる接続元IP
 login_trusted_networks = 127.0.0.1/8 192.168.0.0/16
メール保存先の設定します。
vi /etc/dovecot/conf.d/10-mail.conf

 mail_location = /home/vmail/%d/%n/Maildir
認証方法を設定します。
vi /etc/dovecot/conf.d/10-auth.conf

 // プレーンテキスト認証は基本的に無効化(注)
 // dovecot.conf login_trusted_networks にマッチするとno になる
 disable_plaintext_auth = yes

 // プレーンテキストまたはCRAM-MD5 で認証
 auth_mechanisms = plain login cram-md5
 !include auth-passwdfile.conf.ext
 !include auth-static.conf.ext
login_trusted_networks からの接続にはプレーンテキスト認証ができる。JavaMail からは CRAM-MD5 が使えない為、このようなトリックを使用する。
認証に使うパスワードファイルの場所を設定します。
vi /etc/dovecot/conf.d/auth-passwdfile.conf.ext

 passdb {
   driver = passwd-file
   args = scheme=CRAM-MD5 username_format=%u /usr/local/etc/dovecot/passwd
 }

 userdb {
   driver = passwd-file
   args = scheme=CRAM-MD5 username_format=%u /usr/local/etc/dovecot/passwd
 }
vi /etc/dovecot/conf.d/auth-static.conf.ext

 userdb {
   driver = static
   args = uid=5000 gid=5000 home=/home/vmail/%d/%n
 }

sytemd に設定

vi /etc/systemd/system/dovecot.service

 [Unit]
 Description=dovecot
 After=network.target

 [Service]
 Type=forking
 PIDFile=/usr/local/var/run/dovecot/master.pid

 ExecStart=/usr/local/sbin/dovecot
 ExecStop=/usr/local/sbin/dovecot stop
 ExecReload=/usr/local/sbin/dovecot reload

 [Install]
 WantedBy=multi-user.target

SMTP-AUTH を使う(Dovecot の認証を利用)

現時点では認証無しでメール送信できてしまいます。セキュリティ上好ましく無いので、SMTP認証を実施します。 Dovecot のCRAM-MD5 認証メカニズムをそのまま流用できます。

postfix の設定を編集

main.cf に設定を追記します。smtpd_で始まる項目は、smtpデーモンつまりSMTP Listenの設定です。
vi /etc/postfix/main.cf

 // 以下を追加
 # SMTP-AUTH
 smtpd_sasl_auth_enable = yes
 smtpd_sasl_authenticated_header = yes
 smtpd_sasl_path = private/auth
 smtpd_sasl_security_options = noanonymous, noplaintext
 smtpd_sasl_local_domain = $myhostname
 smtpd_sasl_type = dovecot
 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
 broken_sasl_auth_clients = yes
smtpd_recipient_restrictions がポイントです。permit_mynetworks はmynetworks に該当するクライアントからの 接続は許可、permit_sasl_authenticated は認証成功なら許可、reject_unauth_destination は認証失敗 なら不許可です。そしてどれにもマッチしない場合は許可です。左から順にマッチした段階で処理されます。 (最後にreject してはいけません。自ドメイン宛も弾いてしまいます)

サブミッションポート587 の設定を行う

master.cf に設定を追記します。ここでは認証を通った時のみ通します。
vi /etc/postfix/master.cf

 // 以下をコメントアウトを外す
submission inet n - n -   -   smtpd
 -o smtpd_sasl_auth_enable = yes
 -o smtpd_client_restrictions = permit_sasl_authenticated,reject

dovecot の設定を編集

設定ファイルのsmtp-auth の欄を修正する
vi /etc/dovecot/conf.d/10-master.conf

 // 以下をコメントアウトから外す。user group を追加
 #Postfix smtp-auth
 unix_listener /var/spool/postfix/private/auth {
    mode = 0666

  // 以下も追加
    user = postfix
    group = postfix
 }
dovecot をrestart します。
postfix 及びdovecot をrestart します。

SMTP-AUTH を使う(SASL2 の認証を利用)

Dovecot の認証は便利ですが、パスワードが同じになります。別の認証SASL2 を用いれば、パスワードを任意に設定します。

postfix の設定を編集

main.cf に設定を追記します。
vi /etc/postfix/main.cf

 // 以下を追加
 # SMTP-AUTH
 smtpd_sasl_auth_enable = yes
 smtpd_sasl_authenticated_header = yes
 smtpd_sasl_path = private/auth
 smtpd_sasl_security_options = noanonymous, noplaintext
 smtpd_sasl_local_domain = $myhostname
 // 不要
 #smtpd_sasl_type = dovecot
 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
 broken_sasl_auth_clients = yes
smtpd_sasl_security_options に noplaintextを含めると、Dovecot で許可されていても

設定

master.cf に設定を追記します。
vi /etc/sasl2/smtpd.conf

pwcheck_method: auxprop
mech_list: CRAM-MD5
ユーザーを追加します。
saslpasswd2 -c -u qt-space.com ast
ユーザーを確認する
sasldblistusers2
リブートして送信確認をします。
service postfix restart service saslauthd restart

運用ツール

メールアカウントの追加(兼パスワード変更)・削除・一覧を扱えるツールをJava で作ってみました。

PostfixUserManager

設定ファイル(/etc/postfix/vmaildir, /etc/dovecot/passwd) を編集し、postmap でデータベース化する だけですが、これを自動化しました。起動スクリプト実行ファイル(PostfixUserManager.class)PostfixUserManager.java
yum install -y mailx

// 実行ファイルは/root/mypackage に置く
mkdir /root/mypackage
cd /root/mypackage
wget http://ast.qt-space.com/linux/PostfixUserManager.class

// 起動スクリプトを置く
cd
wget http://ast.qt-space.com/linux/PostfixUserManager.sh

// 一覧表示(起動スクリプトを実行)
./PostfixUserManager.sh -l

// 追加
./PostfixUserManager.sh -a mail_address password
// 削除 ./PostfixUserManager.sh -d mail_address
メールアカウント作成後にmailx にてメールを一通送ってます。最初に受信するまでディレクトリが 作られず、アカウントが正しく作成完了とならない為です。

セカンダリサーバーの設定

冗長性を高める為にセカンダリメールサーバーを構築します。セカンダリで受信したメールはディレクトリには 保存されず、メインサーバーに転送されます。また障害発生時にはすみやかにメインに昇格できます。

設定ファイルの編集

main.cf を編集します。
vi /etc/postfix/main.cf

 // 末尾に追加
 transport_maps = hash:/etc/postfix/transport
続けてtransport ファイルを編集
vi /etc/postfix/transport

 // 末尾に追加
 qt-space.com smtp:PPServer7.loog
 example.com smtp:PPServer7.loog

// データベース化も忘れずに
postmap hash:transport

// リロード
postfix reload

Fail2Ban による不正アクセス禁止

不正な第三者によるSMTP-AUTH(SASL) ログインが成功するとスパムメールの送信し放題です。maillog にはこの手の
ログイン失敗履歴が多く残っています。Fail2Ban はmaillogを見て、何度もトライしてくるIP アドレスをその都度
アク禁にします。

インストール

最新版をソースからビルドします。
cd /usr/local/src
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban

python setup.py install
インストールが成功していれば下記コマンドが通ります。
fail2ban-client -h
起動スクリプトもあります。
cp files/fail2ban.service /etc/systemd/system
systemctl daemon-reload
systemctl start fail2ban/

メールのおさらい

以下の順で判断され、一致するなり処理に回されます。
1.自ドメイン宛のメールは全て受け入れる
2.ローカルネットワークからメール送信は全て行う
3.外部ネットワークからのメール送信は、SMTP-AUTH 認証が成功したら行う
5.外部からの認証はCRAM-MD5 のみ

メール作成と送信の流れ

メールを作り送信するのはクライアントソフトの仕事です。クライアントソフトは送信専用のSMTP サーバーともいえます。そしてSMTP サーバー間はポート25 にて送受信を行います。

オープンリレー

SMTP サーバー間では全てのメールが自由に送受信されます。ただしインターネット末端に接続されるSMTP サーバー(Postfix) はメールの受信サーバーが本来の用途なので、 自ドメイン以外の宛先メールは受け入れず、転送も拒否します。