RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

Postfixでメールサーバ構築

はじめに

皆様こんにちは。
インフラ開発課でインフラエンジニアとして勤務しておりますryskwです。
ラクスではメールを主に扱うサービスが多くあります。
そのため、メールに関する知識は業務に欠かせないものとなっています。

今回は、そんなメールに関するソフトウェアとして有名なPostfix(ポストフィックス)を取り上げたいと思います。
本記事を読むことで、Postfixを使用したメールサーバの基本的な構築をしたいという方のお役に立てれば幸いです。

目次

Postfixとは

Postfixフリーソフトウェアのメール転送エージェント(MTA)であり、LinuxなどのUNIX系システムで実行されます。
UNIXで古くから使用されてきたSendmailに代わるものとして開発されたようです。
PostfixのホームページではSendmailライクに見えますが、より安全、高速、設定しやすいことなどをメリットとして挙げています。

※メール転送エージェントとは、メールの配送(送信)を行うメールサーバ
 (SMTPサーバと言ったりもしますね)の中で、文字通りメールの転送を担うプログラムです。
 受信したメールを相手方に送信する(振り分ける)メールサーバの中でも中心的な役割を持っています。

また、メールサーバと言うと送受信できるようなイメージを持ちますが、実際にはメール受信には受信用のサーバが必要となります(POPサーバやIMAPサーバ)。
Postfixは受信サーバとしての役割はないため、受信用サーバを構築したい場合は、別途ソフトウェアを併せてインストールする必要があります。

Postfixのインストール

それでは、Postfixを利用したメールサーバの構築を実際に行ってみましょう。
PostfixUNIX系のOSで動作するため、本記事ではLinux OSの中からAlma Linuxを使用してインストールしていきます。
ホスト名はsmtp.test.hdomainとしています。

[root@smtp ~]# cat /etc/redhat-release
AlmaLinux release 8.5 (Arctic Sphynx)
[root@smtp ~]# uname -a
Linux smtp.test.hdomain 4.18.0-348.el8.x86_64 #1 SMP Tue Nov 9 06:28:28 EST 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@smtp ~]#

では、Postfixをインストールしていきましょう。
AlmaLinux 8.5 では、標準でバージョン3.5.8-4Postfixがインストールされるようです。
yum installコマンドでPostfixのインストールを行います。

[root@smtp ~]# yum install postfix
メタデータの期限切れの最終確認: 0:02:01 時間前の 20220808233639秒 に実施しました。
依存関係が解決しました。
=============================================================================================================================================================================================================================================
 パッケージ                                              アーキテクチャー                                       バージョン                                                      リポジトリー                                           サイズ
=============================================================================================================================================================================================================================================
インストール:
 postfix                                                 x86_64                                                 2:3.5.8-4.el8                                                   baseos                                                 1.5 M
依存関係のインストール:
 libicu                                                  x86_64                                                 60.3-2.el8_1                                                    baseos                                                 8.8 M

トランザクションの概要
=============================================================================================================================================================================================================================================
インストール  2 パッケージ

ダウンロードサイズの合計: 10 M
インストール後のサイズ: 37 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/2): postfix-3.5.8-4.el8.x86_64.rpm                                                                                                                                                                        9.4 MB/s | 1.5 MB     00:00
(2/2): libicu-60.3-2.el8_1.x86_64.rpm                                                                                                                                                                         16 MB/s | 8.8 MB     00:00
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                                                                                         6.8 MB/s |  10 MB     00:01
AlmaLinux 8 - BaseOS                                                                                                                                                                                         2.8 MB/s | 3.4 kB     00:00
GPG 鍵 0xC21AD6EA をインポート中:
 Userid     : "AlmaLinux <packager@almalinux.org>"
 Fingerprint: E53C F5EF 91CE B0AD 1812 ECB8 51D6 647E C21A D6EA
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux
これでよろしいですか? [y/N]: y
鍵のインポートに成功しました
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                                                                                                     1/1
  インストール中   : libicu-60.3-2.el8_1.x86_64                                                                                                                                                                                          1/2
  scriptletの実行中: libicu-60.3-2.el8_1.x86_64                                                                                                                                                                                          1/2
  scriptletの実行中: postfix-2:3.5.8-4.el8.x86_64                                                                                                                                                                                        2/2
  インストール中   : postfix-2:3.5.8-4.el8.x86_64                                                                                                                                                                                        2/2
  scriptletの実行中: postfix-2:3.5.8-4.el8.x86_64                                                                                                                                                                                        2/2
  検証             : libicu-60.3-2.el8_1.x86_64                                                                                                                                                                                          1/2
  検証             : postfix-2:3.5.8-4.el8.x86_64                                                                                                                                                                                        2/2

