はじめに
皆様こんにちは。
インフラ開発課でインフラエンジニアとして勤務しておりますryskwです。
ラクスではメールを主に扱うサービスが多くあります。
そのため、メールに関する知識は業務に欠かせないものとなっています。
今回は、そんなメールに関するソフトウェアとして有名なPostfix(ポストフィックス)を取り上げたいと思います。
本記事を読むことで、Postfixを使用したメールサーバの基本的な構築をしたいという方のお役に立てれば幸いです。
目次
Postfixとは
Postfixはフリーソフトウェアのメール転送エージェント(MTA)であり、LinuxなどのUNIX系システムで実行されます。
UNIXで古くから使用されてきたSendmailに代わるものとして開発されたようです。
PostfixのホームページではSendmailライクに見えますが、より安全、高速、設定しやすいことなどをメリットとして挙げています。
※メール転送エージェントとは、メールの配送(送信)を行うメールサーバ
(SMTPサーバと言ったりもしますね)の中で、文字通りメールの転送を担うプログラムです。
受信したメールを相手方に送信する(振り分ける)メールサーバの中でも中心的な役割を持っています。
また、メールサーバと言うと送受信できるようなイメージを持ちますが、実際にはメール受信には受信用のサーバが必要となります(POPサーバやIMAPサーバ)。
Postfixは受信サーバとしての役割はないため、受信用サーバを構築したい場合は、別途ソフトウェアを併せてインストールする必要があります。
Postfixのインストール
それでは、Postfixを利用したメールサーバの構築を実際に行ってみましょう。
PostfixはUNIX系の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-4
のPostfixがインストールされるようです。
yum install
コマンドでPostfixのインストールを行います。
[root@smtp ~]# yum install postfix メタデータの期限切れの最終確認: 0:02:01 時間前の 2022年08月08日 23時36分39秒 に実施しました。 依存関係が解決しました。 ============================================================================================================================================================================================================================================= パッケージ アーキテクチャー バージョン リポジトリー サイズ ============================================================================================================================================================================================================================================= インストール: 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 8月 10 16:11:23 smtp.test.hdomain systemd[1]: Starting Postfix Mail Transport Agent... 8月 10 16:11:23 smtp.test.hdomain restorecon[15557]: /usr/sbin/restorecon: lstat(/var/spool/postfix/pid/master.pid) failed: No such file or directory 8月 10 16:11:24 smtp.test.hdomain postfix/master[15634]: daemon started -- version 3.5.8, configuration /etc/postfix 8月 10 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を使用すれば簡単にメールサーバができるんじゃないかと思います。
認証などの機能についても導入することができるため、より安全なメールサーバを自力で構築することも可能ですので、是非お試しください。
それでは、ご覧いただきありがとうございました。
参考
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com