Postfix+MySQL+Postfix AdminによるバーチャルSMTPサーバの構築(CentOS4.x編)


おやじは2つのドメインを運用しており、Postfixで簡易的なバーチャルドメインで運用していましたが、一方のドメインは娘が主体的に運用している中でエラーメールがおやじに飛んできてしまうなど、運用が面倒くさくなってきました。そこで、ドメイン毎に管理できるよう、つまり同じユーザ名でもドメイン毎に管理できるようにしました。ここでは、メールに関してはUNIXアカウントは一切使用しない前提で記述してあります。サポートレベルは従来どおり、SMTP-AUTH + TLS とし外部からもセキュアに使用できるようにしました。AntiVirは通常の方法で対応できます。
なお、Postfix Adminにより、エンドユーザによる転送設定とパスワード変更ができます。転送機能は、本来のメアド宛にメールを配送するとともに指定した宛先にカーボンコピーを送るタイプのもので、転送先は複数指定できます。携帯への転送をしたい時には結構便利に使えると思います。
バーチャルドメイン環境でのVacation機能について、日本語化対応しましたのでこちらを参照ください。

導入にあたっては、既にPostfix で SMTP-AUTH + TLS およびSquirrelMailを動かしているなら比較的簡単に導入できます。なお、ドメインやユーザ管理を簡単にするため、今回はPostfix Adminを導入するため、WWWサーバとPHP、MySQLが必要ですが、ここではWWWサーバとPHPは既に動作しているものとします。未導入の場合は、おやじのHPを参考に設定してください。

 携帯電話宛てメールの遅延、不達対策はこちらを参考にしてください。

■サポート範囲の明確化

SMTPをどのように使用するかで、対応しなければならない範囲が変わってきます。おやじなりの整理をすると、以下のようになると考えています。

機 能 使 用 範 囲 備 考
SMTP AUTH TLS
× × 家庭内から、インターネットや家庭内アカウントにメールを送信するだけ。 送信先は任意
家庭内向けの受信は必須
× 上記に加え、外部環境(インターネット側)から自宅サーバを利用して他のインターネットアカウントにも送信できるようにする。但し、インターネット上を平文のパスワードが流れるので危険。
フルアクセスが可能。TLSによる暗号化によりパスワードをガードできるので、外部からの利用も安全。
以下に各機能の実現方法を示しますが、必要な部分のみ設定を行えば良いように記述してあります。

なお、外部環境から使用する場合は是非TLSまで対応してください。プロバイダのSMTPを使用するときは、そんなことはしていないと思われるかもしれませんが、自宅SMTPサーバ利用とプロバイダのSMTPサーバ利用ではパケットが流れているところが違います。プロバイダのSMTPを利用する場合は、ホールセーラの場合ですと、ホールセーラ <-> 専用線 <-> プロバイダ(SMTP)のため(ダイヤルアップもホールセーラ相当)、ホールセーラやプロバイダ内部に悪意をもった者がいない限りまず安心です。但し、自社のネットワーク(AP)以外からもアクセスを許容している場合は、プロバイダに乗り入れるまでの経路が特定できないため、暗号化しないで使用することは危険です。自宅SMTPサーバを外部から利用する場合も、これに該当します。自宅SMTPサーバはどこからでも利用できるので便利なのですが、盗聴される危険性は高くなるので注意が必要です。

MySQLのインストール

