16. メールサーバー(Postfix/Dovecot)のインストールと設定
ここでは、Oracle Linux 8でメールサーバーを設定します。
これができると、oluser@example.netのような、自分専用のメールアドレスが使用できます。この部分は参考書に書かれていなかったため、自分で調べて設定しました。苦労しましたよ・・・。
なお、この章での設定の段階で、メールサーバーを外部に公開するのは、絶対におすすめしません。自分で作ってみてわかったのですが、設置して試験運用を開始して、わずか1日の間に悪質なハッカーからの攻撃が始まっていました。そのため、後述する章でのfail2ban等のセキュリティ設定をしてから公開することを、強く推奨いたします。
ここでの設定例は、主にこのサイトなどを参考にさせていただきました。管理人様には、たいへん感謝しております。
なお、この設定では、外部とメールが正しく送受信できない事もあります。これは、インターネット契約をしているプロバイダによって異なります。
こちらのサイトに詳しく書かれていますので、そちらを参照してください。ちなみにそのサイトでは、サーバーマシンにtelnetをインストールするように、言っているように見えますが、これは避けた方が無難です。
万が一、自分のサーバーに不正侵入された場合、中継地点として悪用される恐れがあります。その場合、自分が攻撃者として認定されてしまいます。Windowsにtelnetは標準搭載されていますから、Windowsマシンで、コマンドプロンプトからtelnetコマンドを実行してください。
確認して、自分のプロバイダがOP25Bを設定していた場合は、こちらのサイトなどを確認して、サブミッションションポートの設定を追加してください。
メールサーバーは、PostfixとDovecotという、二つのサーバーで作ります。簡単に説明すると、Postfixがメールの送受信を担い、Dovecotが、サーバーからクライアントへメールを送ります。
また、メールの送受信にはSMTPという方法が使われるのですが、デフォルトでは、ユーザー認証をしなくてもメールが送れてしまいます。この設定ですと、悪意のある第三者が、スパムメールの送信元として、自分のサーバーを悪用する恐れがありますので、Postfixの設定で、Dovecotのユーザー認証機能を利用し、認証が通ったユーザーのみ、送信を許可するように設定します。そのため、PostfixとDovecotの設定が両方完了してから、動作確認を行います。
また、この設定の段階では、平文でのパスワード認証を許可しますので、外部インターネットからメールの送受信は絶対にしないでください。
それを行う場合は、やはり、後述する暗号化通信の設定をしてから許可してください。
以下のコマンドを入力し、POP3とSMTPの受信を許可します。
sudo firewall-cmd --add-service=pop3 --permanent
sudo firewall-cmd --add-service=smtp --permanent
sudo firewall-cmd --reload
以下のコマンドを入力し、PostfixとDovecotをインストールします。
sudo dnf -y install postfix
sudo dnf -y install dovecot
以下のコマンドを実行し、自動起動を有効にします。
sudo systemctl start postfix
sudo systemctl start dovecot
sudo systemctl enable postfix
sudo systemctl enable dovecot
まずはPostfixの設定です。
sudo vim /etc/postfix/main.cf
95行目あたりの以下の行を書き換え、自分サーバーのFQDN(完全な長さのマシン名)を書き加えます。
変更前
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
変更後
#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = mail.example.net
100行目あたりの以下の行を書き換え、自分のサーバーのドメイン名を書き加えます。
変更前
#mydomain = domain.tld
変更後
#mydomain = domain.tld
mydomain = example.net
120行目あたりの以下の行を書き換え、自サーバーからのメールの送信元として、@以下をexample.netにします。
変更前
#myorigin = $myhostname
#myorigin = $mydomain
変更後
#myorigin = $myhostname
#myorigin = $mydomain
myorigin = $mydomain
135行目あたりの以下の行を書き換え、外部からのメール受信を許可します。
変更前
#inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
inet_interfaces = localhost
変更後
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
なお、この設定は少々危険です。内部ネットワークのみからしかメールの送信をしないのであれば、以下の設定にしておく方がいいでしょう。
変更後
#inet_interfaces = all
#inet_interfaces = $myhostname
inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost
140行目あたりの以下の行を書き換え、IPv4プロトコルでの通信のみ許可します。これは、私の環境ではIPv6通信ができなかったためです。ここはこだわらなければ、そう気にすることはないと思います。
変更前
inet_protocols = all
変更後
#inet_protocols = all
inet_protocols = ipv4
185行目あたりの以下の行を書き換え、自ドメイン宛てのメールの受信を許可します。
変更前
mydestination = $myhostname, localhost.$mydomain, localhost
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain
変更後
#mydestination = $myhostname, localhost.$mydomain, localhost
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
# mail.$mydomain, www.$mydomain, ftp.$mydomain
290行目あたりの以下の行を書き換え、自分のネットワークを書き加えます。
変更前
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
変更後
#mynetworks = 168.100.189.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
mynetworks = 127.0.0.0/8, 192.168.0.0/24
440行目あたりの以下の行を書き換え、Maildir形式にします。これは、各人のホームディレクトリの Maildir/を、メールボックスにするものです。デフォルトでは一元管理になりますので、セキュリティのためにも、変更します。
変更前
#home_mailbox = Mailbox
#home_mailbox = Maildir/
変更後
#home_mailbox = Mailbox
home_mailbox = Maildir/
595行目あたりの以下の行を書き換えます。この設定は、外部からの問い合わせから、メールサーバーソフト名を隠蔽するものです。セキュリティの都合上、あまりサーバーの情報は渡すべきではありません。
変更前
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
変更後
#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
smtpd_banner = $myhostname ESMTP unknown
最終行に以下を書き加えます。これは、メールサイズとメールボックスサイズを制限するものです。数字はバイトで指定します。ここでは、メールサイズ10M, メールボックスサイズ1Gにしています。よって、10M = 1024 x 1024 x 10バイト = 10,485,760バイト、1G = 1024 x1024 x 1024 = 1,073,741,824バイトとなります。
# mail size limit 10M
message_size_limit = 10485760
# mailbox size limt 1G
mailbox_size_limit = 1073741824
最終行に以下を書き加えます。これは、SMTPの認証にDovecotを使い、認証の通らなかった人のメール送信を拒否するものです。セキュリティの意味でも、絶対に設定してください。
# SMTP-Auth setting
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unknown_hostname,
permit_auth_destination,
permit_sasl_authenticated,
reject
特に最後のsmtpd_recipient_restrictionsの値は順番も大切になってきます。この例ですと、LAN内部のマシンは優先的に許可、次にマシン名(ホスト名)が不正なものは拒否してから、認証が通ったユーザーのみを許可することになっています。この順番を変えてしまいますと、先に認証をすることになり、後からホスト名が不正などで拒否したとしても、パスワードそのものは突破される危険性があります。ですので、正しいホスト名で再び接続されたら突破されることになります。
また、この設定ですと、外部からもログインすることを許可するようになっていす。ですので、内部ネットワークのみからしかメールを送受信しない運用をするのであれば、最後のpermit_sasl_authenticatedの設定部分の行を削除してください。
最終行へ以下を書き加えます。
# sonnzai sinai user ate mail wo unknown_user he haisou
local_recipient_maps =
luser_relay = unknown_user@localhost
これは、存在しないユーザー名でメールが送られてきた場合、unknown_userのメールとして転送するものです。そして、後述するエイリアスの機能を使い、それらのメールを破棄します。この設定をしていないと、スパムメールで存在しないユーザーにメールが送られてきた場合、未到達メッセージを返信します。
返信先のメールアドレスが適切なものであればよいのですが、メールの送信元のアドレスは、とても簡単に偽装できてしまいます。よって、未達メールを送信しようとする先も未達になり、ずっと未達通知が行きかう事態になりかねません。
正しいユーザーからの未達メールも返信しなくなりますが、現在のセキュリティ事情では、致し方ありません。重要なeメールは、到着確認を行う習慣をつけてください。
最終行に以下を追加します。
# Security Settings
smtpd_helo_restrictions = reject_unknown_hostname
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_data_restrictions = reject_unauth_pipelining
この設定の意味は、上から順に、知らないホスト名のメールシステムは拒否、存在しないドメイン名からのメールは拒否、早口すぎるメールシステムは拒否、となります。
最終行に以下を追加します。
#naibu user no zyouhou wo innpei
disable_vrfy_command = yes
psotfixには内部ユーザーの情報を取得するコマンドがあり、それを無効にする設定になります。悪用されないためにも、ぜひとも追加しておいてください。
ここまでで、main.cfの変更作業は終わりです。保存してvimを終了してください。
次に、メールの転送設定を行います。
sudo vim /etc/aliases
最終行に、以下の2行を書き加えます。
unknown_user: /dev/null
root: oluser@example.net
:の前に書かれているのが転送元、その後ろが転送先です。上の行は、unkown_user宛てのメールを、/dev/nullという、ちょっと特殊なファイルへ転送するものです。
詳しくは述べませんが、これはデバイスファイルと呼ばれるものの一種で、ここに送られたデータは、すべて破棄されます。
下の行は、rootユーザー宛てのメールをoluser@example.netに転送するものです。rootにはシステムメッセージや警告のメールが届くのですが、LAN内に限定して認証するように運用するとはいえ、rootユーザーでメールクライアントソフトから認証するのは、非常に危険です。
そもそも、この設定ではrootログインはできないはずですが、それでも、設定しておくに越したことはありません。
この例ではoluser@example.netに転送していますが、正しいメールアドレスであれば、別に何でも構いません。
次のコマンドを入力し、変更を反映させます。
sudo newaliases
以上でpostfixの設定は終わりです。続けて、Dovecotの設定を行います。
まずは、dovecot.confの設定を行います
sudo vim /etc/dovecot/dovecot.conf
30行目あたりを、以下のように変更します。これは、IPv4,IPv6両方の通信を受け取るというものですが、私の環境では、どうせIPv6アドレスはルーターではじかれるので、そのまま設定してしまいました。手抜きですね。すいません。
変更前
#listen = *, ::
変更後
#listen = *, ::
listen = *, ::
保存してvimを終了してください。
続けて10-auth.confの設定を行います。
sudo vim /etc/dovecot/conf.d/10-auth.conf
10行目あたりの以下の行を変更します。これは、プレーンテキスト認証(平文でのパスワード認証)を許可するものです。ですので、LAN内部に限って運用する必要が生じます。外部から認証してしまうと、パスワードが平文で流れてしまいます。よって、後述する暗号化認証が実装できたら、忘れずに書き換えてください。
変更前
#disable_plaintext_auth = yes
変更後
#disable_plaintext_auth = yes
disable_plaintext_auth = no
100行目あたりが、以下のようになっていることを確認します。これも、平文でのログインを許可するものです。暗号化対応時に変更しますので、場所を覚えておいてください。
# Space separated list of wanted authentication mechanisms:
# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
# gss-spnego
# NOTE: See also disable_plaintext_auth setting.
auth_mechanisms = plain
保存してvimを終了してください。
続けて10-mail.confを編集します。
sudo vim /etc/dovecot/conf.d/10-mail.conf
30行目あたりを、以下のように変更します。これは、Postfixに合わせて、メールボックスを各個人のMaildirで管理するものです。
変更前
#mail_location =
変更後
#mail_location =
mail_location = maildir:~/Maildir
保存してvimを終了してください。
続けて10-master.confを編集します。
sudo vim /etc/dovecot/conf.d/10-master.conf
105行目あたりを、以下のように書き換えます。これは、Postfixでの認証の設定です。
変更前
# Postfix smtp-auth
#unix_listener /var/spool/postfix/private/auth {
#mode = 0666
#}
変更後
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
保存してvimを終了してください。
続けて10-ssl.confを編集します。
sudo vim /etc/dovecot/conf.d/10-ssl.conf
8行目あたりを、以下のように書き換えます。これも暗号化通信を拒否する設定ですから、実装できたら忘れずに書き換えてください。
変更前
#ssl = required
変更後
#ssl = required
ssl = no
保存してvimを終了してください。
以上で設定は終了です。起動確認に移ります。
sudo systemctl restart dovecot
sudo systemctl restart postfix
sudo systemctl status dovecot
sudo systemctl status postfix
私の環境での話になるのですが、実はこの時点では、構文エラーがあっても表示されませんでした。途中の、認証をdovecotと指定する場所を、誤ってdovcotと書いていたのですが、エラーになりませんでした。
そのため、メールクライアントの設定時、認証が通りませんでした。どこが悪かったのか分からず、しばらく七転八倒しましたが、メールクライアントソフトで認証失敗後に、systemctlでステータスを表示したときに、やっとエラーが表示されていました。
ですので、メールクライアントソフトでテストを行った時に、認証エラーや、送信不能などになった場合は、あわてず騒がず、以下の2つのコマンドを実行し、ステータスを確認してください。あるいは、/var/log/maillogのメールログを確認してみてください。
sudo systemctl status dovecot
sudo systemctl status postfix
なお、これは後で知ったのですが、以下のコマンドで、設定のエラーチェックができるようです。再起動する前に実行することを、おすすめします。
sudo postfix check
設定を書き換えたら、以下のコマンドでリスタートするのも、忘れないようにしましょう。
sudo systemctl restart dovecot
sudo systemctl restart postfix
なお、メールクライアントの設定と、それを用いた導通テストは、次の章を参照してください。