postfix †
説明 †
入手 †
公式サイト: The Postfix Home Page
Download ページからミラーサイトを選択。
必要環境 †
インストール †
$ wget http://vda.sourceforge.net/VDA/postfix-2.5.1-vda-ng.patch.gz
$ gunzip postfix-2.5.1-vda-ng.patch.gz
$ cd postfix-2.5.1
$ patch -p1 < ../../src/postfix-2.5.1-vda-ng.patch
#!/bin/sh
export CFLAGS="-O2 -march=pentium3"
make tidy
make -f Makefile.init makefiles \
'AUXLIBS=-lpcre -lssl -lcrypto -L/usr/local/mysql/lib -lmysqlclient -lz -lm' \
'CCARGS=-DHAS_MYSQL -DUSE_TLS -DUSE_SASL_AUTH \
-I/usr/local/mysql/include -I/usr/local/include'
make
設定ファイル †
virtual domain / smtp-auth(SSL)対応 postfix + dovecot + squriermail + mysql †
仕様 †
- メインのドメインはバーチャルドメイン扱いになる tukizakura.org
$myorigin にメインドメインを割り当てる。
- postfix はダミーのローカルドメイン(dummydomain.tukizakura.org)を使用する
- UNIXユーザアカウントへは直接配送しない
- UNIXユーザのホームディレクトリにメールスプール領域(Maildir)を作成しない
- root へのローカル配送等もメインドメインへで受け取る
- dummydomain.tukizakura.org へ直接指定で送信されると
ユーザ@dummydomain.tukizakura.org で受け取ってしまうのは仕様。
回避は出来ないので、存在する Unix アカウントと対になるローカルエリアスを作成する。
- 外部コマンド実行を必要とする ML 等への対応策〜
- aliase でローカルドメイン に転送し、FML で処理後、各ユーザへ配信。
ml@tukizakura.org→ml@localdomain.tukizakura.org→FML→ユーザ
- ユーザ情報は全て mysql 上に作成する
- パスワード
- MD5-CRYPT で作成(postfix-admin)
- 認証方式は plain パスワード。互いの認証方式の依存関係の違いで plain 以外失敗する
- 認証機構は Dovecot 付属 Auth デーモンに任せる
- メールボックスと個別設定保存用ディレクトリは、ログインホームディレクトリとは別にメール専用を用意する
- ホームディレクトリは、ログイン用(ssh,ftp)とメール用の2種類存在させる
- アドレスの管理には postfix-admin を使用する。
→ユーザ自身にパスワードを管理してもらう為
- virtual メールボックス領域は /home/data/MAILBOX/-DOMAIN-/-USER-/ 以下に作成する
- 他のサービスでも同一の DB を参照できるようにする
→ DB の一元管理の為に FTP 等の他のサービスでも同一の DB を使用。
- 扱うテーブルの内容
postfix-admin 標準 | |
admin | 管理者情報 |
alias | 転送を含むエイリアス |
config | 不明 |
domain | ドメイン情報 |
domain_admins | ドメイン管理者情報 |
fetchmail | 不明 |
log | ログ |
mailbox | ユーザ情報(アドレス、メールボックス等) |
vacation | バケーション |
vacation_notification | バケーション通知 |
+----------+--------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------------------+-------+
| uid | int(8) | NO | PRI | 10000 | |
| gid | int(8) | NO | | 60000 | |
| name | varchar(64) | NO | | | |
| passwd | varchar(256) | NO | | | |
| home | varchar(128) | NO | | | |
| shell | varchar(64) | NO | | /bin/bash | |
| email | varchar(128) | NO | PRI | | |
| created | datetime | NO | | 0000-00-00 00:00:00 | |
| modified | datetime | NO | | 0000-00-00 00:00:00 | |
| active | tinyint(1) | NO | | 0 | |
+----------+--------------+------+-----+---------------------+-------+
現行システムからの移行 †
現行システム | |
MTA | postfix |
IMAP | courier-imap(IMAP, IMAPS) |
POP | courier-imap(pop3s), solid-pop3d(apop) |
Webmail | squirrelMail |
FTP | proftpd |
DB | /etc/passwd |
新規システム | |
MTA | postfix-tls + quota(Postfix VDA) + smtp-auth |
IMAP | dovecot(imap, imaps) |
POP | dovecot(pop3s) |
Webmail | squirrelMail + Virtualdomain |
FTP | proftpd-tls |
DB | mysql + postfixadmin |
- 事前準備
- postfix
- インストールパス postfix-2.5.1_sql
- quota(Postfix VDA) パッチを宛てた後、tls + smtp-auth + mysql を有効にしてコンパイル
- /usr/local/postfix からのシンボリックリンク作成
- 古い main.cf, master.cf をバックアップしておく。(main.cf_日付)
- 新しい main.cf, master.cf を編集しておく。
- mysql 設定関連ファイルを /path/to/etc/mysql/ 配下に用意しておく。
virtual_alias_maps, virtual_domains_maps, virtual_mailbox_maps, mysql_virtual_mailbox_limit_maps
- 設定ファイルの権限変更
- 新しい起動スクリプトの準備と古い起動スクリプトのバックアップ。
- バーチャルメールボックスユーザ・グループの作成 (vmail)
- バーチャルメールボックス領域の作成 (/home/data/VMAILBOX/)
- バーチャルメールボックスの権限変更
- 存在する Unix アカウントと対になるローカルエリアス(転送先)を作成する。
dummydomain.tukizakura.org へ直接指定送信への対応
- postfixadmin
dummydomain 用 MX レコードを DNS に設定。(postfixadminが確認しに行く)
月桜メンバー専用ページ以下にインストール。
web アクセス出来るよう apache の設定変更する。
basic 認証を用いて、アクセス制限をする。
/etc/passwd, /postfix/aliases, /postfix/virtual からメール送受信に必要なデータを抜き出し、
postfixadmin DB に登録しておく。
ドメイン、Emailアドレス、転送設定、mailbox
fml 用 aliace 設定
ml@exemple.com -> ml@dummydomain.example.com -> fml -> ユーザへ転送
- 新システム稼動前からユーザ公開開始。
- ユーザアナウンス:新システム稼動前にパスワード・転送設定をしてもらう。
現行システムと競合しないので問題無し。
- dovecot
- インストールパス dovecot-1.1.1
- /usr/local/etc/dovecot からも設定ファイルにアクセスできるようにシンボリックリンク作成
- 起動スクリプトの準備
- /usr/local/dovecot で参照できるようにシンボリックリンク作成
- mysql
proftpd 等で使う UserTable? を作成。
postfixadmin が作成した UserDB に独自テーブルを追加。
/etc/passwd から認証に必要データをコンバートする。
Mail GW から mysql 自体へアクセス出来るようにしておく。
Mail GW から UserDB へアクセス可能 (grant文)にしておく。
作成したDBからデータへのアクセステスト
- proftpd
- インストールパス proftpd-1.3.3_mysql
- mysql と tls を有効にしてコンパイル
- ssl 接続のみ許可
- /usr/local/proftpd からのシンボリックリンク作成
- 古い proftpd.conf をバックアップしておく。(main.cf_日付)
- 新しい proftpd.conf を編集しておく。
- 新しい起動スクリプトの準備と古い起動スクリプトのバックアップ。
- 最新バージョンにアップデート
付属 UPDATE ドキュメントを見てアップデートの形で新しい物をインストール
現行のは切替時まで稼働させておく。
※)メニュー日本語表示には apache 再起動が必要
- Virtual Host Domain Name Managementプラグインを plugin ディレクトリへインストール
$ cd /path/to/squirrelmail/plugin
$ http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fvirtual_hosts-1.0.tar.gz
$ tar xvzf virtual_hosts-1.0.tar.gz
conf.pl を実行
$ config/conf.pl
1.プラグインをインストール
2.imap server を dovecot に変更
3.folder 設定を dovecot に合わせる
- 管理ドメイン宛てメールがMail GW's postfix のキューに貯まるように、
GW のアドレスベリファイ機能を一時無効にする。
- Mail GW の softbounce モードに切り替え。
- postfix, courier-imap, solid-pop3d, pop-before-smtp, proftpd の停止
- postfix, proftpd シンボリックリンクの切り替え(/usr/local配下&stow)
- postfix, proftpd 起動スクリプトの新旧切り替え
- courier-imap Maildir から dovecot Maildir へコンバート
- /usr/local/virtula/-DOMAIN- 配下の-USER-という名前のディレクトリとしてコピーし、
適切な所有者に変更しておく。
- 公式サイトで配布されているコンバートスクリプトを使用
- 新しいデーモンの起動
- postfix, dovecot, proftpd の起動
- 配送テスト
- ローカル→ローカル(同ドメイン)
- ローカル→ローカル(別ドメイン)
- ローカル→外部
- LAN内→postfix(各ドメイン)
- 受信テスト
- pop3s
- imaps
- FTPファイル送受信テスト
- Mail GW の設定を元に戻し、キュー再配信
- 運用再開後、特に問題が無ければ必要無くなったデータを削除
- user's Maildir
- メール専用ユーザのエントリと homedir
- Mail GW アドレスベリファイを mysql へ直接問い合わせるようにする
- ML (fml)の移行
[postfix-jp:01918] Re: postfix + MySQL のバーチャルな環境でMLを作成したい。
- メンバーページの一新
- postfixadmin 以外の web ユーザ管理インタフェースの調査(移行or改造or作成)
mysql + postfix-admin †
local_transport = local
mydestination = $myhostname, localhost, $mydomain
mydomain = dummydomain.example.com
myorigin = example.com
mydestination = (空にする)
local_transport = virtual
virtual_transport = virtual
virtual_mailbox_base = /home/data/VMAILBOX
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains
virtual_mailbox_maps = mysql:/etc/postfxi/mysql/virtual_mailbox_maps
virtual_mailbox_limit = 0
virtual_minimum_uid = 10000
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
# 以下 Postfix VDA パッチが必要
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/virtual_mailbox_limit_maps
virtual_mailbox_limit_inbox = yes
virtual_mailbox_limit_override = yes
virtual_overquota_bounce = yes
virtual_alias_maps
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active='1'
virtual_domains_maps
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s'
virtual_mailbox_maps
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' and active='1'
mysql_virtual_mailbox_limit_maps
user = postfix (データベースのユーザ名)
password = postfix (データベースのパスワード)
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username='%s'
4つのファイルを作ったらmysql_virtual_XX.cfを人様に見られないようにchmod & chgrpしておく。
# chmod 640 mysql_*
# chgrp postfix mysql_*
smtp-auth + ssl †
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_exceptions_networks =
smtpd_sasl_local_domain =
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous,noplaintext
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
smtpd_sasl_type = dovecot
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_CAfile = /usr/local/etc/cacert.crt
smtpd_tls_cert_file = /usr/local/etc/postman.pem
smtpd_tls_key_file = /usr/local/etc/newkey.pem
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = sdbm:/etc/postfix/smtpd_scache
smtpd_tls_session_cache_timeout = 21600s
smtpd_tls_wrappermode = no
amavisd-new + clam anti-virus †
Postfix de ウィルス対策
Postfixの環境にClam AntiVirusを導入する
完全版: FreeBSDにSpamAssassinとClamAVを入れる
- mx.tukizakura.org (Mail ゲートウェイ) で作業
- Clam AntiVirus?のインストール
Port: clamav-0.88.4
Path: /usr/ports/security/clamav
Info: Command line virus scanner written entirely in C
Maint: garga@FreeBSD.org
B-deps: libgmp-4.2.1_1 libtool-1.5.22_2
R-deps: arc-5.21o_1 arj-3.10.22 lha-1.14i_6 libgmp-4.2.1_1 unrar-3.60,4 unzip-5.52_2 unzoo-4.4
WWW: http://www.clamav.net/
# portinstall -vCc security/clamav
milter オプションを使用 → MTA と ClamAV を橋渡しする
- 設定ファイル
# ls -l clamd.conf* freshclam.conf*
-r--r--r-- 1 root wheel 8185 10 15 18:15 clamd.conf
-r--r--r-- 1 root wheel 8185 10 15 18:15 clamd.conf.default
-r--r--r-- 1 root wheel 3258 10 15 18:15 freshclam.conf
-r--r--r-- 1 root wheel 3258 10 15 18:15 freshclam.conf.default
- amavis と同じユーザ権限にする
# vi /usr/local/etc/clamd.conf
User vscan
# vi /usr/local/etc/freshclam.conf
DatabaseOwner vscan
# chown -R vscan:vscan /var/run/clamav
# chown -R vscan:vscan /var/log/clamav
# chown -R vscan:vscan /var/db/clamav/
※ portupgrade を行うと /var/db/clamav のパーミッションがデフォルトの
amavis ユーザになってしまう。
- rc.conf
# vi /etc/rc.conf
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"
- 起動
# /usr/local/etc/rc.d/clamav-clamd start
Starting clamav_clamd.
LibClamAV Warning: **************************************************
LibClamAV Warning: *** The virus database is older than 7 days. ***
LibClamAV Warning: *** Please update it IMMEDIATELY! ***
LibClamAV Warning: **************************************************
root@fw:/usr/local/etc# /usr/local/etc/rc.d/clamav-freshclam start
Starting clamav_freshclam.
root@fw:/usr/local/etc# ps aux | grep clam
clamav 2181 0.0 10.7 20596 20092 ?? Is 6:22PM 0:00.01 /usr/local/sbin/clamd
clamav 2188 0.0 0.9 2300 1704 ?? Ss 6:23PM 0:00.09 /usr/local/bin/freshcla
- amavisd-newのインストール
amavisd-newは、MTAとウィルススキャンプログラムとの橋渡しの役目を負います。
デフォルトでは、amavisdはポート10024でListenし、MTA(ここではPostfix)からのメールを待ちます。
そして、MTAはポート10025でListenし、amavisからチェックした結果を受け取ります。
# portinstall -vCc security/clamav
-> p5-Mail-SpamAssassin-3.1.6 (SpamAssassin)が一緒にインストールされる
- 設定
コメントアウトされている clamAV の部分のコメントを外し、
clamd の PID 指定を clamd の設定と合わせる。
# vi /usr/local/etc/amavisd.conf
### http://www.clamav.net/
['ClamAV-clamd',
-> \&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.pid"],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# NOTE: run clamd under the same user as amavisd, or run it under its own
# uid such as clamav, add user clamav to the amavis group, and then add
# AllowSupplementaryGroups to clamd.conf;
# NOTE: match socket name (LocalSocket) in clamav.conf to the socket name in
# this entry; when running chrooted one may prefer socket "$MYHOME/clamd".
# diff -Biw amavisd.conf amavisd.conf-dist | grep -e '^<'
< $hdr_encoding = iso-2022-jp;
< $bdy_encoding = iso-2022-jp;
< $mydomain = 'tukizakura.org'; # a convenient default for other settings
< $daemon_chroot_dir = $MYHOME; # chroot directory or undef, -R
< $syslog_facility = 'local6'; # Syslog facility as a string
< $syslog_priority = 'info'; # Syslog base (minimal) priority as a string,
< $myhostname = 'mx.tukizakura.org'; # must be a fully-qualified domain name!
< $notify_method = 'smtp:[127.0.0.1]:10025';
< $forward_method = 'smtp:[127.0.0.1]:10025'; # set to undef with milter!
- ログディレクトリの作成
# mkdir /var/log/amavis
# chown vscan:vscan /var/log/amavis
- postfix
・main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
・master.cf
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
- aliases
virusalert: root
spam.police: root
○正常配信
Oct 22 23:49:58 fw postfix/smtpd[41576]: connect from ftp1.din.or.jp[210.135.90.26]
Oct 22 23:50:14 fw postfix/smtpd[41576]: 774E6B82D: client=ftp1.din.or.jp[210.135.90.26]
Oct 22 23:50:36 fw postfix/cleanup[41593]: 774E6B82D: message-id=<20061022145014.774E6B82D@mx.tukizakura.org>
Oct 22 23:50:36 fw postfix/qmgr[41014]: 774E6B82D: from=<jun-asrk@din.or.jp>, size=390, nrcpt=1 (queue active)
Oct 22 23:50:40 fw postfix/smtpd[41596]: connect from localhost.tukizakura.org[127.0.0.1]
Oct 22 23:50:40 fw postfix/smtpd[41596]: 30F76B841: client=localhost.tukizakura.org[127.0.0.1]
Oct 22 23:50:40 fw postfix/cleanup[41593]: 30F76B841: message-id=<20061022145014.774E6B82D@mx.tukizakura.org>
Oct 22 23:50:40 fw postfix/qmgr[41014]: 30F76B841: from=<jun-asrk@din.or.jp>, size=854, nrcpt=1 (queue active)
Oct 22 23:50:40 fw postfix/smtpd[41596]: disconnect from localhost.tukizakura.org[127.0.0.1]
==> amavis/amavisd.log <==
Oct 22 23:50:40 fw amavis[41496]: (41496-01) Passed CLEAN, [210.135.90.26]
<jun-asrk@din.or.jp> -> <arabesque@tukizakura.org>, Message-ID:
<20061022145014.774E6B82D@mx.tukizakura.org>, mail_id: IgxMT4lm70ee, Hits: 0.884, queued_as: 30F76B841, 4250 ms
==> mail/maillog <==
Oct 22 23:50:40 fw postfix/smtp[41594]: 774E6B82D: to=<arabesque@tukizakura.org>, relay=127.0.0.1[127.0.0.1]:10024, delay=32,
delays=28/0.03/0.05/4.3, dsn=2.6.0, status=sent (250 2.6.0 Ok, id=41496-01,
from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 30F76B841)
Oct 22 23:50:40 fw postfix/qmgr[41014]: 774E6B82D: removed
Oct 22 23:50:40 fw postfix/smtp[41597]: 30F76B841: to=<arabesque@tukizakura.org>, relay=192.168.0.2[192.168.0.2]:25, delay=0.33,
delays=0.15/0.12/0.03/0.03, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7DF1680C608)
Oct 22 23:50:40 fw postfix/qmgr[41014]: 30F76B841: removed
Oct 22 23:50:49 fw postfix/smtpd[41576]: disconnect from ftp1.din.or.jp[210.135.90.26]
○spam
Oct 23 00:21:22 fw postfix/postsuper[41786]: E3BD8B833: removed
Oct 23 00:21:22 fw postfix/postsuper[41786]: Deleted: 1 message
Oct 23 00:21:38 fw postfix/smtpd[41787]: connect from unknown[222.121.65.246]
Oct 23 00:21:39 fw postfix/cleanup[41791]: D1963B837: message-id=<20061022152139.D1963B837@mx.tukizakura.org>
Oct 23 00:21:39 fw postfix/qmgr[41014]: D1963B837: from=<postmaster@tukizakura.org>, size=262, nrcpt=1 (queue active)
Oct 23 00:21:39 fw postfix/smtp[41792]: D1963B837: to=<agape@tukizakura.org>,
relay=postman.tukizakura.org[192.168.0.2]:25, delay=0.09,
delays=0.01/0.03/0.02/0.02, dsn=2.1.5, status=deliverable (250 2.1.5 Ok)
Oct 23 00:21:39 fw postfix/qmgr[41014]: D1963B837: removed
Oct 23 00:21:42 fw postfix/smtpd[41787]: CC105B83E: client=unknown[222.121.65.246]
Oct 23 00:21:43 fw postfix/cleanup[41791]: CC105B83E: message-id=<YCMQEYXALFXIJUNZXUUYWLYVU@hotmail.com>
Oct 23 00:21:43 fw postfix/qmgr[41014]: CC105B83E:
from=<asparagus775@nifty.ne.jp>, size=1710, nrcpt=1 (queue active)
Oct 23 00:21:43 fw postfix/smtpd[41787]: disconnect from unknown[222.121.65.246]
==> clamav/clamd.log <==
Mon Oct 23 00:21:43 2006 -> No stats for Database check - forcing reload
Mon Oct 23 00:21:43 2006 -> Reading databases from /var/db/clamav
==> amavis/amavisd.log <==
Oct 23 00:21:49 fw amavis[41496]: (41496-03) Blocked SPAM, [126.252.164.96]
<asparagus775@nifty.ne.jp> -> <agape@tukizakura.org>, quarantine:
spam-ILfpaKLl6k5x.gz, Message-ID: <YCMQEYXALFXIJUNZXUUYWLYVU@hotmail.com>,
mail_id: ILfpaKLl6k5x, Hits: 33.936, 5920 ms
==> mail/maillog <==
Oct 23 00:21:49 fw postfix/smtp[41793]: CC105B83E: to=<agape@tukizakura.org>,
relay=127.0.0.1[127.0.0.1]:10024, delay=10, delays=4/0.03/0.02/6, dsn=2.5.0,
status=sent (250 2.5.0 Ok, id=41496-03, BOUNCE)
Oct 23 00:21:49 fw postfix/qmgr[41014]: CC105B83E: removed
==> clamav/clamd.log <==
Mon Oct 23 00:21:57 2006 -> Database correctly reloaded (73865 viruses)
メモ †
参考資料 †