今回は、バーチャルドメイン、ユーザ管理をMySQLで行うため、まずはMySQL関連のパッケージをYumでインストールしておきます。

  1. MySQL関連のパッケージのインストール状況を確認する。

    # yum list | grep mysql
    libdbi-dbd-mysql.i386        0.6.5-10.RHEL4.1   installed
    mysql.i386                   4.1.10a-2.RHEL4.1  installed
    mysql-devel.i386             4.1.10a-2.RHEL4.1  installed
    mysql-server.i386            4.1.10a-2.RHEL4.1  installed
    mysqlclient10.i386           3.23.58-4.RHEL4.1  installed
    php-mysql.i386               4.3.9-3.6          installed
    freeradius-mysql.i386        1.0.1-3.RHEL4      update
    mod_auth_mysql.i386          1:2.6.1-2.2        base
    mysql-bench.i386             4.1.10a-2.RHEL4.1  base
    mysqlclient10-devel.i386     3.23.58-4.RHEL4.1  base

  2. 上記の「libdbi-dbd-mysql」から「php-mysql」までの6パッケージがインストールされているか確認し、インストールされていないパッケージを下記のように列挙してインストールする。

    # yum install libdbi-dbd-mysql mysql mysql-devel mysql-server mysqlclient10 php-mysql

  3. システム起動時にMySQLが自動起動できるようにし、起動する。

    # chkconfig mysqld on
    # /etc/init.d/mysqld start

  4. MySQLのrootにパスワードを設定すると共に、誰でもアクセスできてしまう匿名ユーザ(空のuser)を削除しておく。

    # mysqladmin -u root password 'rootパスワード'

  5. MySQLにログインし、誰でもアクセスできてしまう匿名ユーザ(空のuser)を削除しておく。

    # mysql -u root -p
    Enter password:
    rootパスワード[Enter]
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 3 to server version: 4.0.15

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> select host,user,password from mysql.user;
    ←user確認
    +-----------+------+------------------+
    | host      | user | password         |
    +-----------+------+------------------+
    | localhost | root | **************** |
    | server    | root |                  |
    | localhost |      |                  |
    | server    |      |                  |
    +-----------+------+------------------+
    4 rows in set (0.01 sec)

    mysql> delete from mysql.user where user=""; ←匿名user削除
    Query OK, 2 rows affected (0.01 sec)

    mysql> select host,user,password from mysql.user; ←user確認
    +-----------+------+------------------+
    | host      | user | password         |
    +-----------+------+------------------+
    | localhost | root | **************** |
    | server    | root |                  |
    +-----------+------+------------------+
    2 rows in set (0.00 sec)

  6. 最後に、任意の場所からアクセスできるroot (ここではhost名: server)にもパスワードを設定しておく。

    mysql> set password for root@'server'=password('rootパスワード');
    Query OK, 0 rows affected (0.02 sec)

    mysql> select host,user,password from mysql.user; ←user確認
    +-----------+------+------------------+
    | host      | user | password         |
    +-----------+------+------------------+
    | localhost | root | **************** |
    | server    | root | **************** |
    +-----------+------+------------------+
    2 rows in set (0.00 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.06 sec)

    mysql> \q
    Bye

■Postfix Adminのインストールと設定

バーチャルドメイン、ユーザ管理を簡単にするため、Postfix Adminを導入しGUI環境で行えるようにしました。前述のようにPostfix AdminはPHPで書かれていますので、PHPをサポートするWWWサーバが動作していることが前提になります。SquirrelMailを既に動かしている方なら、何も準備はいりません。

◆Postfix Adminのインストール

Postfix Adminの本家からパッケージをダウンロードしてきて、WWWサーバでアクセスできるディレクトリに設置した後、設定していきます。

  1. Postfix Adminを設置するWWWサーバのディレクトリ(おやじはドキュメントルート)に移動し、Postfix Adminの本家からパッケージをダウンロードしてきて解凍した後、アクセスしやすいようにディレクトリ名を変更し、オーナとパーミッションを変更する。パーミッション変更はマニュアルどおりに行っているため存在しない拡張子を指定している場合があり、一部エラーが出る可能性があるが無視してよい。

    # cd /usr/local/src
    # wget http://high5.net/postfixadmin/download.php?file=postfixadmin-2.1.0.tgz
    # cd /var/www/html
    # tar zxfv /usr/local/src/download.php?file=postfixadmin-2.1.0.tgz
    # mv postfixadmin-2.1.0 postfixadmin
    # chown -R apache:apache postfixadmin
    # cd ./postfixadmin
    # chmod 640 *.php *.css
    # cd ./admin/
    # chmod 640 *.php .ht*
    # cd ../images/
    # chmod 640 *.gif *.png
    # cd ../languages/
    # chmod 640 *.lang
    # cd ../templates/
    # chmod 640 *.tpl
    # cd ../users/
    # chmod 640 *.php

  2. ここでブラウザで下記の例のようにPostfix Adminにアクセスし、Postfix Adminの状態を確認する。

        http://192.168.1.100/postfixadmin/setup.php


    事前にMySQL等のインストールができていれば、上記のように「config.inc.php」が存在しないというエラーだけが出るはずである。それ以外のエラーが出たら内容を確認して必要なモジュールをインストールする等の対策が必要である。なお、PostgreSQL関係のエラーが出てもここでは使用しないので無視してよい。(おやじはRPM作成の関係でインストールしているのでエラーは出なかった。)
    Magic Quotesがoffの場合は、/etc/php.iniの「magic_quotes_gpc = Off」をOnに修正し、Apacheをreloadしておくこと。

◆Postfix Adminの設定

