[PostfixAdmin]メールサーバーの建て方

先日の作業はメールサーバーの構築だったんですが、久々すぎて手順をすっかり忘れていました。

手順なんて調べればいくらでも出てきそうですけれど、リマインドも兼ねて手順を書いておきます。

前提として、

  • サーバー環境はCentOS6、root権限あり
  • なるべくyumパッケージを利用する
  • アカウントとメール転送の管理をWeb上から行えるようにする。

    Apacheは既に動いており、PostfixAdmin用にSSL付VirtualHostを追加可能。

以上の条件から、使用するパッケージは Postfix+Dovecot+PostfixAdmin+MySQL に決まり。

以下、ドメインは example.com として解説します。

Directory

まずメールを保存するアカウントを用意します。名前はmailboxとしましょう。

ユーザーidは500番からとなっているので、それより少しだけ若い499……は使われていたので498で作ります。

グループidはユーザーidと同じにする必要は無いのですが、わかりやすくするため同じにしておきます。

(青字が入力)

[root@example ~]# groupadd -g 498 mailbox
[root@example ~]# useradd -u 498 -g 498 -s /bin/false mailbox
[root@example ~]# 


メールを保存する場所ですが、今回は容量に余裕のある /home 下にします。

今作ったアカウントのホームディレクトリ /home/mailbox 以下がいいでしょう。

ここでは /home/mailbox/domains/<domain>/<user>/ で考えます。

メール受信時に自動的に作成されるようですので、特に改めて作成はしません。

MySQL

メールボックス情報(ドメイン、アカウント、転送)を管理するDBMSとしてMySQLを導入します。
といっても作業対象サーバーでは入ってたのですが、入っていなければyumで導入して起動します。

(青字が入力、赤字は注釈)

[root@example ~]# yum install mysql-server
(yumの情報取得ステータスが表示される)

Dependencies Resolved

===============================================================================================
 Package                   Arch              Version                     Repository       Size
===============================================================================================
Installing:
 mysql-server              x86_64            5.0.95-5.el5_9              base            9.9 M
Installing for dependencies:    ←依存パッケージ等は環境によって何が出るか異なる
 perl-DBD-MySQL            x86_64            3.0007-2.el5                base            148 k
Updating for dependencies:
 mysql                     x86_64            5.0.95-5.el5_9              base            4.9 M

Transaction Summary
===============================================================================================
Install       2 Package(s)
Upgrade       1 Package(s)

Total download size: 15 M
Is this ok [y/N]: y
(インストールメッセージが表示される)
[root@example ~]# service mysql start
(起動メッセージが表示される)
[root@example ~]# chkconfig --level 2345 mysql on
[root@example ~]# 


メールシステムで使うためのアカウントとDBを作成します。

アカウント名は mailsystem DB名は postmap としましょうか。password の部分は適当なランダム文字列に変えてください。

