倉金家ホームページ

趣味の部屋/インターネットサーバー/サーバー構築メモ/メールサーバー

14-2.postfix

2007年5月4日
メールサーバー(SMTPサーバー)として設定が楽で安定しているpostfixを導入します。


postfixのインストール
postfixは標準でインストールされていますが、機能が足りません。
mysqlが使えるようにpostfix-mysqlをインストールしなくてはなりませんのでpostfixをコンパイルして作成します。
cyrus-saslは標準で使えるようになっているようです。

vine-seedからpostfixの.src.rpmをrpm/SRPMSにダウンロード
$cd ~/rpm/SRPMS
$rpm -Uvh postfix-2.2.10-0vl7.src.rpm
src.rpmが展開されます。

$cd ~/rpm/SPECS
postfix.specを確認、一行目変更
%define build_mysql %{?_with_mysql:1}%{!?_with_mysql:1}
  とし、いちいち-with mysql指定しなくてもbuild_mysqlされるようにしてしまいます。

いったん $rpmbuild -ba postfix.spec をやってみます。
必要なdevel関係のファイルで足りないものが表示されますのでそれらをインストールします。db4-devel, pam-devel, gdbm-devel, openssl-devel, cyrus-sasl-devel, postgresql-devel, openldap-devel, pcre-devel

いろいろ表示が出てコンパイルが始まります。10分ほどかかりました。
rpm/RPMS/i386にrpmファイルができたら完了。
できたパッケージから
postfix, postfix-mysql, postfix-pcre をインストールします。
#rpm -Uvh postfix-2.2.10-0vl7.i386.rpm
#rpm -Uvh postfix-mysql-2.2.10-0vl7.i386.rpm
#rpm -Uvh postfix-pcre-2.2.10-0vl7.i386.rpm
これらのパッケージはsynapticでアップグレードの対象にしないよう「バージョンの固定」をしておきます。

メールユーザーの作成
サーバープログラムがメールを読み書きするためのユーザとグループを作成して登録します。
ユーザ名vmail、 グループ名も同じくvmail、IDを共に111としました。

設定ファイル main.cf の編集
設定ファイルは /etc/postfix/main.cf
http://www.postfix-jp.info/
http://www.kobitosan.net/postfix/jhtml/index.html
http://www.kobitosan.net/postfix/trans-2.2/jhtml/postconf.5.html
などを参考にしながら設定しますが、充分理解できていないところが多々あります。

以下の項目を(Vine4の)ディフォルトから変更

#以下2点は運用するメインのドメイン情報に合わせて。
myhostname = mail.iroribata.net
mydomain = iroribata.net

#myoriginはサーバー名に制限(メーリングリストサーバーとのからみで)
myorigin = $myhostname

#ドメイン情報のないアドレスに勝手にドメイン情報を付加しないよう設定
append_dot_mydomain = no

#すべてのインターフェース上のメールを受信する
inet_interfaces = all

#ホスト名なしメールアドレスで送受信可能な一般的設定
mydestination = $myhostname, localhost.$mydomain

#mynetworksは自分自身のマシンとLANを指定
mynetworks = 127.0.0.0/8, 192.168.0.0/16

#拡張アドレスの使用を設定。mailmanを使う場合必要となる。
recipient_delimiter = +

#配送メールボックスはメールディレクトリ形式を指定。最後の(/)が重要。
home_mailbox = Maildir/

#spam対策としてメールヘッダー及び本文をチェックする
header_checks = pcre:/etc/postfix/header_checks
body_checks = pcre:/etc/postfix/body_checks

#メールソフトの名前、バージョン等の表示設定。バージョンは表示しない。
smtpd_banner = $myhostname ESMTP $mail_name

#アカウント漏洩防止のためEXPN/VRFYコマンドを拒否
disable_vrfy_command = yes

#メーリングリストサーバー等のアドレス書き換えに必要な設定
allow_percent_hack = yes
#不正中継対策。詳細はよくわからない(勉強不足)。
swap_bangpath = yes

#メーリングリストサーバーなどの構築に必要な拡張
allow_mail_to_commands = alias, forward, include

#セキュリティー及びSPAM対策のための接続の制御
#HELOコマンドでホスト名を通知しない接続は拒否
smtpd_helo_required = yes

#自ネットワークは優先許可、無効なホストネームは拒否、その他は許可
smtpd_helo_restrictions =
  permit_mynetworks,
  reject_invalid_hostname,
  permit

#RFC822の書式に適合しないメールアドレスが通知された場合受信拒否
strict_rfc821_envelopes = yes

#送信元ホストの接続許可制限
#自ネットワークOK、access制限テーブル参照、スパム発信ホストデータベース参照、DNSにないIPアドレスの接続拒否など
smtpd_client_restrictions =
  permit_mynetworks,
  check_client_access hash:/etc/postfix/access,
  reject_rbl_client all.rbl.jp,
  reject_rbl_client opm.blitzed.org,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client sbl-xbl.spamhaus.org,
  reject_unauth_pipelining,
  reject_unknown_client,
  permit