Postfix Adminの設定を以下により行っていきます。

  1. 「config.inc.php」をサンプルをコピーして作成する。

    # cd /var/www/html/postfixadmin
    # cp config.inc.php.sample config.inc.php
    # chown apache:apache config.inc.php
    # chmod 640 config.inc.php

  2. コピーが済んだら、再度 setup.php にアクセスしてみると、エラーがなくなるはずである。エラーが無いことを確認したら setup.php を削除しておく。

    # rm setup.php

  3. 次にデータベースのテーブルを作成しておく。MySQLでパスワードを設定している場合

    [パスワード未設定時]
    # cd /var/www/html/postfixadmin
    # mysql -u root < DATABASE_MYSQL.TXT

    [パスワード設定時]
    # cd /var/www/html/postfixadmin
    # mysql -u root -p < DATABASE_MYSQL.TXT
    Enter password:xxxxx[Enter]

  4. ここで、ブラウザで下記の例のようにPostfix Adminの管理画面にアクセスしてみる。

        http://192.168.1.100/postfixadmin/admin/


    表示が英語であることと、いくつかの情報が表示されるので内容を確認し、以下で対応する。
    なお、Apacheの設定によっては、ここで認証要求される場合がある。その場合は、8項で .htpasswd へのパスとユーザ名とパスワードの変更を行っておく。

  5. まず、余計な情報表示をしないように以下のように、3個のtxtファイルを適当な名前にリネームしておく。

    # cd /var/www/html/postfixadmin
    # mv motd.txt xxxx.txt
    # mv motd-admin.txt xxxx-admin.txt
    # mv motd-users.txt xxxx-users.txt

  6. 続いて、画面上で表示されるメールホスト名やドメイン名を以下で自分の環境にあわせて変更する。

    # cd /var/www/html/postfixadmin
    # sed -i "s/\@change-this-to-your.domain.tld/\@mail.aconus.com/g" config.inc.php
    # sed -i "s/change-this-to-your.domain.tld/www.aconus.com/g" config.inc.php

  7. 最後に日本語化を行う。Postfix Adminの表示言語は、languagesディレクトリ配下にあるxx.langというファイルをconfig.inc.phpで使用する言語にあわせて設定することで変更できる。
    残念ながら日本語用のファイルはないので、英語版をベースにja.langファイルを作成し、config.inc.phpでja.langファイルを指定するとともに、ヘッダファイルの言語をShift_JISに変更する。

    # cd /var/www/html/postfixadmin/languages
    # wget http://www.aconus.com/~oyaji/suse9.2/ja.lang
    # chown apache:apache ja.lang
    # chmod 640 ja.lang
    # cd ../
    # sed -i "s/\$CONF\['default_language'\] = 'en'/\$CONF\['default_language'\] = 'ja'/g" config.inc.php
    # cd ./templates
    # sed -i "s/iso-8859-1/Shift_JIS/g" header.tpl

    再度、管理画面を表示してみると、日本語になっているはずである。


  8. このままでは管理画面にだれでもアクセスできてしまうので、用意されているベーシック認証を有効にする。

  9. ここで、Postfix Adminのデフォルトのデータベースパスワード(postfix / postfixadmin)を下記で変更したのち 、config.inc.php内のデータベースパスワードを変更しておく。なお、ここで変更するのはpostfixadminのみ。postfixは後述するpostfixのコンフィグファイルで指定する。

    # mysql -u root -p
    Enter password:
    xxxxx[Enter]
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 48 to server version: 4.0.21

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> set password for postfix@'localhost'=password('new password1');
    Query OK, 0 rows affected (0.03 sec)

    mysql> set password for postfixadmin@'localhost'=password('new password2');
    Query OK, 0 rows affected (0.00 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.03 sec)

    mysql> \q
    Bye

    # cd /var/www/html/postfixadmin/
    # sed -i "s/\$CONF\['database_password'\] = 'postfixadmin'/\$CONF\['database_password'\] = '
    new password2'/g" config.inc.php

  10. 次に、PostfixAdminで管理するパスワード体系を決めておく必要があり、SMTP-AUTHで使用する認証メカニズムによってパスワード体系は決定される。具体的には、md5cryptかcleartextかを決めておく必要があるが、デフォルトはmd5cryptであり、cleartextは丸見えなので特段の理由がない限りそのままとすることを薦める。但し、md5cryptの場合、sasl2でのMySQLでの直接の認証はできない(チャレンジレスポンスに対応していない)のと、IMAPでCRMA-MD5を使用する場合(MD5は非可逆なのでcleartextでないと認証できない)は、cleartextとすること。
    おやじは、パスワードだけ暗号化しても意味がないことと、MySQL上に生パスワードがあることを考え、ここではmd5cryptを使用しメールシステムではSSL+cleartextで運用している。
    注:saslの仕様のようで、mech_listでcram-md5を指定しSMTP-AUTHでcram-md5を認証しようとすると、pwcheck_methodの設定が無視されauxpropになってしまうので、SMTP-AUTHでcram-md5はバーチャルな環境では使用できません。

    POP3/IMAPサーバ 認証メカニズム パスワード体系 備 考
    md5crypt cleartext
    Courier-IMAP authdaemon  
    rimap
    MySQL直接 × MySQLではmd5cryptは不可。 
    Dovecot rimap MySQLではmd5cryptは不可
    MySQL直接 ×

    md5cryptならデフォルトのままでよいが、cleartextに変更するなら下記で設定を変更しておく。

    # cd /var/www/html/postfixadmin/
    #
    sed -i "s/'md5crypt'/'cleartext'/g" config.inc.php


