AdminによるバーチャルSMTPサーバの構築(CentOS4.x編)おやじは2つのドメインを運用しており、Postfixで簡易的なバーチャルドメインで運用していましたが、一方のドメインは娘が主体的に運用している中でエラーメールがおやじに飛んできてしまうなど、運用が面倒くさくなってきました。そこで、ドメイン毎に管理できるよう、つまり同じユーザ名でもドメイン毎に管理できるようにしました。ここでは、メールに関してはUNIXアカウントは一切使用しない前提で記述してあります。とし外部からもセキュアに使用できるようにしました。AntiVirは通常の方法で対応できます。Adminにより、エンドユーザによる転送設定とパスワード変更ができます。転送機能は、本来のメアド宛にメールを配送するとともに指定した宛先にカーボンコピーを送るタイプのもので、転送先は複数指定できます。携帯への転送をしたい時には結構便利に使えると思います。バーチャルドメイン環境でのVacation機能について、日本語化対応しましたのでこちらを参照ください。SquirrelMailを動かしているなら比較的簡単に導入できます。Adminを導入するため、WWWサーバとPHP、MySQLが必要ですが、ここではWWWサーバとPHPは既に動作しているものとします。未導入の場合は、おやじのHPを参考に設定してください。携帯電話宛てメールの遅延、不達対策はこちらを参考にしてください。■サポート範囲の明確化SMTPをどのように使用するかで、対応しなければならない範囲が変わってきます。おやじなりの整理をすると、以下のようになると考えています。家庭内から、インターネットや家庭内アカウントにメールを送信するだけ。上記に加え、外部環境(インターネット側)から自宅サーバを利用して他のインターネットアカウントにも送信できるようにする。インターネット上を平文のパスワードが流れるので危険。TLSによる暗号化によりパスワードをガードできるので、外部からの利用も安全。以下に各機能の実現方法を示しますが、必要な部分のみ設定を行えば良いように記述してあります。外部環境から使用する場合は是非TLSまで対応してください。プロバイダのSMTPを使用するときは、そんなことはしていないと思われるかもしれませんが、自宅SMTPサーバ利用とプロバイダのSMTPサーバ利用ではパケットが流れているところが違います。プロバイダ(SMTP)のため(ダイヤルアップもホールセーラ相当)、ホールセーラやプロバイダ内部に悪意をもった者がいない限りまず安心です。自社のネットワーク(AP)以外からもアクセスを許容している場合は、プロバイダに乗り入れるまでの経路が特定できないため、暗号化しないで使用することは危険です。自宅SMTPサーバを外部から利用する場合も、これに該当します。自宅SMTPサーバはどこからでも利用できるので便利なのですが、盗聴される危険性は高くなるので注意が必要です。■MySQLのインストール今回は、バーチャルドメイン、ユーザ管理をMySQLで行うため、まずはMySQL関連のパッケージをYumでインストールしておきます。MySQL関連のパッケージのインストール状況を確認する。base上記の「libdbi-dbd-mysql」から「php-mysql」までの6パッケージがインストールされているか確認し、インストールされていないパッケージを下記のように列挙してインストールする。php-mysqlシステム起動時にMySQLが自動起動できるようにし、起動する。startMySQLのrootにパスワードを設定すると共に、誰でもアクセスできてしまう匿名ユーザ(空のuser)を削除しておく。'rootパスワード'MySQLにログインし、誰でもアクセスできてしまう匿名ユーザ(空のuser)を削除しておく。server)にもパスワードを設定しておく。Adminを導入しGUI環境で行えるようにしました。AdminはPHPで書かれていますので、PHPをサポートするWWWサーバが動作していることが前提になります。SquirrelMailを既に動かしている方なら、何も準備はいりません。Adminの本家からパッケージをダウンロードしてきて、WWWサーバでアクセスできるディレクトリに設置した後、設定していきます。Adminの本家からパッケージをダウンロードしてきて解凍した後、アクセスしやすいようにディレクトリ名を変更し、オーナとパーミッションを変更する。パーミッション変更はマニュアルどおりに行っているため存在しない拡張子を指定している場合があり、一部エラーが出る可能性があるが無視してよい。Adminの状態を確認する。http://192.168.1.100/postfixadmin/setup.php事前にMySQL等のインストールができていれば、上記のように「config.inc.php」が存在しないというエラーだけが出るはずである。それ以外のエラーが出たら内容を確認して必要なモジュールをインストールする等の対策が必要である。PostgreSQL関係のエラーが出てもここでは使用しないので無視してよい。(おやじはRPM作成の関係でインストールしているのでエラーは出なかった。Off」をOnに修正し、Apacheをreloadしておくこと。Adminの設定を以下により行っていきます。「config.inc.php」をサンプルをコピーして作成する。アクセスしてみると、エラーがなくなるはずである。setup.php次にデータベースのテーブルを作成しておく。Adminの管理画面にアクセスしてみる。http://192.168.1.100/postfixadmin/admin/表示が英語であることと、いくつかの情報が表示されるので内容を確認し、以下で対応する。Apacheの設定によっては、ここで認証要求される場合がある。パスとユーザ名とパスワードの変更を行っておく。余計な情報表示をしないように以下のように、3個のtxtファイルを適当な名前にリネームしておく。xxxx-users.txt続いて、画面上で表示されるメールホスト名やドメイン名を以下で自分の環境にあわせて変更する。config.inc.php最後に日本語化を行う。Adminの表示言語は、languagesディレクトリ配下にあるxx.langというファイルをconfig.inc.phpで使用する言語にあわせて設定することで変更できる。残念ながら日本語用のファイルはないので、英語版をベースにja.langファイルを作成し、config.inc.phpでja.langファイルを指定するとともに、ヘッダファイルの言語をShift_JISに変更する。header.tpl再度、管理画面を表示してみると、日本語になっているはずである。このままでは管理画面にだれでもアクセスできてしまうので、用意されているベーシック認証を有効にする。.htpasswdへのパスを変更する。なっているので変更する。oyajiApacheとしてドキュメントルートで.htaccessが使用できるようになっていればよいが、未設定の場合は以下の内容をhttpd.confに追加、再起動して.htaccessが使用できるようにする必要がある。Adminではユーザ名やパスワードの入力があるので、SSL化を基本とする。こちらと同様に下記内容をhttpd.confに追加し、自動的にhttpsにrewriteするようにする。config.inc.php内のデータベースパスワードを変更しておく。ここで変更するのはpostfixadminのみ。postfixは後述するpostfixのコンフィグファイルで指定する。config.inc.php次に、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はバーチャルな環境では使用できません。MySQLではmd5cryptは不可。○md5cryptならデフォルトのままでよいが、cleartextに変更するなら下記で設定を変更しておく。バーチャルドメインで動作させる場合の専用ユーザとグループおよびメールボックス用のディレクトリを作成しておきます。インストールCentOSのPostfixは残念ながらMySQLに対応していませんので、SRPMを貰ってきてspecファイルを少しいじって再コンパイルしたものをインストールしました。ところが、バーチャルで動作せるとMaildir形式の場合、個々のファイルは制限できるが全体は容量制限ができないという問題がありました。調べたらパッチがあったのでそれを利用してみましたが、問題なく動作するようです。CentOSのPostfixのSPRMをベースにMySQL対応とQuotaパッチをあてて再コンパイルしたものをインストールします。SRPMは理研さんのサイトあたりにあるので、updateから最新版をダウンロードしてきて展開する。postfix-x.x.x-vda.patch.gz)を落としてきて解凍しておく。postfix-2.2.10-vda.patch.gzspecファイルにパッチをあてて再コンパイルする。大したパッチではないので、バージョンが異なっても簡単に対応できると思われる。リビルドしてできあがったRPMをインストールする。同一バージョンがインストールされている場合は、--forceオプションでインストールする。動かすための基本的な設定を下記により行います。ここでは、修正した部分のみ記載しています。(青字は削除、赤字は追加、緑字は変更したものです。$myhostnameを指定すればいい。CGIでメールを送信したりする場合の送信元に設定される。返信するためのチェックをしており、その時点で蹴られてしまうので注意が必要である。メールを受け取るネットワークインタフェースのアドレス範囲を指定する。virtual_mailbox_domainsで指定したドメインが処理されるので未指定。コメントアウトではないので注意。Courier-imapを使うため、Maildir形式とする。sendmail互換プログラムがsendmail.postfixとなっており、CGIとの整合が取れないので修正する。CGI側を修正する場合は、下記を含めて修正は不要です。ローカルへの配送をバーチャル配送エージェントで行う。パラメータ値にマッチするドメイン宛のデフォルトのメール配送エージェントの指定。バーチャルメールボックスが置かれる場所で、事前準備で用意したディレクトリを指定する。ローカルまたはリモートアドレスにエイリアスするオプションの検索テーブルを指定する。ローカルまたはリモートドメインのアドレスにエイリアスされるドメインの名前のリストを指定する。バーチャルメール配送エージェントを使って配送されるドメインのリストを指定する。マッチするドメインの全ての有効なアドレスを持つ検索テーブルを指定する。ユーザIDの最小値(事前準備で用意したuid)を指定。この値以下のuidの配送は拒否される。事前準備で用意したユーザIDを指定。事前準備で用意したグループIDを指定。一通のメールサイズを指定(デフォルでは下記の10MB。上記で指定したMySQL認証用のファイルをここで作成します。各ファイルは、上記で指定したように/etc/postfix配下に設置します。username上記で作成したファイルのパーミッションを変更しておきます。quota用のファイル(/etc/postfix/vquota)をここで作成します。ファイルでは、ユーザやドメイン毎のメールボックスのサイズを指定します。ここでのサイズはvirtual_mailbox_limit以下で指定すること。quota用のファイル(/etc/postfix/vquota)に以下のような設定を行う。12800000設定が完了したら、下記でvquota.dbを作成しておく。/etc/postfix/vquota以上で設定は完了であり、容量がオーバすると下記メッセージで受信が拒否されるので確認する。later.◆sendmail互換プログラムの修正messagesにsendmailのpathがおかしいと出ていたので調査したところ、/usr/sbin/sendmailが互換プログラムに置き換わっておらず、CGIからのメール利用ができなくなっていました。下記で修正が必要です。/usr/sbin/sendmail◆送信テスト一気に設定してしまうと、問題発生時に問題箇所の切り分けが困難になることと、Courier-IMAPが正しく動作していないとSMTP-AUTHが動作しないので、ここまでで正常に送信できるか送信試験をしてみましょう。試験に先立ちPostfixを起動しておきます。CentOSのRPMは自動起動しないようになっているので、chkconfigしてシステム起動時に自動起動するようにすると共に起動しておく。Adminでドメインを登録し、テスト用のメールボックスを登録する。この時点で、当該ユーザ宛に「ようこそ!」というタイトルでメールが配送される。設定できているなら、/usr/local/virutualディレクトリ配下にhogehoge@mail.aconus.comというような、メールアドレスのディレクトリが作成され、その中のnewディレクトリ内に上記の「ようこそ!」メールが配送されているはずなので確認する。配送されていない場合は、logを見るなどして対処が必要である。ここで、SMTP-AUTHの認証をMySQL直で行う場合は次に進めるが、authdaemonやrimapの場合はPOP3/IMAPサーバが動作していることが前提になるのでこの先に進めない。Authetication関係の設定Postfixの場合、SMTP-AUTHはSASLを使用して行います。調べたのですが、認証方法としてはCourier-IMAPのauthdaemondを使う方法、rimapで行う方法、MySQLで直接認証する方法があり、以下にそれぞれの方法について示します。クライアントでうまくいかないときは、手動でテストしてみると状況がつかめるかもしれません。ここでは、こちらも参考にしました。(青字は削除、赤字は追加、緑字は変更したものです。TLSのsample.cfとダブるので、こちらはコメントアウトしたほうが良い。Postfixのデフォルトはmyhostnameであるが、SuSEのデフォルトは設定なしである。ここは設定なしのままでないと認証できないので注意が必要。mynetworksで指定されたネットワークからのリレーを許可。SMTP認証を通過したものは許可。目的地へのメール以外を拒否。(本設定で不正な外部からのメールをrejectする。使用時は下記のような設定を追加する。6.0なのでnoのまま。認証方法は前述のように3種類あるので、それぞれについて示します。今回はCourier-IMAPのauthdaemonを使用しました。Courier-IMAPは、主たるドメインでメーラのアカウント設定で「@ドメイン」を省略したい場合に、そのドメインを「DEFAULT_DOMAIN」で指定しておけば補完してくれるので、こちらを利用すると良いです。[Courier-IMAPのauthdaemonを使用する方法]/usr/lib/sasl2/smtpd.confを以下のように設定する。3注:saslの仕様のようで、mech_listでcram-md5を指定し、SMTP-AUTHでcram-md5を認証しようとすると、pwcheck_methodの設定が無視されauxpropになってしまうので、SMTP-AUTHでcram-md5はバーチャルな環境では使用できません。authdaemonのsocketをpostfixが読めるようにするため、postfixユーザをdaemonグループに追加する。postfixSMTP-AUTHがうまくいかないときの参考にするため、authdaemonのログをデバッグモードにするとよい。DEBUG_LOGIN=2にすると詳細にログが採れるが、パスワードも見えてしまうのでテストテスト終了後は元に戻すと共に、ログを消しておくこと。/etc/authlib/authdaemonrc内のDEBUG_LOGINの設定を「2」に変更する。SMTPはPOP認証後一定時間そのユーザのSMTPを許可してしまうのに対して、rimapは一連のSMTP-AUTH動作の中でimap認証を使うだけなので、セキュリティレベルは全く違うものである。以下のように設定する。127.0.0.1"MECHをrimapに変更する。-v"でsaslがサポートしている認証メカニズムを確認できる。FLAGはオプション指定であり、"-r"は、バーチャルドメインの場合にアカウント名を"oyaji@mail.aconus.com"のようにユーザ名@ドメインで指定するが、@を挟んでそれぞれを認識させるためのもので、指定しないとアカウント名の最後に"oyaji@mail.aconus.com@"のように@をつけないとうまく認識してくれない。127.0.0.1"は、rimapのホストを指定するためのものである。/usr/lib/sasl2/smtpd.confを以下のように設定する。3rimapの場合はsaslauthdを動かす必要があるので、以下で起動しておく。start[MySQL直接による方法]これは、PostfixAdminでパスワードをcleartextで設定した場合のみに採用できる方法である。PostfixAdminを前提にするなら下記のとおり設定すればよい。/usr/lib/sasl2/smtpd.confを以下のように設定する。3「cyrus-sasl-sql」がインストールされていない場合(デフォルトではインストールされない?)は、yumでインストールしpostfixをreloadしておく。設定が必要になります。各種証明書や鍵については、サーバ証明書の作成を参考にしてください。参考にして対策を検討してください。追加コピーして編集できます。用乱数デバイスの指定のところまで削除してください。修正したイメージで記載しています。(青字は削除、赤字は追加、緑字は変更したものです。上記をコメントアウトして下記に変更すること。自身が止まってしまう(正確にはそのメールを中継できなくなるだけ)という問題が発覚しました。問題は、5.0の問題とのことなので、おやじは6.0を使用しており設定を外しました。アクセスはあくまで465番ポートです。対応の併用はできません。コメントアウトを外すだけです。忘れないようにしてください。上記ではなく、下記のデフォルトのままコメントを外すこと。デフォルトで組み込まれ、自動実行スクリプトも組み込まれますので再起動だけしてください。メイン画面から、「ツール」、「アカウント」で使用するアカウントのプロパティを開き、「サーバー」タブを開く。送信メールサーバーの、「このサーバーは認証が必要」にチェックマークを入れる。設定ボタンを押すと、ログオン情報の設定ができるが、通常は「受信メールサーバーと同じ設定を使用する」で問題はない。詳細設定タブで、「サーバーのポート番号」の「送信メール(SMTP)」を465に、その下の、「このサーバーは認証が必要セキュリティで保護された接続(SSL)が必要」にチェックマークを入れる。設定を追加する必要があります。利用時の対策ですので、間違っても25番は閉じたりしないでください。外部からのメールが受信できなくなってしまいます。