インストール済み:
  libicu-60.3-2.el8_1.x86_64                                                                                           postfix-2:3.5.8-4.el8.x86_64

完了しました!
[root@smtp ~]#

これで無事インストールが完了しました!

Postfixの設定

続いてPostfixの基本的な設定を行っていきます。
Postfixの基本の設定を行うには、/etc/postfix/main.cfという設定ファイルがあるので、そのファイルで必要となるパラメータを定義していきます。
ここでは、検証環境を構築する上で必要最低限となる設定のみ取り扱っています。
もし必要があればPostfixのホームページからより細かな設定について記載がありますので、そちらもどうぞご確認ください。

設定ファイルのバックアップ

では、Postfixの設定ファイルを修正していきましょう。
まずは、元の設定ファイルのバックアップを取得しておきましょう。

[root@smtp ~]# cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org
[root@smtp ~]# ls /etc/postfix/main.cf.org
/etc/postfix/main.cf.org
[root@smtp ~]#

設定ファイルを修正していきます。

[root@smtp ~]# vi /etc/postfix/main.cf

Postfixで使用するドメイン名の指定

まずはmyhostnameという設定を探しましょう。
ドキュメントにはPostfixをインストールしたマシンの完全修飾ドメイン名(いわゆるFQDN)を指定する、とあります。
94~95行目に設定が記載されていると思いますので、その下に新たにPostfixをインストールしたマシンのホスト名を追記しましょう。myhostnameを設定することでメールアドレスの@マーク以降に入るドメインを指定できます。

#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
myhostname = smtp.test.hdomain    → 追記した設定

あるいは、mydomainという設定でドメイン名を設定することもできます。
mydomainにドメイン名を指定しておくことで、main.cf内でmydomainが変数のように扱われ、それを元にmyhostnameでFQDNを生成することができます。
今回構築している検証環境を例に挙げると

となるため、mydomainにはtest.hdomainを記載します。
恐らく、デフォルトの設定ファイルでは102行目あたりに記載があるはずです。

#mydomain = domain.tld
mydomain = test.hdomain    → 追記した設定

次にメールの配送先の指定を行います。
mydestinationでは別のサーバではなく、Postfixをインストールしているマシンに配信する際のドメインを指定します。
サーバでは大抵rootユーザ宛などシステムメールが配信されていたりするため、ローカルで配信されるメールの配送先として自身のホスト名を指定しておきます。
構築するサーバがドメイン全体のメールサーバである場合は「mydomainもリストする必要がある」、とドキュメントに記載されておりますので、ここは後々のことも考えてデフォルトで指定されている設定はコメントアウトし、mydomainも指定されているものをアンコメントして有効化しておきましょう。

#mydestination = $myhostname, localhost.$mydomain, localhost    → デフォルトではここが有効になっているためコメントアウト
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain    → mydomainがリストされているこの行を有効化
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#       mail.$mydomain, www.$mydomain, ftp.$mydomain

Postfixで使用するインターフェースの指定

続いて、Postfixがメールを受信する際のインターフェースを設定しましょう。
デフォルトではローカルホストのみとなっているため、外部からのメールを受け取れないようになっています。
inet_interfacesの設定でローカルホストだけでなくすべてのネットワークインターフェース(このサーバが持つIPアドレス)で受信が可能となるように、以下のように設定を変更しておきしょう。

※より安心な設計として、main.cfはデフォルトの設定のままにしておき、
 master.cfという設定ファイルで明示的にIPアドレスを指定する、という方法もあります。
 しかしながら、今回はmain.cfを主に修正しているのでこの方法で進めます。

inet_interfaces = all    → この行を有効化
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost    → デフォルトではここが有効になっているためコメントアウト

Postfixで拒否したいメールの設定