■Postfix のインストールと設定

ここで、Postfixのインストールと設定を行います。

事前準備

事前準備として、Postfix をバーチャルドメインで動作させる場合の専用ユーザとグループおよびメールボックス用のディレクトリを作成しておきます。

# groupadd -g 10000 vuser
# useradd -g vuser -u 10000 vuser
# mkdir /usr/local/virtual
# chown vuser:vuser /usr/local/virtual
# chmod 771 /usr/local/virtual

◆Postfix のインストール

CentOSのPostfixは残念ながらMySQLに対応していませんので、SRPMを貰ってきてspecファイルを少しいじって再コンパイルしたものをインストールしました。ところが、バーチャルで動作せるとMaildir形式の場合、個々のファイルは制限できるが全体は容量制限ができないという問題がありました。いろいろ調べたらパッチがあったのでそれを利用してみましたが、問題なく動作するようです。
CentOSのPostfixのSPRMをベースにMySQL対応とQuotaパッチをあてて再コンパイルしたものをインストールします。

  1. Postfix のSRPMは理研さんのサイトあたりにあるので、updateから最新版をダウンロードしてきて展開する。

    # cd /usr/src/redhat/SOURCES
    # wget http://ftp.riken.go.jp/Linux/centos/4.4/os/SRPMS/postfix-2.2.10-1.RHEL4.2.src.rpm
    # rpm -Uvh postfix-2.2.10-1.RHEL4.2.src.rpm

  2. 続けて、こちらからPostfixと同一バージョンのQuotaのパッチ(postfix-x.x.x-trash.patch.gz / postfix-x.x.x-vda.patch.gz)を落としてきて解凍しておく。

    # cd /usr/src/redhat/SOURCES
    # wget http://vda.sourceforge.net/VDA/postfix-2.2.10-vda.patch.gz
    # gunzip -d postfix-2.2.10-vda.patch.gz

  3. specファイルにパッチをあてて再コンパイルする。大したパッチではないので、バージョンが異なっても簡単に対応できると思われる。リビルドしてできあがったRPMをインストールする。既に同一バージョンがインストールされている場合は、--forceオプションでインストールする。

    # cd ../SPECS
    # wget http://www.aconus.com/~oyaji/centos/postfix-2.2.10-1.vda.centos4.4.patch
    # patch -p0 < postfix-2.2.10-1.vda.centos4.4.patch
    # rpmbuild -ba postfix.spec
    # rpm --force -Uvh ../RPMS/i386/postfix-2.2.10-1.RHE L4.2.i386.rpm


◆基本的な設定(main.cf)

Postfix の設定は、/etc/postfix/main.cf を編集します。SMTP を動かすための基本的な設定を下記により行います。ここでは、修正した部分のみ記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

# ホスト名の設定
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = mail.aconus.com

# ドメイン名の設定
#mydomain = domain.tld
mydomain = aconus.com

# メール送信の設定
# ローカルで配送されたメールがどこからくるように見えるか指定するもので、デフォルトの
# $myhostnameを指定すればいい。分かりにくい表現であるが、ここの値は、localhostが
# 送信する場合のホスト名として@以下に設定されるもので、例えば、デーモンが吐くメール
# やCGIでメールを送信したりする場合の送信元に設定される。従って、ここで指定された
# ホスト名は、インターネット上でDNSが牽ける名前でないと、相手サーバでエラー発生時に
# 返信するためのチェックをしており、その時点で蹴られてしまうので注意が必要である。
#myorigin = $mydomain
myorigin = $myhostname

# メール受信の設定
# メールを受け取るネットワークインタフェースのアドレス範囲を指定する。
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = all

# メールの最終目的地とみなす範囲の指定
# virtual_mailbox_domainsで指定したドメインが処理されるので未指定。コメントアウトではないので注意。
# warning: do not list domain sample.jp in BOTH mydestination and virtual_mailbox_domains
# というエラー対策
#mydestination = $myhostname, localhost.$mydomain
#mydestination = $myhostname, localhost.$mydomain $mydomain
#mydestination = $myhostname, localhost.$mydomain, $mydomain,
#   mail.$mydomain, www.$mydomain, ftp.$mydomain
mydestination =

# 信頼できるクライアントのネットワークを指定
# (家庭内のネットワーク192.168.1.0/24とlocalhost指定)
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
mynetworks =  192.168.1.0/24, 127.0.0.0/8

# リレーを許可するドメインを指定
#relay_domains = $mydestination
relay_domains = $mydestination

# ローカル配送で使うアリアス関係の指定
#alias_maps = dbm:/etc/aliases
#alias_maps = hash:/etc/aliases
#alias_maps = hash:/etc/aliases, nis:mail.aliases
#alias_maps = netinfo:/aliases
alias_maps = hash:/etc/aliases

#alias_database = dbm:/etc/aliases
#alias_database = dbm:/etc/mail/aliases
#alias_database = hash:/etc/aliases
#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
alias_database = hash:/etc/aliases

# メールBOXの形式を指定
# Courier-imapを使うため、Maildir形式とする。
#home_mailbox = Mailbox
#home_mailbox = Maildir/
home_mailbox = Maildir/

# sendmail互換プログラムの修正
# sendmail互換プログラムがsendmail.postfixとなっており、CGIとの整合が取れないので修正する。
# CGI側を修正する場合は、下記を含めて修正は不要です。
#sendmail_path = /usr/sbin/sendmail.postfix
sendmail_path = /usr/sbin/sendmail

# ローカルへの配送をバーチャル配送エージェントで行う。
local_transport = virtual

# virtual_mailbox_domains パラメータ値にマッチするドメイン宛のデフォルトのメール配送エージェントの指定。
virtual_transport = virtual

# バーチャルメールボックスが置かれる場所で、事前準備で用意したディレクトリを指定する。
virtual_mailbox_base = /usr/local/virtual

# ローカルまたはリモートアドレスにエイリアスするオプションの検索テーブルを指定する。
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

# ローカルまたはリモートドメインのアドレスにエイリアスされるドメインの名前のリストを指定する。
virtual_alias_domains = $virtual_alias_maps

# バーチャルメール配送エージェントを使って配送されるドメインのリストを指定する。
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

# virtual_mailbox_domains にマッチするドメインの全ての有効なアドレスを持つ検索テーブルを指定する。
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf

# ユーザIDの最小値(事前準備で用意したuid)を指定。この値以下のuidの配送は拒否される。
virtual_minimum_uid = 10000

# 事前準備で用意したユーザIDを指定。
virtual_uid_maps = static:10000

# 事前準備で用意したグループIDを指定。
virtual_gid_maps = static:10000

##### 以下は、soft quota関係の設定 #####

# メールボックスのサイズを指定(デフォルでは下記の50MB)
mailbox_size_limit = 51200000

# 一通のメールサイズを指定(デフォルでは下記の10MB。mail_size_limit以下で指定)
message_size_limit = 10240000

# メールボックスのサイズを指定(デフォルでは下記の50MB)
virtual_mailbox_limit = 51200000

# バーチャルドメイン毎のメールボックスのサイズを記述したハッシュファイルを指定
virtual_mailbox_limit_maps = hash:/etc/postfix/vquota
virtual_mailbox_limit_override = yes


# 容量オーバ時の送信者への警告メッセージ送信指定
virtual_overquota_bounce = yes

# 受信トレイだけを制限する場合に指定
virtual_mailbox_limit_inbox = yes


◆バーチャルドメイン関係の設定ファイルの作成

上記で指定したMySQL認証用のファイルをここで作成します。各ファイルは、上記で指定したように/etc/postfix配下に設置します。なお、password は、前述の Postfix Admin の設定の9項で変更した new_password1 を使用する。


上記で作成したファイルのパーミッションを変更しておきます。

# chmod 644 /etc/postfix/mysql_virtual*


◆soft quota関係の設定ファイルの作成

上記で指定したsoft quota用のファイル(/etc/postfix/vquota)をここで作成します。ファイルでは、ユーザやドメイン毎のメールボックスのサイズを指定します。なお、ここでのサイズはvirtual_mailbox_limit以下で指定すること。

  1. soft quota用のファイル(/etc/postfix/vquota)に以下のような設定を行う。

    # ユーザやドメイン毎のメールボックスのサイズを指定(virtual_mailbox_limit以下で指定)
    oyaji@mail.aconus.com   51200000
    @mail.aconus.com         25600000
    @mail.example.com        12800000


  2. 設定が完了したら、下記でvquota.dbを作成しておく。

    # postmap /etc/postfix/vquota


以上で設定は完了であり、容量がオーバすると下記メッセージで受信が拒否されるので確認する。

Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.


◆sendmail互換プログラムの修正

messagesにsendmailのpathがおかしいと出ていたので調査したところ、/usr/sbin/sendmailが互換プログラムに置き換わっておらず、CGIからのメール利用ができなくなっていました。下記で修正が必要です。
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /usr/sbin/sendmail.postfix /usr/sbin/sendmail


◆送信テスト

一気に設定してしまうと、問題発生時に問題箇所の切り分けが困難になることと、Courier-IMAPが正しく動作していないとSMTP-AUTHが動作しないので、ここまでで正常に送信できるか送信試験をしてみましょう。なお、試験に先立ちPostfixを起動しておきます。

  1. CentOSのRPMは自動起動しないようになっているので、chkconfigしてシステム起動時に自動起動するようにすると共に起動しておく。

    # chkconfig postfix on
    # chkconfig --list postfix
    postfix     0:off   1:off   2:on    3:on    4:on    5:on    6:off
    # /etc/init.d/postfix start

  2. Postfix Adminでドメインを登録し、テスト用のメールボックスを登録する。

  3. この時点で、当該ユーザ宛に「ようこそ!」というタイトルでメールが配送される。正しく設定できているなら、/usr/local/virutualディレクトリ配下にhogehoge@mail.aconus.comというような、メールアドレスのディレクトリが作成され、その中のnewディレクトリ内に上記の「ようこそ!」メールが配送されているはずなので確認する。もし配送されていない場合は、logを見るなどして対処が必要である。

  4. ここで、SMTP-AUTHの認証をMySQL直で行う場合は次に進めるが、authdaemonやrimapの場合はPOP3/IMAPサーバが動作していることが前提になるのでこの先に進めない。配送確認ができたらPostfixの設定に関しては一時中断し、POP3/IMAPサーバを先に動作させる

■SMTP Authetication関係の設定

Postfixの場合、SMTP-AUTHはSASLを使用して行います。いろいろ調べたのですが、認証方法としてはCourier-IMAPのauthdaemondを使う方法、rimapで行う方法、MySQLで直接認証する方法があり、以下にそれぞれの方法について示します。
なお、 SMTP-AUTH がクライアントでうまくいかないときは、手動でテストしてみると状況がつかめるかもしれません。

◆main.cf の設定

SMTP Autheticationに関しては、/usr/share/doc/postfix-2.1.5/README-Postfix-SASL-RedHat.txtを参考にして/etc/postfix/main.cf に追加します。
ここでは、こちらも参考にしました。(青字は削除、赤字は追加、緑字は変更したものです。)

# SMTP サーバ制御の設定
# SASLによるSMTP認証を使用
#smtpd_sasl_auth_enable = yes
#smtpd_sasl_auth_enable = no
smtpd_sasl_auth_enable = yes

# 使用可能な認証メカニズムの設定
# noanonymous : 匿名での接続を拒否。
# noplaintext : PLAIN認証を拒否(Outlook ExpressはPLAIN認証のみ対応のためおやじは未記述)
#smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_security_options = noanonymous

# 認証時のTLSの強制設定
# パスワードが流れるので、認証はTLS使用のみ許可する場合はyesに変更
# TLSのsample.cfとダブるので、こちらはコメントアウトしたほうが良い。
#smtpd_tls_auth_only = yes
#smtpd_tls_auth_only = no

# ローカル認証 realm の名前を設定
# Postfixのデフォルトはmyhostnameであるが、SuSEのデフォルトは設定なしである。
# ここは設定なしのままでないと認証できないので注意が必要。
#smtpd_sasl_local_domain = $mydomain
#smtpd_sasl_local_domain = $myhostname

# リレーを許可するものを設定(sample-smtpd.cf)
# ・permit_mynetworks : mynetworksで指定されたネットワークからのリレーを許可。
# ・permit_sasl_authenticated : SMTP認証を通過したものは許可。
# ・reject_unauth_destination : 目的地が $inet_interfaces、$mydestination $virtual_alias_domains
#  または $virtual_mailbox_domains にマッチするアドレス宛のメール、及び$relay_domains にマッチする
#  目的地へのメール以外を拒否。
#  (本設定で不正な外部からのメールをrejectする。check_relay_domainsは2.0では使用
#  されなくなった。)
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

# AUTHコマンドのサポートを認識できないクライアントへの対応(sample-compatibility.cf)
# Outlook Express 4 および Exchange 5等はAUTH コマンドをサポートしていることを認識できないので、
# 使用時は下記のような設定を追加する。おやじはOE 6.0なのでnoのまま。
broken_sasl_auth_clients=yes


◆saslauthd 関係の設定

ここでは、SMTP AUTHで使用する saslauthd 関係の設定をします。認証方法は前述のように3種類あるので、それぞれについて示します。なお、今回はCourier-IMAPのauthdaemonを使用しました。また、Courier-IMAPは、主たるドメインでメーラのアカウント設定で「@ドメイン」を省略したい場合に、そのドメインを「DEFAULT_DOMAIN」で指定しておけば補完してくれるので、こちらを利用すると良いです。

