ここでは、postfixとdovecotを使用して、Unixユーザーアカウントを利用したメールサーバを構築する方法を示す。この方法では、バーチャルドメインを使用していない場合、もっとも一般的な方法である。
バーチャルドメインを利用している場合、違うドメイン名で、同じユーザー名が使えないなどいろいろと不便なことが多いので、その場合は、バーチャルメールボックスを使用する。バーチャルメールボックスを使用した設定についてはここを参照のこと。
なお、DNSで、MXレコードが設定されていない場合は、たいていの場合Aレコードを利用してメールが送られるが、サーバによってはMXレコードが設定されていないと、送らない場合があるので(例えばsendmailでAレコードを使わないに設定した場合など)、必ずMXレコードは設定しておくこと。
POP3に関しては、TLSを、SMTPに関しては、TLS+SMTP Authを利用するのがもっとも望ましい。この場合、APOPは不要である。しかしながら、TLSが未だ使えない環境の場合も多い。その場合は、POP3はAPOPをSMTPはSMTP Authで運用するようにする。SMTP Authが使えないというような場合は、POP before SMTPを使うことになるが、できるだけ避けるべきである。
postfixおよび、dovecotはFC4およびFC5の標準のSMTP、POP3、IMAPサーバである。yumから簡単にインストールすることができる。また、openSUSE 10.0の場合、postfixは標準であるが、dovecotは標準では入っていないので、yastを使ってインストールする。
以下はFC5におけるyumでのインストール例である。
# yum install postfix
Loading "installonlyn" plugin
Setting up Install Process
Setting up repositories
core [1/3]
updates [2/3]
extras [3/3]
Reading repository metadata in from local files
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for postfix to pack into transaction set.
postfix-2.2.8-1.2.x86_64. 100% |=========================| 44 kB 00:06
---> Package postfix.x86_64 2:2.2.8-1.2 set to be updated
--> Running transaction check
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
postfix x86_64 2:2.2.8-1.2 core 3.5 M
Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 3.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): postfix-2.2.8-1.2. 100% |=========================| 3.5 MB 06:41
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: postfix ######################### [1/1]
Installed: postfix.x86_64 2:2.2.8-1.2
Complete!
# yum install dovecot
Loading "installonlyn" plugin
Setting up Install Process
Setting up repositories
core [1/3]
core 100% |=========================| 1.1 kB 00:00
updates [2/3]
updates 100% |=========================| 951 B 00:00
extras [3/3]
extras 100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
primary.xml.gz 100% |=========================| 765 kB 00:00
extras : ################################################## 2163/2163
Added 34 new packages, deleted 246 old in 1.99 seconds
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for dovecot to pack into transaction set.
dovecot-1.0-0.beta2.7.x86 100% |=========================| 24 kB 00:00
---> Package dovecot.x86_64 0:1.0-0.beta2.7 set to be updated
--> Running transaction check
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
dovecot x86_64 1.0-0.beta2.7 core 1.1 M
Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 1.1 M
Is this ok [y/N]: y
Downloading Packages:
(1/1): dovecot-1.0-0.beta 100% |=========================| 1.1 MB 00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: dovecot ######################### [1/1]
Installed: dovecot.x86_64 0:1.0-0.beta2.7
Complete!
Postfixの主要な設定は
/etc/postfix/main.cf
で行う。また、いくつかのpostfixの動作に関しては、
/etc/postfix/master.cf
もいじる必要がある。
起動、停止は
# postfix start
# postfix stop
再起動ではなく、設定の再読み込みでおこなう。
# postfix reload
なお、初めての起動時や設定を変えたりした場合は念のため下記のホームページで第三者中継を拒否するかどうかを確認しておくこと。
第三者中継の設定の確認:長崎ネットワークサービス
Linuxの設定ファイルはデーモン(サーバ)ごとに少しずつ違うが、特にPostfixは、Linuxの他の設定ファイルに比べて注意が必要である。
#で始まる行はコメント行であるが、#を途中からはじめることはできない。すなわち、下記のような書き方は、認められない。
myhostname = foo.example.com #コメントほげほげ
また、"や'で括ったり、行末に;を付けることもしてはいけない。下記のような書き方は誤りである。
myhostname = "foo.example.com" myhostname = 'foo.example.com' myhostname = foo.example.com;
ここでは、どのような形の運用の場合でも必要な設定について述べる。以下、特に記述がない場合はmain.cf内に書く。
実は、Postfixはたいていの場合、デフォルトのままでも動くことが多い。ただし、その場合は、Postfixの動いている端末からしかメールを送れない。また、その場合でも、最低限下記の設定は行うべきである。
ドメイン名とホスト名の設定は、main.cfで設定されていない場合、自動的にLinuxの設定から取得されるが、main.cfでも念のため設定しておく。ドメイン名が違っていたりすると、送信されてきたメールがリレーメールとみなされたりして、拒否されてしまう。
myhostname = foo.example.com mydomain = example.com
FC5では、デフォルトで
inet_interfaces = localhost
となっていた。また、openSUSE 10をセットアップしたときも、セットアップした状態によっては、ローカルホストのみに限定されていた。これだと、外部から接続できないので
inet_interfaces = all
に書き換える。これは、接続できなくてもログに記録されないので、時々はまることがある。
存在しないユーザー宛のメールは550か450のエラーコードが返される。存在しないと単に拒否する場合は
unknown_local_recipient_reject_code = 550
postfixを導入したばかりで、設定に不安のある場合は、後で再度送信を試みてもらうように
unknown_local_recipient_reject_code = 450
とする。
メールの最大サイズはmessage_size_limitで設定する。単位はバイトである。下記の場合は、100MBに設定している。何も指定しない場合、デフォルト値は10240000バイト、すなわち10MBである。仮に、自分のサーバに大きな値を設定しても、相手がそれ以下の場合はメールは送信できない。また、あまりに巨大なファイルをメールで送ることは望ましくないので、現状の通信環境などを考慮すると10Mあたりが適当である。BIGLOBEなどでは1通あたり100MBまで許容しているので、100MBで設定しておいてもよいが、それでも、そのように大きなファイルを送信することは望ましいことではない。
message_size_limit = 102400000
delay_warning_timeを指定すると、指定時間以内に配送できない場合は送信者に通知が行く。デフォルトでは0が指定してあり、通知は行われない。下記の場合は12時間以内に遅れなかった場合に通知が行く。
delay_warning_time=12h
もし、メールクライアントがSMTP認証に対応しているなら、POP before SMTPよりもSMTP認証を使うことを勧める。
SMTP認証を有効にするには、smtp_sasl_auth_enableをyesにし、smtpd_recipient_restrictionsにpermit_sasl_authenticatedを加える。
smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
古いOutlookなどでは、標準に準拠していないため、下記の設定を行わないとエラーとなってしまう。
broken_sasl_auth_clients = yes
Unixユーザーアカウントのアカウント名およびパスワードでSMTP認証を行う場合、saslauthdが起動している必要がある。
まず、
/usr/lib/sasl2/smtpd.conf
64ビット版を使っている場合は
/usr/lib64/sasl2/smtpd.conf
を開いて、
pwcheck_method: saslauthd
となっているか、確認する。
そして、下記のコマンドでsaslauthdを起動する。
/etc/init.d/saslauthd start
パソコン起動時に自動的に起動するように
# chkconfig saslauthd on
としておくとよい。
以上で、Unixユーザーアカウントのアカウント名およびパスワードでSMTP認証できる。
main.cfでTLSの使用を有効にします。
smtpd_use_tls = yes
まずCAを作成する。
openSUSE 10.0の場合は、適当な作業用ディレクトリを作りそこで
# /usr/share/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)
Making CA certificate ...
Generating a 1024 bit RSA private key
..................................++++++
....++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Verify failure
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) []:Chiyodaku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:HogeCompany
Organizational Unit Name (eg, section) []:Huga
Common Name (eg, YOUR name) []:boo
Email Address []:foo@example.com
FC4の場合は
# /etc/pki/tls/misc/CA.pl -newca
すると、そのディレクトリにdomeCA以下のディレクトリが作成される。
次にサーバ証明書を作成する。
# openssl req -new -nodes -keyout mailkey.pem -out mailreq.pem -days 3650
Generating a 1024 bit RSA private key
.......++++++
....................++++++
writing new private key to 'mailkey.pem'
-----
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) []:Chiyodaku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:HogeCompany
Organizational Unit Name (eg, section) []:Physics
Common Name (eg, YOUR name) []:boo
Email Address []:foo@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
次にこの証明書に署名する。今回は自分で署名する。
# openssl ca -out mail_signed_cert.pem -infiles mailreq.pem
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
af:73:8a:75:84:e0:14:5c
Validity
Not Before: Mar 6 02:31:11 2006 GMT
Not After : Mar 6 02:31:11 2007 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = HogeCompany
organizationalUnitName = Huga
commonName = boo
emailAddress = foo@example.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
3D:2E:F3:49:A1:D0:39:A1:F8:CF:C1:85:8E:46:24:BE:0E:72:53:F0
X509v3 Authority Key Identifier:
keyid:AD:A9:89:7C:DC:39:D3:19:E8:2A:6D:07:D5:94:AD:CF:17:20:CF:76
DirName:/C=JP/ST=Tokyo/L=Chiyodaku/O=HogeCompany/OU=Huga/CN=boo/emailAddress=foo@example.com
serial:AF:73:8A:75:84:E0:14:5B
Certificate is to be certified until Mar 6 02:31:11 2007 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
そして作成されたファイルをここではpostfixのディレクトリにコピーする
# cp -p mailkey.pem /etc/postfix
# cp -p mail_signed_cert.pem /etc/postfix
# cp -p /demoCA/cacert.pem /etc/postfix
今コピーしたファイルをmain.cfの中で指定してやる。
smtpd_tls_key_file = /etc/postfix/mailkey.pem smtpd_tls_cert_file = /etc/postfix/mail_signed_cert.pem smtpd_tls_CAfile = /etc/postfix/cacert.pem
そして、master.cf内の
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
と
tlsmgr unix - - n 1000? 1 tlsmgr
の各行のコメントをはずす。
FC4の場合、コメントアウトされている行が #tlsmgr fifo - - n 300 1 tlsmgr であるが、このままコメントアウトをはずしても ckme postfix/tlsmgr[19400]: fatal: unsupported transport type: fifo のようなエラーが記録され、クライアントパソコンからも接続できない。どうしてなのかな? ちなみにFC5ではtlsmgr unix - - n 1000? 1 tlsmgrと最初からなっており、エラーは発生しない。 |
さらに、CA証明書をクライアントパソコンにインストールする。
まず、Linux上で
# openssl x509 -inform pem -in ./demoCA/cacert.pem -outform der -out ./demoCA/ca_example.der
できたca_example.derをクライアントパソコンに移し、インストールする。
FC4やFC5でdovecotをインストールすると
/etc/pki/dovecot/private/dovecot.pem /etc/pki/dovecot/certs/dovecot.pem
にTLSに必要なファイルがすでにできている。(最新のdovecotではディレクトリの場所が違うので注意)これらをmain.cf内で指定してやれば、上記のような作業は不要である。具体的には、main.cf内に
smtpd_use_tls = yes smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem
(FC4の場合は)
smtpd_use_tls = yes smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem smtpd_tls_cert_file = /etc/pki/dovecot/dovecot.pem
を追加し、master.cf内の
smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
と
tlsmgr unix - - n 1000? 1 tlsmgr
の各行のコメントをはずし、再起動すれば、postfixでTLSが使えるようになる。
Dovecotの設定は、postfixに比べるとはるかに簡単である。(ただし、仕様がまだ固まっていないようで、バージョンによって設定方法がかなり違うので注意。)
FC4、FC5の場合は
/etc/dovecot.conf
openSUSE 10.0の場合は、
/etc/dovecot/dovecot.conf
で全体の設定を行う。
dovecotは、Unixアカウントを使う場合、インストールした状態のデフォルトのままでほぼ動く。
ubuntu7.10では、プレーンテキスト認証はデフォルトではオフになっているので、メールクライアント側でSSLをオンにする必要がある。
openSUSE 10.0では、証明書が用意されていない場合、TLS関係で起動時にエラーが出るので、TLSをオフにする。
ssl_disable = yes
起動は
# /etc/init.d/dovecot start
停止は
# /etc/init.d/dovecot stop
コンピュータの起動時に自動起動するように設定するには、
# chkconfig dovecot on
DovecotではデフォルトでTLSが使用可能になっている。APOPを使用しても本文は暗号化されないので、メールソフトが対応しているならばTLSの使用を勧める。
TLSを使用可能にするには、下記の設定をする。
ssl_disable = no
FC4、FC5の場合は、証明書の正当性さえ気にしなければ、そのまま使える。openSUSE 10.0の場合は証明書がないので、postfixの項を参考にして、証明書を作成する必要がる。FC4の場合も証明書の検証でひっかからないようにするためには必要である。
ここではpostfixで作成した物をそのまま流用するとして、dovecot.confに下記のように書く。
ssl_key_file = /etc/postfix/mailkey.pem ssl_cert_file = /etc/postfix/mail_signed_cert.pem
下記のパラメータはバージョン0.99ではサポートされていないようだ。
#ssl_ca_file = /etc/postfix/cacert.pem #ssl_verify_client_cert = no
もし、TLSを使った接続以外を受け付けないようにしたいのなら
protocols = imap imaps pop3 pop3s
を
protocols = imaps pop3s
に書き換える。
メールクライアントソフトが、dovecotサーバに接続すると、最初に
+OK dovecot ready.
の様なメッセージが出るが、セキュリティを高めるために、これを消したい場合がある。これは、設定ファイルの中で、
login_greeting = POP3 ready.
のように書くことによって、変更することが出来る。
なおこれは、dovecotのバージョンが1以上で可。
クライアントソフトが対応していないなどの理由で、TLSが使用できない場合、次善の策として、APOPを使用する。
dovecot.confのauth default内のmechanismsにapopを加える。
auth default { mechanisms = plain apop .... }
なおこれは、dovecotのバージョンが1以上で可。
(現在、作成中)
(現在、作成中)
まず、postfixとLDAPを連携する方法であるが、psotfixがLDAPをサポートしているか下記のコマンドを打ち込んで調べる。
# postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
sdbm
static
tcp
unix
このように、出力の中にldapが含まれていれば、サポートされている。
(現在、作成中)
つぎに、DovecotとLDAPを連携する方法であるが、
DNSで複数のMX値を設定すると、優先度の高い(MX値の小さい)サーバがダウンした際に、別のサーバ(MX値の大きい)サーバに配送し、サーバが復旧した後に、そのサーバへ転送するようにすることができる。
これにより、サーバがダウンした際に、メールが配送不能エラーで相手に返っていくことを極力防ぐことができる。
MXの一番小さいサーバに関しては、MXが1しかない場合と同様に設定しておく。
次にバックアップサーバすなわちMXの大きなサーバであるが、リレーを設定すればとりあえず使える。
relay_domains = example.com
しかしながら、セキュリティを考慮すると、単にリレーするだけではだめである。
バックアップサーバも有効なユーザ名を把握している必要がある。理由は、スパム。すべてのユーザー名を受け入れてしまうと、存在しないユーザーが大量に存在するスパムを受け取った場合、大量のエラーメールが、送信者とされた人(たいていは偽物)のところへ行くことになる。そこで、次のように設定する。
次の行のコメントを外す。
relay_recipient_maps = hash:/etc/postfix/relay_recipients
/etc/postfix/relay_recipientsというファイル(テキストファイル)にリレーするユーザー名を書いていく。具体的には
foo@example.com dummy
dummyのところは何でも良いが、何かを書かなければならない。
そして、
# postmap /etc/postfix/relay_recipients
と打つ。これでpostfixを再起動する。
ログファイル内に次のような警告が出る場合は、anvil行がmaster.cfに書いていない可能性がある。
May 9 16:15:50 ckme postfix/smtpd[10707]: warning: connect to private/anvil: Connection refused May 9 16:15:50 ckme postfix/smtpd[10707]: warning: problem talking to server private/anvil: Connection refused May 9 16:15:51 ckme postfix/smtpd[10707]: warning: connect to private/anvil: Connection refused May 9 16:15:51 ckme postfix/smtpd[10707]: warning: problem talking to server private/anvil: Connection refused
master.cfに次の行を加える
anvil unix - - n - 1 anvil
ログファイル内の次のような警告は、qmgrに新しいものを使ってくれと警告している。
May 9 16:29:56 ckme postfix/nqmgr[10996]: warning: please update the /etc/postfix/master.cf file; the new queue manager May 9 16:29:56 ckme postfix/nqmgr[10996]: warning: (old name: nqmgr) has become the standard queue manager (new name: qmgr) May 9 16:29:56 ckme postfix/nqmgr[10996]: warning: support for the name old name (nqmgr) will be removed from Postfix
master.cfに書いてあるnqmgrをqmgrに書き換える。
qmgr fifo n - n 300 1 nqmgr
を
qmgr fifo n - n 300 1 qmgr
にする。
telnetを使って、直接コマンドをたたいてメールを送信する方法を示す。
赤い太字が入力するコマンド、白い太字部分はそれぞれ書き換えてください。以下はfoo@exapmle.comからboo@example.net宛てに"hogehoge"という内容のメールを送信する例。
$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix
HELO example.com
250 example.com
MAIL FROM:foo@example.com
250 Ok
RCPT TO:boo@example.net
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
hogehoge
.
250 Ok: queued as 76694DCCE
quit
221 Bye
Connection closed by foreign host.
postfixのデフォルトの設定では、localhostからしかメールを送ることができない。これを解除するには、ひとつはIPアドレスを指定する方法、もうひとつはSMTP認証などの認証を使う方法がある。
ここでは、sshでサーバに接続し、トンネルを作成して送信する方法を記述する。この方法では、経路はTLSを使ったときと同様すべて暗号化される。その一方で、sshを起動してトンネルを作成する必要があるのが欠点である。
sshがインストールしてあるとして、下記のようにトンネルを作成する。この場合は、ポート番号10000を指定したが、これは任意の番号を指定してよい。
> ssh -L 10000:localhost:22 user01@example.com
あとは、メールソフトの設定で、SMTPサーバをlocalhostに、ポート番号を10000に指定すると、メールを送信することができる。
受信も同様にしてできるが、通常、受信は外部からでも可能なので、暗号化が必要な場合以外は、sshでトンネルを作成する利点はあまりない。それよりもむしろTLSを使用したほうがよい。
本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6、FC7はFedora Core 7をopenSUSEはNovellのSUSE Linux OSSを表します。
ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。