ライン

ポイント:バーチャル設定に置き換えてマルチドメイン

ライン

 はじめに

複数のドメイン名を使う

 引き続き、Postfixを使って複数のドメインを利用できるメールサーバに作り替えていきます。

 これまでの設定はPAM(OSで作成したアカウント)にメールが届くための設定をしましたが、これをやめることにします。
/usr/mailpool というディレクトリ以下に、各ドメイン名のサブディレクトリを作成し、それ以下にユーザごとのメールディレクトリを配置する方法にします。

 SMTP認証は、Dovecotで作成したファイルの認証方式にし、アカウントは foo@example.co.jp のような形にすることにします。
到着するメールは、Postfixに同ファイルで認証させて、Maildir形式で自動的にディレクトリを作成するようにさせます。
 これらができるようにするための方法をドキュメントと検索エンジン経由の皆さんのページから探して設定してみました。

 Postfixの設定変更

 基本的には、POP受信のディレクトリが、/usr/mailpool/example.co.jp/foo という形で受信させるようにします。
サーバ内のローカルのアカウントでは、メールのやりとりはしない形で、すべてのドメインをバーチャルに変更します。

 Postfixでのメールボックスは、/usr/mailpool 以下に作成されるようにします。
/var 以下にしなかったのは、単純にスライスの容量設計の段階であまり大きめに取っていなかっただけの話なので、この辺りは /varなり /home以下なりにつくるという方針は各自で決めてください。

 /etc/postfix/main.cf にこれまで動作していた内容から更新していきます。
まず、

smtpd_sasl_type = cyrus

となっている箇所を以下のように変更します。

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

これにより、Dovecot側のファイルで認証するようになります。
(これって、もうSASLのデーモンを動かしている意味なし?
…停止させていても、SMTP認証されるよ。/etc/rc.conf のsaslauthd_enable="NO" に変更)

 main.cf にバーチャルの設定を加える。
最初の1行は、これまでローカルで動かしていたドメインもバーチャル側にしたために、記述を少し削っている。
その分、virtual_mailbox_domains 側に、そのドメインも併せて記述している。
virtual_mailbox_baseは、上記にも書いた通り、Maildirを作成するディレクトリ。
virtual_minimum_uidはセキュリティ関連の指定。
virtual_Xid_mapsは、メールを受信させる アカウントのUIDとGIDを指定。
この値は、適当でいいのだが、1000以上の値にする必要があったはず。適当にお好きな値でどうぞ。
(pwやadduser等でアカウントを作成してそれを指定するようなイメージでも良い)
virtual_alias_maps は、/etc/mail/virtusertable 的な使い方で指定する際に指定。
更新したら、"postmap /etc/postfix/virtual" のように更新していってあげる必要がある。

mydestination = $myhostname, localhost.$mydomain, localhost

virtual_mailbox_domains = example.co.jp example.ne.jp
virtual_mailbox_base = /usr/mailpool
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:10334
virtual_gid_maps = static:10334
virtual_alias_maps = hash:/etc/postfix/virtual

 virtual_mailbox_mapsは、ここでは重要なファイル。
メールを受信した際に、Postfix上でファイルを自動で作成させて配信させるための設定ファイルとなります。

foo@example.co.jp    example.co.jp/foo/Maildir/
foo@example.ne.jp    example.ne.jp/foo/Maildir/

 上記のように、受信させるメールを左辺に。配信される先のディレクトリを右辺に記述します。
デリミタはタブの形式で作成します。(要更新後実施: "postmap /etc/postfix/vmailbox")
 以下に記述する、Dovecot用のパスワードファイルと同時に生成できるようなスクリプトを書くことで追加していけると思います。