[Courier-IMAPのauthdaemonを使用する方法]
  1. /usr/lib/sasl2/smtpd.confを以下のように設定する。

    pwcheck_method: authdaemond
    authdaemond_path: /var/spool/authdaemon/socket
    mech_list: cram-md5 plain login
    log_level: 3


    注:saslの仕様のようで、mech_listでcram-md5を指定し、SMTP-AUTHでcram-md5を認証しようとすると、pwcheck_methodの設定が無視されauxpropになってしまうので、SMTP-AUTHでcram-md5はバーチャルな環境では使用できません。

  2. authdaemonのsocketをpostfixが読めるようにするため、postfixユーザをdaemonグループに追加する。

    # usermod -G postfix,mail,daemon postfix


  3. SMTP-AUTHがうまくいかないときの参考にするため、authdaemonのログをデバッグモードにするとよい。DEBUG_LOGIN=2にすると詳細にログが採れるが、パスワードも見えてしまうのでテストテスト終了後は元に戻すと共に、ログを消しておくこと。
    /etc/authlib/authdaemonrc内のDEBUG_LOGINの設定を「2」に変更する。

    #DEBUG_LOGIN=0
    DEBUG_LOGIN=2


[rimapによる方法]

これは、SMTP-AUTHをimapで認証できたことを持って行う方法であり、POP before SMTPと似たようなイメージがあるが、POP before SMTPはPOP認証後一定時間そのユーザのSMTPを許可してしまうのに対して、rimapは一連のSMTP-AUTH動作の中でimap認証を使うだけなので、セキュリティレベルは全く違うものである。

  1. /etc/sysconfig/saslauthd を以下のように設定する。赤字を追加。

    # Directory in which to place saslauthd's listening socket, pid file, and so
    # on. This directory must already exist.
    SOCKETDIR=/var/run/saslauthd

    # Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
    # of which mechanism your installation was compiled to use.
    #MECH=shadow
    MECH=rimap

    # Additional flags to pass to saslauthd on the command line. See saslauthd(8)
    # for the list of accepted flags.
    FLAGS="-r -O 127.0.0.1"


  2. /usr/lib/sasl2/smtpd.confを以下のように設定する。

    pwcheck_method: saslauthd
    saslauthd_path: /var/run/saslauthd/mux
    mech_list: cram-md5 digest-md5 plain login
    log_level: 3


  3. rimapの場合はsaslauthdを動かす必要があるので、以下で起動しておく。

    # chkconfig saslautd on
    # chkconfig --list saslauthd
    saslauthd      0:off  1:off  2:on   3:on   4:on   5:on   6:off
    # /etc/init.d/saslauthd start


[MySQL直接による方法]

これは、PostfixAdminでパスワードをcleartextで設定した場合のみに採用できる方法である。PostfixAdminを前提にするなら下記のとおり設定すればよい。

  1. /usr/lib/sasl2/smtpd.confを以下のように設定する。

    pwcheck_method: auxprop
    auxprop_plugin: sql

    sql_engine: mysql
    sql_hostnames: localhost
    sql_user: postfix
    sql_passwd: new password1
    sql_database: postfix
    sql_select: SELECT password FROM mailbox WHERE username = '%u@%r' AND active = '1'
    mech_list: cram-md5 digest-md5 plain login
    log_level: 3


  2. 「cyrus-sasl-sql」がインストールされていない場合(デフォルトではインストールされない?)は、yumでインストールしpostfixをreloadしておく。

    # yum install cyrus-sasl-sql
    # service postfix reload



■TLS 関係の設定

TLS 化に関しては、main.cf と master.cf の設定が必要になります。なお、各種証明書や鍵については、サーバ証明書の作成を参考にしてください。
PostfixでTLS対応を行うと、クライアントのウイルス対策ソフトによっては(Norton AntiVirusで発生)、25番ポートのまま(STARTTLS)では送信できなくなることがあるので、こちら を参考にして対策を検討してください。

◆main.cfの設定

TLS化に関しても、/usr/share/doc/postfix-2.1.5/samples ディレクトリ内に sample-tls.cf があるので、この内容を、/etc/postfix/main.cf に追加コピーして編集できます。sample-tls.cf の後半には、クライアントの設定がありますがそのままにしておくとエラーが出るので、TLS 用乱数デバイスの指定のところまで削除してください。
ここでは、sample-tls.cf から修正したイメージで記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

# サーバ証明書/鍵関係の設定を変更(RSAのみ対応)
#smtpd_tls_cert_file = /etc/postfix/server.pem
#smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_tls_cert_file = /usr/local/certs/server.crt
smtpd_tls_key_file = /usr/local/certs/server.key