安心なメールサーバ構築のためには、意図しないドメインへメールを送らないように設定しなればなりません。
もしも他人が使用できるグローバルな環境で、どのドメインにも送れてしまうようなメールサーバを構築してしまった場合、スパムメールを送るリレーサーバとして悪意あるユーザから悪用されてしまうことが考えられます。

そこで、Postfixの設定の中に、これまで設定してきたドメインやホスト名に合致しない宛先にメールを送ろうとした場合に拒否する設定がありますので、そちらも設定しておきます。
local_recipient_mapsという設定に有効な受信者としてのドメインをリストしておくことで、受信者チェックを行いmydestinationなどで設定したドメインに一致しないローカルユーザへのメールを拒否することができます。
デフォルト設定から触らなくとも問題はないですが、わかりやすいので明示的にアンコメントして有効化しておきましょう。

local_recipient_maps = unix:passwd.byname $alias_maps    → この行を有効化
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =

Postfixのバージョン非表示設定

さて、Postfixを使用してメールサーバを構築する準備をしてきましたが、あらゆるソフトウェアには将来的に脆弱性が生じる可能性があります。
どのソフトウェアのどのバージョンを使用してサーバが構築されているか、ということが知られてしまうと、そのソフトウェアやバージョンに脆弱性があった場合、外部公開しているサーバの脆弱性を攻撃されてしまうことで何らかの影響が生じてしまう可能性があります。

そのため、基本的には使用しているソフトウェアは外部から接続された場合にバージョンがわからないようにしておくことがベストです。
どのバージョンのPostfixを使用しているかが外部にわからないように、Postfixへの接続時にバージョン情報が表示されないよう、以下を設定しておきましょう。

#smtpd_banner = $myhostname ESMTP $mail_name
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
smtpd_banner = $myhostname ESMTP $mail_name unknown    → 追記した設定

また、Postfixを使用してメールの送信した記録をログファイルで確認したい時があると思いますので、最後にログの設定をしておきます。
main.cfの末尾に、以下のように追記することで、/var/log/maillogにログが残るようにします。

syslog_facility = mail

以上で、Postfixの基本的な設定は完了です。
少し長かったでしょうか。お疲れ様でした。

最後にPostfixを再起動して設定完了です。

[root@smtp ~]# systemctl restart postfix
[root@smtp ~]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-08-10 16:11:24 JST; 7s ago
  Process: 15565 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 15563 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 15559 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
  Process: 15557 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=255)
 Main PID: 15634 (master)
    Tasks: 3 (limit: 10645)
   Memory: 5.1M
   CGroup: /system.slice/postfix.service
           tq15634 /usr/libexec/postfix/master -w
           tq15635 pickup -l -t unix -u
           mq15636 qmgr -l -t unix -u

 810 16:11:23 smtp.test.hdomain systemd[1]: Starting Postfix Mail Transport Agent...
 810 16:11:23 smtp.test.hdomain restorecon[15557]: /usr/sbin/restorecon: lstat(/var/spool/postfix/pid/master.pid) failed: No such file or directory
 810 16:11:24 smtp.test.hdomain postfix/master[15634]: daemon started -- version 3.5.8, configuration /etc/postfix
 810 16:11:24 smtp.test.hdomain systemd[1]: Started Postfix Mail Transport Agent.
[root@smtp ~]#

問題なく起動していればOKです。

Postfixでメール送信

それでは、基本的な設定が終わったのでメールの送信をしてみましょう!
今回は、構築したサーバとは別にメールを受信できるサーバを用意しました。
また、「ryskw」というユーザを用意したので、そのユーザ宛にメールを送信してみます。

以下のようにsendmailコマンドでメールを送信してみましょう。

[root@smtp ~]# sendmail ryskw@[送信先のホスト名].hdomain    → 送信先のメールアドレス。[ユーザ名]@[送信先のサーバ]となる
From:ryskw@smtp.test.hdomain    → 送信元のメールアドレス
To:ryskw@[送信先のホスト名].hdomain    → 送信先のメールアドレス
Subject:Postfix test    → メールの件名

test    → メールの本文

.    → 本文を書き終えたら「.」を打ってEnter
[root@smtp ~]#

これでメールが送信されたはずです。
Postfixの設定でメールの送信ログが/var/log/maillogに出力されるように設定したので、ログを確認してみましょう。

[root@smtp ~]# cat /var/log/maillog

------------以下のようなログがあればok------------

Aug 10 17:45:03 smtp postfix/pickup[15635]: 1CEAB1002B7E: uid=0 from=<root>
Aug 10 17:45:03 smtp postfix/cleanup[15677]: 1CEAB1002B7E: message-id=<20220810084503.1CEAB1002B7E@smtp.test.hdomain>
Aug 10 17:45:03 smtp postfix/qmgr[15636]: 1CEAB1002B7E: from=<root@smtp.test.hdomain>, size=317, nrcpt=1 (queue active)
Aug 10 17:45:03 smtp postfix/smtp[15679]: 1CEAB1002B7E: to=<ryskw@xxxxxxxxxxxx.hdomain>, relay=xxxxxxxxxxxx.hdomain[172.20.100.114]:25, delay=91, delays=90/0.03/0.21/0.17, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 71384C0045)
Aug 10 17:45:03 smtp postfix/qmgr[15636]: 1CEAB1002B7E: removed

無事送信できていることが確認できました!
ちなみに、メールを受信したサーバ側で確認すると、以下のようにメールが表示されました。

Return-Path: <root@smtp.test.hdomain>
X-Original-To: ryskw@xxxxxxxxxxxx.hdomain
Delivered-To: ryskw@xxxxxxxxxxxx.hdomain
Received: from smtp.test.hdomain (unknown [172.20.100.104])
        (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits))
        (No client certificate requested)
        by xxxxxxxxxxxx.hdomain (Postfix) with ESMTPS id 71384C0045
        for <ryskw@xxxxxxxxxxxx.hdomain>; Wed, 10 Aug 2022 17:45:06 +0900 (JST)
Received: by smtp.test.hdomain (Postfix, from userid 0)
        id 1CEAB1002B7E; Wed, 10 Aug 2022 17:45:03 +0900 (JST)
From:ryskw@smtp.test.hdomain
To:ryskw@xxxxxxxxxxxx.hdomain
Subject:Postfix test
Message-Id: <20220810084503.1CEAB1002B7E@smtp.test.hdomain>
Date: Wed, 10 Aug 2022 17:43:32 +0900 (JST)

test

※送り先のサーバについては諸事情あってxxxxxxxxxxxx.hdomainとホスト名を伏せさせていただきました。

ちゃんと送信元サーバで入力した内容が送られてきています。
これで、Postfixをインストールした環境でメールが送信できることが確認できました!

おまけ

FromアドレスとエンベロープFrom

sendmailコマンドでメールを送信した際に指定したFromアドレスがryskw@smtp.test.hdomainにも関わらず、maillog内や受信したメールのヘッダー内にあるReturn-Pathにはroot@smtp.test.hdomainとあります。
これはPostfixを利用してメールを送信したとき、送信元のサーバではrootユーザで作業したからなのですが、メール内のFromアドレスにはryskw@smtp.test.hdomainと、コマンドで指定したものが入力されています。

メールに表示されているFromアドレス(ヘッダFrom)と異なっていますが、こちらはエンベロープFromと呼ばれるアドレスとの違いになります。
この違いはしばしば、封筒に書かれた差出人や住所の情報(エンベロープFrom)と、封筒内の便箋に書かれた差出人の名前の違いに例えられます。
詳細は割愛しますが、メール送信時にチェックされるのはこのエンベロープFromのみであり、Fromアドレスのほうはチェックされません。
にも関わらず、メールを受信したときに送信元として表示されるのはこのFromアドレスの方なので、実際の送り主とは異なる人がなりすますこともできてしまう、という問題点があります。
そのため、メールを受信した場合にはなりすましに注意しましょう、ということがよく言われます。

メール受信にはDovecot

ここまでPostfixを使用してメールを送信する環境を構築してきましたが、メールを受信する環境については別のサーバを構築していました。
また、そちらのサーバではメール送信用のPostfixと併せて、メールを受信するための機能を持つDovecot(ダヴコット)というソフトウェアをインストールして構築しました。
機会があればDovecotのインストールについてもいずれ記事を作ることができれば、と思います。

最後に

いかがだったでしょうか。
Postfixを使用すれば簡単にメールサーバができるんじゃないかと思います。
認証などの機能についても導入することができるため、より安全なメールサーバを自力で構築することも可能ですので、是非お試しください。
それでは、ご覧いただきありがとうございました。

参考

Postfix公式ホームページ


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.