時間があった際に作成しますが、作っちゃった人が既にいましたら、ください〜。(誰が書いても同じものにしかならんでしょう)

 次に、Dovecot側の修正です。auth default { がある行以下に、

..
  passdb passwd-file {
    args = /usr/local/etc/dovecot.passwd
  }

  userdb passwd-file {
    args = /usr/local/etc/dovecot.passwd
  }
..
  socket listen {
    master {
      # Master socket provides access to userdb information. It's typically
      # used to give Dovecot's local delivery agent access to userdb so it
      # can find mailbox locations.
      path = /var/run/dovecot/auth-master
      mode = 0600
      # Default user/group is the one who started dovecot-auth (root)
      #user =
      #group =
    }
    client {
      # The client socket is generally safe to export to everyone. Typical use
      # is to export it to your SMTP server so it can do SMTP AUTH lookups
      # using it.
##      path = /var/run/dovecot/auth-client
##      mode = 0660
        path = /var/spool/postfix/private/auth
        mode = 0660
        user = postfix
        group = postfix
    }
  }
}

のように修正。/usr/local/etc/dovecot.passwd は、touch後に root:wheel でchown および chmod 400を指定。
認証関係は、ほとんどをコメント行に修正した。(使わないし)
 socket listen { のある行以下は、上記のように追加と変更を行う。
これにより、IDパスワードは、dovecot.passwd 一本となりました。

 Dovecotの再起動で、/var/spool/postfix/private/auth は生成されます。

 /usr/local/etc/dovecot.passwd を以下のように作成。

foo@example.co.jp:{PLAIN}password1:10334:10334::/usr/mailpool/example.co.jp/foo
foo@example.ne.jp:{PLAIN}password2:10334:10334::/usr/mailpool/example.ne.jp/foo
## foo@example.co.jp:{CRAM-MD5}b45d22f1f1e022f169b296fdb5b0b307fc55194556c0f836b2a02b7fc107cf67:10334:10334::/usr/mailpool/example.co.jp/foo

 これだけで良い。/etc/postfix/vmailbox で作成したものと対になるように作成される必要がある。
指定している内容がほぼ近いので、echo でリダイレクトでアペンドするとか、レコードごと置き換えるなどのスクリプトが良いと思う。
# と上記にも書いたような…

 上記の例は、APOPでの例。CRAM-MD5 を使う場合には、前回に同様にその部分を "dovecotpw -p" により生成させたものを指定すればいい。
(例では、##でコメントされている行となります)
この場合、送信(SMTP側)もCRAM-MD5になるので、メールソフト側はこれに合わせた設定をするようにしてください。

 dovecot.confの設定を変更していきましょう。

#mail_location = maildir:~/Maildir
mail_location = maildir:/usr/mailpool/%d/%n/Maildir
mail_uid = 10334
mail_gid = 10334

 この状態で試してみてください。もちろん以下のようにスクリプトの再起動を忘れずに。

# /etc/rc.d/postfix restart
# /usr/local/etc/rc.d/dovecot restart

 これで、メールの送信も受信もできるようになりました。
/usr/mailpool のディレクトリは、chown -r 10334:10334 /ust/mailpool && chmod 701 /ust/mailpool としました。

 Postfixのその他の設定

virtual

 /etc/postfix/virtual は、以下のような使い方ができます。

info@example.co.jp      foo@example.co.jp
postmaster@example.ne.jp    foo@example.ne.jp

実際にアカウントを作成せずに、特定のアドレスに配送する場合に指定することができます。
設定後は、Postfixの再起動は不要ですが、

# postmap /etc/postfix/virtual

のように更新する必要があります。これは、sendmailで慣れている人でも virtusertableで使っていたのと同じですね。
/etc/mail 上でmake allして更新していたのではないでしょうか。このmakemapと同様です。

header_checks

mail.cf に以下を設定することで、ヘッダーで判定する記述が可能です。

header_checks = regexp:$config_directory/header_checks

タイトルに指定のキーワードが入っていたら、削除とか受け取り拒否などができます。

/^Subject:.*SPAM/i   REJECT

とすれば、受け取り拒否。

/^Subject:.*SPAM/i   DISCARD

上記のようにすると、拒否をせずに自動削除。
右辺に指定できるものは、OKやWARNやIGNOREなどが指定できます。

/^to: *sales@example\.ne\.jp$/ REJECT 

などいろいろできそうです。ヘッダーだけではなく、body_checksを指定することで本文での指定も可能です。

access

/etc/postfix/access は、header_checksに同様に記述ができます。
こっちが慣れているかも知れません。sendmailに同様に /etc/mail/access と同じ指定ができます。

From:cyberspammer.com          ERROR:"550 We don't accept mail from spammers"
From:okay.cyberspammer.com     OK
Connect:sendmail.org           RELAY
To:sendmail.org                RELAY
Connect:128.32                 RELAY
Connect:128.32.2               SKIP
Connect:IPv6:1:2:3:4:5:6:7     RELAY
Connect:suspicious.example.com QUARANTINE:Mail from suspicious host
Connect:[127.0.0.3]            OK
Connect:[IPv6:1:2:3:4:5:6:7:8] OK

指定をするためには、main.cf に記述が必要です。

check_recipient_access hash:/etc/postfix/access

を、smtpd_recipient_restrictions のレコードの1行に加えておいてください。
これもpostmapを実施する必要があります。

 mailboxファイルからmaildirへの変換

mbox2maildir

 移行前にすべてのメールを受信しきっておいてください…といっても必ず残っているものです。
毎度で、これを変換しておく処理をします。

# cd /tmp
# fetch http://untroubled.org/mbox2maildir
# chmod 500 mbox2maildir

残っていたファイルを変換してみます。

# ./mbox2maildir bar bar@example.co.jp 10334 10334

うまくできましたね。できあがったファイルを現在のユーザのディレクトリにコピーして完了です。

 ウェブメールを使う

IMAPの指定を加える

 毎度で、SquirrelMailにて確認することにしました。
個人的には何年ぶりで導入と設定を行います。

 導入開始です。

# cd  /usr/ports/mail/squirrelmail
# make install

 選択画面が表示されます。apache2は先に導入されていたので、ここでは表示されてきません。
www/apache22でほぼデフォルト導入を済ませています。

APACHEの指定を追加、IPV6を削除を指定。
そのまま。

完了。

# make clean
===>  Cleaning for php5-5.3.5
===>  Cleaning for php5-session-5.3.5
===>  Cleaning for php5-hash-5.3.5
===>  Cleaning for php5-gettext-5.3.5
===>  Cleaning for php5-mbstring-5.3.5
===>  Cleaning for php5-openssl-5.3.5
===>  Cleaning for php5-xml-5.3.5
===>  Cleaning for libxml2-2.7.8_1
===>  Cleaning for oniguruma-4.7.1
===>  Cleaning for squirrelmail-1.4.21

そこそこのportsが導入されました。
その他、プラグインは以下の通りportsが存在します。

squirrelmail-abook_import_export-plugin
squirrelmail-askuserinfo-plugin
squirrelmail-avelsieve-plugin
squirrelmail-calendar_file_backend-plugin
squirrelmail-calendar_sql_backend-plugin
squirrelmail-change_ldappass-plugin
squirrelmail-change_sqlpass-plugin
squirrelmail-check_quota-plugin
squirrelmail-compatibility-plugin
squirrelmail-email_footer-plugin
squirrelmail-login_auth-plugin
squirrelmail-login_notes-plugin
squirrelmail-mark_read-plugin
squirrelmail-multilogin-plugin
squirrelmail-notes-plugin
squirrelmail-notify-plugin
squirrelmail-password_forget-plugin
squirrelmail-plugins
squirrelmail-postfixadmin-plugin
squirrelmail-pupdate-plugin
squirrelmail-qmailadmin_login-plugin
squirrelmail-quota_usage-plugin
squirrelmail-sasql-plugin
squirrelmail-secure_login-plugin
squirrelmail-shared_calendars-plugin
squirrelmail-spam-buttons-plugin
squirrelmail-squirrel_logger-plugin
squirrelmail-timeout_user-plugin
squirrelmail-tmda-plugin
squirrelmail-unsafe_image_rules-plugin
squirrelmail-user_special_mailboxes-plugin
squirrelmail-vlogin-plugin
squirrelmail-websearch-plugin
squirrelmail-wetteronline-plugin

手間なしで導入できるので便利になりました。httpd.conf に追加を入れます。

    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps

Alias /webmail/ "/usr/local/www/squirrelmail/"
<Directory "/usr/local/www/squirrelmail">
   AllowOverride All
   Options None
   Order   allow,deny
   Allow   from All
   DirectoryIndex  index.php
</Directory>

設定を開始します。

# cd /usr/local/www/squirrelmail/config/ && ./conf.pl 

以下のような画面となります。

知っているメニュー構成とはいろいろ変わっていました。
10-1-ja_JP
10-2-EUC-JP
2-A-8-dovecot
2-A-6-y-cram-md5
ウェブアクセスすると、ログイン画面が表示されました。

 この先に進むには、Dovecotのimapの設定が必要です。

protocols = pop3 pop3s imap

この設定で、Dovecotの再起動。ログイン名に foo@example.co.jp を指定してログインしましょう。
入れました。しかし、エラー表示あり。
"〜It is not safe to rely on the system's timezone settings.〜" と山のようにウェブ上に表示されている。
php.ini上にある

# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
..
# vi php.ini

ここで指定するのは、

date.timezone = "Asia/Tokyo"

程度。他は必要な際に適用する。apacheの再起動を入れて、再度ログイン。
あっさりです。
送信も受信もあっさりできてしまいましたので、問題なしでした。

 このままだと、SSL通信ができていないので、httpd.conf に修正を入れます。

# Secure (SSL/TLS) connections
Include etc/apache22/extra/httpd-ssl.conf

とコメントをはずします。

 # openssl genrsa -out /usr/local/etc/apache22/server.key 2048
Generating RSA private key, 2048 bit long modulus
..............+++
.....................................................................................................................................+++
e is 65537 (0x10001)
# openssl req -new -days 3650 \
?     -key /usr/local/etc/apache22/server.key \
?     -out /usr/local/etc/apache22/server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:TOKYO
Locality Name (eg, city) []:TOKYO
Organization Name (eg, company) [Internet Widgits Pty Ltd]:example.co.jp
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:example.co.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#openssl x509 -in /usr/local/etc/apache22/server.csr \
? -out /usr/local/etc/apache22/server.crt -req \
? -signkey /usr/local/etc/apache22/server.key \
? -days 3650
Signature ok
subject=/C=JP/ST=TOKYO/L=TOKYO/O=EXAMPLE>CO>JP /CN=example.co.jp
Getting Private key
# chmod 400 server.*

 後は、apacheを再起動して試すだけです。
自己認証の画面が出てしまうので、これを表示させない方法は、本ページの自己認証関連のページを参照ください。
結局は、ユーザによる対応しかありませんが。

httpd.confかIncludes 以下のファイルで

<VirtualHost XXX.YYY.ZZZ.aaa:80>
        ServerName      example.co.jp
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond     %{HTTP_HOST} !^example\.co\.jp\/webmail\/ [NC]
        RewriteRule     ^(.*)$ https://example.co.jp/webmail/ [L,R=301]
</IfModule>
</VirtualHost>

のように記述を追加することで、強制的にSSLでの通信で行わさせることができます。

これでやりたかったことができるようになりました。
Dovecot便利。SquirrelMailは相変わらず高性能。postfixわかりやすい。

評価としては、まずまずでした。


【改訂履歴】作成:2011/01/14


【参照ページ】

メモめもMemo・・・ ≫ Blog Archive ≫ postfix + dovecot + SMTP-AUTH
Postfix+Dovecotでメールサーバ構築 - satospo
Postfix - PukiWiki

 
Copyright © 1996,1997-2006,2007- by F.Kimura,