#
# Its DSA counterparts:
#smtpd_tls_dcert_file = /etc/postfix/server-dsa.pem
#smtpd_tls_dkey_file = $smtpd_tls_dcert_file

# CA関係の設定を変更
# smtpd_tls_CAfile = /etc/postfix/CAcert.pem
smtpd_tls_CAfile = /usr/local/certs/ca.crt
#
#smtpd_tls_CApath = /etc/postfix/certs
smtpd_tls_CApath = /usr/local/certs

# ログレベルの変更(最低レベル)
# smtpd_tls_loglevel = 0
smtpd_tls_loglevel = 1

# TLS使用(そのまま)
smtpd_use_tls = yes

# Outlook/Outlook Express用のモード設定 ( * :下記参照 )
# smtpd_tls_wrappermode = no

# 認証時のTLSの強制設定
# パスワードが流れるので、認証はTLS使用のみ許可する場合はyesに変更
# smtpd_tls_auth_only = no  

# セッションキャッシュの設定(そのまま)
smtpd_tls_session_cache_database = sdbm:/etc/postfix/smtpd_scache
# postfix-2.2系以降はsdbmからbtreeに変わっているので、2.2系以降の場合は
# 上記をコメントアウトして下記に変更すること。
# smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache

# 証明書は前述の方法で作成
#smtpd_tls_dh1024_param_file = /etc/postfix/dh_1024.pem
#smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem

# TLS用乱数デバイスの指定
# tls_random_source = dev:/dev/urandom
tls_daemon_random_source = dev:/dev/urandom
#
tls_random_source = egd:/var/run/egd-pool
# tls_random_bytes = 32
# tls_random_reseed_period = 3600s

# tls_random_upd_period = 60s

# tls_daemon_random_source = dev:/dev/urandom
tls_daemon_random_source = dev:/dev/urandom
#
tls_daemon_random_source = egd:/var/run/egd-pool
# tls_daemon_random_bytes = 32

*: この設定は、OE が rfc と違うインプリをしているということで設定しましたが、クライアントが OE ならいいのですが、全てのクライアントに特殊な手順で相手してしまうので、local ( AntiVir ) から local への配送時に postfix 自身が止まってしまう(正確にはそのメールを中継できなくなるだけ)という問題が発覚しました。この OE の問題は、5.0の問題とのことなので、おやじは6.0を使用しており設定を外しました。但し、アクセスはあくまで465番ポートです。これでわかるとおり、OE5.0 の環境では、AntiVir と TLS 対応の併用はできません。

◆master.cf の設定

Outlook/Outlook Express を使用する場合の専用の設定と TLS セッションキャッシュマネージャの設定を master.cf で行います。RPM をインストールすると、master.cf ができますので、smtps (2行にまたがっているので注意) と tlsmgr のコメントアウトを外すだけです。
なお、AntiVir を使用している場合は設定 (localhost:smtp-backdoor・・・) を忘れないようにしてください。
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
smtps    inet  n       -       n       -       -       smtpd
  -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

#submission     inet    n       -       n       -       -      smtpd
#  -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
#628      inet  n       -       n       -       -       qmqpd
pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       nqmgr
tlsmgr   fifo  -       -       n       300     1       tlsmgr
# tlsmgrはpostfix-2.2系以降、typeがunixに変更になっているので2.2系以降の場合は
# 上記ではなく、下記のデフォルトのままコメントを外すこと。
#tlsmgr    unix  -       -       n       1000?   1       tlsmgr

rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
localhost:smtp-backdoor inet n - n - - smtpd -o content_filter=

■Postfix の起動・再起動

Postfix はデフォルトで組み込まれ、自動実行スクリプトも組み込まれますので再起動だけしてください。
# /etc/init.d/postfix restart


■クライアントの設定

次に、Outlook Express の設定を変更します。
  1. メイン画面から、「ツール」、「アカウント」で使用するアカウントのプロパティを開き、「サーバー」タブを開く。
  2. 送信メールサーバーの、「このサーバーは認証が必要」にチェックマークを入れる。
    設定ボタンを押すと、ログオン情報の設定ができるが、通常は「受信メールサーバーと同じ設定を使用する」で問題はない。
  3. 詳細設定タブで、「サーバーのポート番号」の「送信メール(SMTP)」を465に、その下の、「このサーバーは認証が必要セキュリティで保護された接続(SSL)が必要」にチェックマークを入れる。
     
SMTP のポート番号が追加になったので、外部から使用するならルータの設定も変更する必要があり、フィルタリングとスタティック NAT の設定を追加する必要があります。あくまで外部からクライアントでの SMTP 利用時の対策ですので、間違っても25番は閉じたりしないでください。外部からのメールが受信できなくなってしまいます。


Topページへ