#メール転送の制限
#自ネットワークOK、認証されたユーザOK、FQDNルールでのチェックなど
smtpd_recipient_restrictions =
  permit_mynetworks,
  check_recipient_access hash:/etc/postfix/access,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unauth_pipelining,
  reject_unauth_destination,
  permit

#メール送信者(アドレス)のチェック
#送信元ドメインのFQDNチェック、実在しないドメインでの拒否など
smtpd_sender_restrictions =
  check_sender_access hash:/etc/postfix/access,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  permit
# メール配送の設定

#ローカル配送デーモンの指定
local_transport = local

#ローカル配送マップの指定
local_recipient_maps = $alias_maps

#バーチャルドメイン配送デーモンの指定
virtual_transport = virtual

#バーチャルドメインの定義mapの指定
virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf

#バーチャルドメイン配送マップの指定
virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf

#メールボックスのベースディレクトリ
virtual_mailbox_base = /var/spool/mail/

#メールの振分先(メールボックス)マップの指定
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf

#メール配送の最小UIDと配送UID,GID。vmailのUID,GIDを指定。
virtual_minimum_uid = 111
virtual_uid_maps = static:111
virtual_gid_maps = static:111

MySQL連携ファイルの作成
/etc/postfix/mysql/mysql_virtual_alias_maps.cf
受け取ったメールアドレスと転送するアドレスまたはそれを受け取るユーザとの関係を定義しているデータベースへのアクセスを定義しています。内容は
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active=1

/etc/postfix/mysql/mysql_virtual_domains_maps.cf
自分の取り扱うドメインを定義しているデータベースへのアクセスを設定します。内容は、
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND active=1

/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf
ユーザのメールを保存するメールボックス(メールディレクトリ)の関係を定義しているデータベースへのアクセスを定義しています。内容は
user = postfix
password = password
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active=1

スパム対策
スパムメールは非常に迷惑です。
大半は先に設定したreject_unknown_clientとreject_rbl_clientで除去できますが、時々それをすりぬけてくるスパムメールへのさらなる対策を実施します。
/etc/postfix/access
スパムメールが時々スパム発信ホストのデータベースをかいくぐって来ることがあります。その発信ホスト名などを都度登録してきたデータベースが古いサーバーにありますので、それをコピーしてもってきました。

内容は以下のようなもの

.spamsender.cn  REJECT
.spamsender.jp  HOLD
....

スパムメールのヘッダーを見てこちらのサーバーに送ってきたサーバーのホスト名あるいはドメイン名を設定します。送信者のメールアドレス(概ね詐称)のドメインではありません。

いちおうドメインの割り振られた国名を調べてメールが来る可能性のない国のはREJECT、そうでなければHOLDにしておきます。
/etc/postfix/header_checks
これも同様に古いサーバーからもってきました。

内容は以下のようなもの

#言語コードのチェック。スパムの多くはus-asciiかiso-8859-1
/charset="?us-ascii"?/  HOLD
/charset="?iso-8859-1"?/  HOLD

#実行ファイルが添付されたメール
/name=.*\.exe/  HOLD
/name=.*\.bat/  HOLD
/name=.*\.pif/  HOLD
/name=.*\.scr/  HOLD
/name=.*\.dll/  HOLD
/name=.*\.reg/  HOLD
/name=.*\.vbs/  HOLD
/name=.*\.shs/  HOLD

その他到着したスパムメールのヘッダーを見て特徴的なパターンを抽出、設定します。
必ずしもスパムメールではない可能性が考えられるものはREJECTではなしにHOLDにしておきます。
/etc/postfix/body_checks
body_checksは使っていません。
body_checksを設定するためには受け取ってさらに本文を読まなくてはならないからです。
当初は受け取ってしまったものについてはやっていましたが内容もどんどん変わり労多くして益なしといった感じでやめました。

その他の設定ファイル
/etc/postfix/aliases
rootに実際にメールを受け取るrootのメールアドレスを設定。
(私は別のWindowsマシンでメールをしているので。)
root: kiyoshi@kuragane.jp

#newaliasesでデータベース化

メールディレクトリの作成
ディレクトリ/var/spool/mail/ にユーザーのメールボックス(正しくはメールディレクトリ)を作りますが、ドメイン毎に分けておいた方がわかりやすいので、ドメイン名/ユーザー名の形にします。実はこれはメール関係のデータベース管理に使用するPostfixAdminの仕様そのままです。

具体的には kiyoshi@kuragane.jp のメールディレクトリは、
/var/spool/mail/kuragane.jp/kiyoshi/となります。
もっともこの/var/spool/mailの中身は前のサーバーからバックアップコピーしましたので、実際にはいちいち作成はしませんでした。

/var/spool/mail以下、所有者とグループはvmailとし、アクセス件はvmailにのみ書込と読出権限を与えておきます。