[root@example ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
(コマンドの説明文?が出る)
mysql> CREATE DATABASE `postmap`;
Query OK, 1 row affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON `postmap`.* TO 'mailsystem'@'localhost';
Query OK, 0 rows affected (0.05 sec)

mysql> SET PASSWORD FOR 'mailsystem'@'localhost'=PASSWORD('password');
Query OK, 0 rows affected (0.02 sec)

mysql> EXIT
Bye
[root@example ~]# 


Apache

PostfixAdmin を公開するためのサブドメインを作ります。

既存のドメイン内のURLに置く場合は設定方法が変わりますが、ここでは触れません(ヒントはAlias)。

PostfixAdminを置く場所は mailbox のホームを利用して /home/mailbox/PostfixAdmin としましょう。

ApacheにVirtualHostを登録します。
ドメインですが今回は、SSLを使う場合はあまり自由が利かない(ワイルドカード証明書は高く、通常証明書なら追加発行が必要)ため example.com を使い、443以外のポート番号を割り当てます。たとえばSMTPポートは25なので、HTTPSの443とくっつけて25443とか。

そうするとURLは https://example.com:25443/ になります。

Apacheに追加する設定はこんな感じ。

Listen *:25443
<VirtualHost *:25443>
  ServerName   example.com
  DocumentRoot /home/mailbox/PostfixAdmin
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLCertificateFile      /etc/pki/tls/certs/example.com.crt
  SSLCertificateKeyFile   /etc/pki/tls/private/example.com.key
  SSLCertificateChainFile /etc/pki/tls/certs/CA.cer
  LogLevel   warn
  ErrorLog   logs/PostfixAdmin-error_log
  CustomLog  logs/PostfixAdmin-access_log common
</VirtualHost>


SSL鍵に関するパス(SSLCertificateで始まるキーの値)は実際の鍵ファイルのパスに変更してください。

ログファイル名(ErrorLogとCustomLog)は管理者が識別できるなら何でもいいです。

なお、*.example.com のワイルドカード証明書があるか、Server Name Indicationが使用可能で mail.example.com のSSL証明書を別途用意してもよい場合は、 mail.example.com のサブドメインで公開することもできます(ただしDNS設定変更が別途要ります)。

その場合、上の緑の部分を以下のように差し替えます。

(赤字は注釈なので、実際には記述しない)

SSLStrictSNIVHostCheck off      ←この行はSNIを利用する場合のみ記述
<VirtualHost *:443>
  ServerName   mail.example.com


この設定だと https://mail.example.com/ でアクセスできます。

設定を投入したらApacheに反映します。

(青字が入力、赤字は注釈)

[root@example ~]# service httpd configtest
Syntax OK    ←OKではなくエラーメッセージが出たら、設定ファイルにミスがある
[root@example ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[root@example ~]# 


Apacheを再起動すると、新しいURLにアクセスできるはずです。

ファイルが無いので初期状態ページが表示されるだけですが。

PostfixAdmin

PostfixAdmin を導入します。

PostfixAdminを置く場所は mailbox のホームを利用して /home/mailbox/PostfixAdmin としましょう。

パッケージはSourceForgeのサイトからダウンロードします。サイトに行き【sf Download】というボタンを押すとダウンロードページに行きダウンロードが始まりますが、ダウンロードをキャンセルしてdirect linkを右クリックして リンクURLをコピー すると、wgetコマンドでダウンロードするためのURLが得られるはずです。

(この手順に従う人が古いバージョンを取得しないよう、下にはあえてURLそのものは書きません)

記事執筆時点の最新版はバージョン2.3.6でしたので、それをwgetで取得し展開します。URLに & が含まれるとコマンドが誤動作を起こす(シェルが解釈しちゃう)ので、クォーテーションで囲むのはさりげに重要。

[root@example ~]# su - mailbox -s /bin/bash
[mailbox@example ~]$ wget "postfixadmin-2.3.6.tar.gz"
(サーバーへアクセスした旨のメッセージが出る)
HTTP request sent, awaiting response... 200 OK
Length: 1597001 (1.5M) [application/x-gzip]
Saving to: `postfixadmin-2.3.6.tar.gz'

100%[=====================================================>] 1,597,001   2.77M/s   in 0.5s

2013-12-02 15:57:00 (2.77 MB/s) - `postfixadmin-2.3.6.tar.gz' saved [1597001/1597001]

[mailbox@example ~]$ tar xvzpf postfixadmin-2.3.6.tar.gz
(展開ファイルの一覧が流れる)
[mailbox@example ~]$ 


設定ファイル config.inc.php を編集します。以下、変更箇所のみ解説。
(青字が入力した内容、赤字は注釈)

$CONF['configured'] = true;
$CONF['setup_password'] = '';                             ←後で入力;
$CONF['postfix_admin_url'] = 'https://example.com:25443';  ←Apacheで設定した公開URL;
$CONF['default_language'] = 'ja';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'mailsystem';
$CONF['database_password'] = 'password';
$CONF['database_name'] = 'postmap';
$CONF['admin_email'] = 'postmaster@example.com';
$CONF['default_aliases'] = array (
    'abuse' => 'abuse@example.com',
    'hostmaster' => 'hostmaster@example.com',
    'postmaster' => 'postmaster@example.com',
    'webmaster' => 'webmaster@example.com'
);
$CONF['domain_path'] = 'YES';                             ←ドメイン用ディレクトリを作る;
$CONF['domain_in_mailbox'] = 'NO';                        ←ユーザーディレクトリにドメイン名を含めない;


設定したら、 PostfixAdmin のディレクトリをドキュメントルートに載せます。

[mailbox@example ~]$ mv postfixadmin-2.3.6 PostfixAdmin
[mailbox@example ~]$ 


PostfixAdminがApacheで公開されるようになったので、 https://example.com:25443/setup.php へアクセスします。

Postfix Admin Setup Checker なるものが表示されるので、各ステータスがOKなのを確認します。エラーがある場合は、不足するパッケージを導入したり設定を修正したりして、エラーを改修してください。

ページの一番下に Change setup password と書かれたところに適当なパスワードを入れるとセットアップ用パスワードが変更……されません。

入力するとこんな文字が出てきます。

If you want to use the password you entered as setup password, edit config.inc.php and set
$CONF['setup_password'] = 'de406fcc835282991157d1d753ddc164:72b00656c160d10d1c00afe9b11bd2e8957c4620';


さっき設定ファイル中で空のままにしていた $CONF['setup_password'] に、ここで書かれてるランダムな文字列を設定します。

そして同じページへ再アクセスすると、一番下の部分が Create superadmin account に変わっています。

さっき入力したパスワード、作成したい管理アカウントの名前と、そのアカウントのパスワード(2回)を入力して 管理者追加 を押すと、 PostfixAdmin の管理者が作成できます。

(DBの作成や設定をミスしていると、作成できないかもしれません)

https://example.com:25443/ のほうで、作成した管理者アカウントでログインしてみて、入れることを確認しましょう。

入れたら、 setup.php のアクセス権を 600 とかに変えて、管理者の作成ができないようにしてしまいましょう。

最初はメールアドレスどころかドメインも空っぽなので、メールドメイン example.com を登録します。

そして送受信のテストにも必要ですので、メールアカウントを1つ作ります(たとえば test@example.com とか)。[ようこそメールの送信]チェックボックスは、Postfixをまだセットアップしていないので機能しません。入れないように。

(PostfixAdminの操作説明は省きます)

Dovecot

PostfixがSMTP認証するのにDovecotの機能を利用するため、こっちを先に入れます。

MySQLと同じくyumから。現在バージョン2.0.9でした。あとMySQLアクセスするため dovecot-mysql パッケージも入れます。

[root@example ~]# yum install dovecot dovecot-mysql
(情報取得ステータスやパッケージ情報が表示される)
Is this ok [y/N]: y
(インストールメッセージが表示される)
[root@example ~]# 


Dovecot の設定ファイルは /etc/dovecot/dovecot.conf/etc/dovecot/conf.d/*.conf に分散されていますが、管理を面倒にしないために

既存ファイルの修正は最小限にして、 /etc/dovecot/dovecot_local.conf を作ってそこで追加の設定をします。

あとMySQLから情報取得するための設定を/etc/dovecot/dovecot_mysql.confに入れます。

/etc/dovecot/dovecot.conf

!include_try /etc/dovecot/dovecot_local.conf   ←最後の行に追加


/etc/dovecot/conf.d/10-auth.conf

#!include auth-system.conf.ext   ←コメントアウトする


/etc/dovecot/conf.d/10-ssl.conf

#ssl_cert = </etc/pki/dovecot/certs/dovecot.pem      ←コメントアウトする
#ssl_key = </etc/pki/dovecot/private/dovecot.pem     ←コメントアウトする


/etc/dovecot/dovecot_local.conf(新規作成)

# SSLの設定
ssl = yes
ssl_cert = </etc/pki/tls/certs/example.com.chain.crt   ←SSL公開鍵(後述)
ssl_key  = </etc/pki/tls/private/example.com.key       ←SSL秘密鍵

# プロトコルの設定
protocols = pop3 imap
service pop3-login {
  inet_listener pop3 {
    port = 0                    ←こうするとSSLなしのPOP3はListenしない
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
service imap-login {
  inet_listener imap {
    port = 0                    ←こうするとSSLなしのIMAPはListenしない
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

# 認証機能の設定
auth_mechanisms = digest-md5 cram-md5      ←DB保存時にパスワードをmd5しているため、PLAINやLOGINは使えない
passdb {
  # SQLからパスワード情報を取得する設定
  driver = sql
  args = /etc/dovecot/dovecot_mysql.conf
}
userdb {
  # SQLからメールボックスの情報を取得する設定
  driver = sql
  args = /etc/dovecot/dovecot_mysql.conf
}
service auth {
  # Postfixに認証機構を提供するための設定
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
}

# メールボックスとuid/gidの設定
mail_location = maildir:~/
first_valid_uid = 498
last_valid_uid  = 498
first_valid_gid = 498
last_valid_gid  = 498


/etc/dovecot/dovecot_mysql.conf(新規作成)

driver = mysql
default_pass_scheme = MD5-CRYPT
connect = dbname=postmap user=mailsystem host=/var/lib/mysql/mysql.sock password=password
password_query = SELECT m.password as password FROM mailbox m, domain d WHERE m.domain = d.domain AND m.username = '%u' AND m.active = '1' AND d.active = '1'
user_query = SELECT concat('/home/mailbox/domains/', maildir) as home, 498 as uid, 498 as gid FROM mailbox WHERE username = '%u' AND active = '1'


dovecot_local.conf で設定するSSL証明書ですが、ApacheやPostfixと異なり、CA証明書を登録する設定項目がありません。

ではどうするかというと……1ファイルにサイト証明書とCA証明書を一緒に入れてしまうのです。

テキストエディタで作ってもいいですし、コマンド一発でやるならcatで

[root@example certs]# cat example.com.crt CA.cer > example.com.chain.crt


とすればいいです。

ただし example.com.crt ファイル中の最後の文字が改行ではない場合、出来上がった example.com.chain.crt ファイルは故障してしまいますので気をつけてください。

その場合は作成コマンド(例)はこうなります。

[root@example certs]# ( cat example.com.crt && echo && cat CA.cer ) > example.com.chain.crt


設定したら起動します。

[root@example ~]# service dovecot start
(起動メッセージが表示される)
[root@example ~]# chkconfig --level 2345 dovecot on
[root@example ~]# 


さきほどPostfixAdminで作ったアカウント test@example.com を使って、POPアクセスが可能かどうか確認します。注意点として、

  • SSLでしかアクセスできない(Gmailと同じ?)
  • POPアカウント名=メールアドレス
  • メールは一通もない。Postfix未整備なので送信も受信もできない。

なので、あくまでPOPアクセスしてエラーが出ないことだけを確認します。

Postfix

ようやくPostfixを入れます……といきたいですが、今回は初めから入っていたりします。

Linuxは何らかのSMTPサーバーが入っており、ローカル専用で動いているのが慣例なので、そこにPostfixが採用されている場合もあります。

ので、Postfixが入っていない場合、入っているSMTPサーバーを削除してからPostfixを導入しないといけません。

今回その手順は省略します。めんどいので。

設定変更に入りますが、そういった事情でPostfixが既に動いている場合、いったん止めたほうがいいかもしれません。

[root@example ~]# service postfix stop
(停止メッセージが表示される)
[root@example ~]# 


設定ですが、 /etc/postfix に色々入っていますが、重要なのは main.cf と master.cf の2つ。

あとMySQLへのアクセス用に3ファイルを追加します。

/etc/postfix/main.conf(編集要点のみ記述、赤字は解説)

myhostname = example.com
mydomain = example.com
myorigin = $myhostname
mydestination = 

home_mailbox = Maildir/ 

以下、追加の設定

# メールボックスが置かれる場所
virtual_mailbox_base = /home/mailbox/domains

# 配送先の設定
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_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf

# uid/gidの設定
virtual_minimum_uid = 498
virtual_uid_maps = static:498
virtual_gid_maps = static:498

# SMTP認証の許可
smtpd_sasl_auth_enable = yes
smtpd_tls_loglevel = 1
tls_daemon_random_source = dev:/dev/urandom

# 認証方法の設定
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous, noplaintext

# TLS使用可能
smtpd_use_tls = yes

# 証明書と秘密鍵
smtpd_tls_cert_file = /etc/pki/tls/certs/example.com.crt
smtpd_tls_key_file =  /etc/pki/tls/private/example.com.key
smtpd_tls_CAfile =    /etc/pki/tls/certs/CA.cer
smtpd_tls_CApath =    /etc/pki/tls/certs


/etc/postfix/master.conf(編集要点のみ記述、赤字は解説)

smtp      inet  n       -       n       -       -       smtpd
  -o smtpd_sasl_auth_enable=no                                        ←25番ポートのSMTP認証を無効にする
smtps     inet  n       -       n       -       -       smtpd         ←465番ポートでSSLメール送信を可能にする
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject    ←設定項目名を変える
  -o milter_macro_daemon_name=ORIGINATING


/etc/postfix/mysql_virtual_alias_maps.cf(新規作成)

user = mailsystem
password = password
hosts = localhost
dbname = postmap
query = SELECT goto FROM alias WHERE address='%s'


/etc/postfix/mysql_virtual_domains_maps.cf(新規作成)

user = mailsystem
password = password
hosts = localhost
dbname = postmap
query = SELECT domain FROM domain WHERE domain='%s'


/etc/postfix/mysql_virtual_mailbox_maps.cf(新規作成)

user = mailsystem
password = password
hosts = localhost
dbname = postmap
query = SELECT maildir FROM mailbox WHERE username='%s'


設定したら、Postfixを起動します。

[root@example ~]# service postfix start
(起動メッセージが表示される)
[root@example ~]# chkconfig --level 2345 postfix on      ←新規導入の場合はこれも実行
[root@example ~]# 


Postfixを起動するとメールの送受信が可能になるので、テストします。

注意点として、基本的に送信もSSLと認証を使わないと行えないのと、DNS設定されていない場合は外部SMTPサーバーからはメールが届きません

  • test@example.com から test@example.com にメールを送り、送受信ともに可能か
  • test@example.com から外部のメールアドレスにメールを送り、正しく配送されるか。
  • メールソフトのSMTP設定で【SSL使用】と【SMTP認証】を外して、test@example.com にメール送信可能か。
  • メールソフトのSMTP設定で【SSL使用】と【SMTP認証】を外して、外部のメールアドレスにメールを送り、正しく拒否されるか

上記テストが全て通れば一応メールサーバーは完成です。

DNS設定変更

完成したメールサーバーを実際に運用するために、DNSにMXレコードを登録します。

これをやらないと外部メールサーバーからメールが届きません。

設定の仕方はここでは触れません。ドメイン業者ごとに微妙に違いますし、業者に問い合わせてください。

設定後、各サーバーのDNS(リゾルバ)に反映されるまでは時間がかかります。

自分のサーバー上で反映されたかどうかは、以下のコマンドを打つと確認できます。

[root@example ~]# dig example.com mx
(問い合わせ内容に関するメッセージ)

;; QUESTION SECTION:
;example.com.                           IN      MX

;; ANSWER SECTION:
example.com.            1200    IN      MX      10 example.com.    ←設定した内容が表示されればOK

(通信に関するメッセージ)
[root@example ~]# 


DNS設定がインターネット内に充分に反映されたら、最後の試験を行います。

  • 外部サーバーのメールアカウントから test@example.com にメールを送り、正しく配送されるか。

メールが届いたら、メールシステムは完成です。

お疲れ様でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください