Postfix
Postfix は最近人気のMTA です。設定はシンプルで堅牢な作りです。
更新日 2017-01-23
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) はメールの受信サーバーが本来の用途なので、
自ドメイン以外の宛先メールは受け入れず、転送も拒否します。