Ubuntu18.04に送信専用SMTPサーバーとしてPostfixをインストールして設定する方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
Postfixはメール転送エージェント(MTA)であり、メールの送受信に使用されるアプリケーションです。 ローカルアプリケーションのみで電子メールを送信するために使用できるように構成できます。 これは、アプリから定期的にメール通知を送信する必要がある場合や、サードパーティのメールサービスプロバイダーが許可しない大量のアウトバウンドトラフィックがある場合に役立ちます。 また、必要な機能を維持しながら、本格的なSMTPサーバーを実行するよりも軽量な代替手段です。
このチュートリアルでは、Postfixを送信専用SMTPサーバーとしてインストールして設定します。 また、ドメインのLet’s Encryptに無料のTLS証明書を要求し、それらを使用して送信メールを暗号化します。
前提条件
- Ubuntu 18.04を使用した初期サーバーセットアップでセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーの作成を含む)。
- 完全に登録されたドメイン名。 このチュートリアルでは、全体を通して
your_domain
を使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。 - サーバーのパブリックIPアドレスを指す
your_domain
を含むDNSレコード。 それらを追加する方法の詳細については、この紹介に従ってDigitalOceanDNSを参照できます。
注:サーバーのホスト名とドロップレットの名前はyour_domain
と一致する必要があります。これは、DigitalOceanがドロップレットのIPアドレスのPTRレコードをその名前に従って自動的に設定するためです。
コマンドプロンプトでhostname
と入力すると、サーバーのホスト名を確認できます。 出力は、ドロップレットの作成時に付けた名前と一致する必要があります。
ステップ1—Postfixをインストールする
このステップでは、Postfixをインストールします。 最速の方法は、mailutils
パッケージをインストールすることです。このパッケージには、メール送信のテストに使用するいくつかの補足プログラムがPostfixにバンドルされています。
まず、パッケージデータベースを更新します。
- sudo apt update
次に、次のコマンドを実行してPostfixをインストールします。
- sudo apt install mailutils
インストールプロセスの終わり近くに、Postfix設定ウィンドウが表示されます。
デフォルトのオプションはInternet Site
です。 これがユースケースに推奨されるオプションなので、TAB
を押してから、ENTER
を押します。 説明テキストしか表示されない場合は、TAB
を押してOK
を選択し、次にENTER
を選択します。
自動的に表示されない場合は、次のコマンドを実行して起動します。
- sudo dpkg-reconfigure postfix
その後、システムメール名に関する別の設定プロンプトが表示されます。
システムメール名は、サーバーの作成時にサーバーに割り当てた名前と同じである必要があります。 終了したら、TAB
を押し、次にENTER
を押します。
これでPostfixがインストールされ、構成を開始する準備が整いました。
ステップ2—Postfixを設定する
このステップでは、Postfixが実行されているサーバー、つまりlocalhost
からのみメールを送受信するようにPostfixを設定します。
そのためには、サーバーが内部通信に使用する仮想ネットワークインターフェイスであるループバックインターフェイスでのみリッスンするようにPostfixを構成する必要があります。 変更を加えるには、etc/postfix
の下に保存されているmain.cf
というメインのPostfix設定ファイルを編集する必要があります。
お気に入りのテキストエディタを使用して編集するために開きます。
- sudo nano /etc/postfix/main.cf
次の行を見つけます。
. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
. . .
inet_interfaces
設定の値をloopback-only
に設定します。
. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
. . .
変更する必要があるもう1つのディレクティブは、mydestination
です。これは、local_transport
メール配信トランスポートを介して配信されるドメインのリストを指定するために使用されます。 デフォルトでは、値は次のようになります。
. . .
mydestination = $myhostname, your_domain, localhost.com, , localhost
. . .
次のように行を変更します。
. . .
mydestination = localhost.$mydomain, localhost, $myhostname
. . .
ドメインが実際にはサブドメインであり、メールメッセージをメインドメインから送信されたように見せたい場合は、main.cf
の末尾に次の行を追加できます。
...
masquerade_domains = your_main_domain
オプションのmasquerade_domains
設定は、サブドメイン部分が電子メールアドレスで削除されるドメインを指定します。
完了したら、ファイルを保存して閉じます。
注: 1つのサーバーで複数のドメインをホストしている場合は、mydestination
ディレクティブを使用して他のドメインをPostfixに渡すこともできます。
次に、次のコマンドを実行してPostfixを再起動します。
- sudo systemctl restart postfix
サーバーからの電子メールのみを送信するようにPostfixを構成しました。 次に、サンプルメッセージを電子メールアドレスに送信してテストします。
ステップ3—SMTPサーバーをテストする
このステップでは、最初のステップでインストールしたmailutils
パッケージの一部であるmail
コマンドを使用して、Postfixが外部の電子メールアカウントに電子メールを送信できるかどうかをテストします。
テストメールを送信するには、次のコマンドを実行します。
- echo "This is the body of the email" | mail -s "This is the subject line" your_email_address
メールの本文と件名をお好みに合わせて変更できます。 your_email_address
をアクセス可能な有効なメールアドレスに置き換えることを忘れないでください。
次に、このメッセージの送信先の電子メールアドレスを確認します。 受信トレイにメッセージが表示されます。 そこにない場合は、スパムフォルダを確認してください。 この時点で、送信するすべての電子メールは暗号化されていないため、サービスプロバイダーはスパムの可能性が高いと考えています。 後で、手順5で暗号化を設定します。
mail
コマンドからエラーが発生した場合、または長期間メッセージを受信しなかった場合は、編集したPostfix設定が有効であり、サーバーの名前とホスト名がドメインに設定されていることを確認してください。
この構成では、送信するテストメールのFrom
フィールドのアドレスは、your_user_name@your_domain
の形式になります。ここで、your_user_name
はサーバーユーザーのユーザー名です。コマンドをとして実行しました。
これで、サーバーから電子メールが送信され、正常に受信されたことを確認できました。 次のステップでは、root
のメール転送を設定します。
ステップ4—システムメールの転送
このステップでは、ユーザーroot
の電子メール転送を設定して、サーバー上でユーザーに送信されたシステム生成メッセージが外部の電子メールアドレスに転送されるようにします。
/etc/aliases
ファイルには、電子メール受信者の代替名のリストが含まれています。 編集のために開きます:
- sudo nano /etc/aliases
デフォルトの状態では、次のようになります。
# See man 5 aliases for format
postmaster: root
存在する唯一のディレクティブは、システムで生成された電子メールがroot
に送信されることを指定します。
ファイルの最後に次の行を追加します。
...
root: your_email_address
この行では、root
に送信された電子メールが最終的に電子メールアドレスに転送されるように指定します。 your_email_address
を個人のメールアドレスに置き換えることを忘れないでください。 完了したら、ファイルを保存して閉じます。
変更を有効にするには、次のコマンドを実行します。
- sudo newaliases
newaliases
を実行すると、mail
コマンドが使用するエイリアスのデータベースが構築されます。このデータベースは、編集したばかりの構成ファイルから取得されます。
root
へのメール送信が、次のコマンドを実行して機能することをテストします。
- echo "This is the body of the email" | mail -s "This is the subject line" root
あなたはあなたのメールアドレスでメールを受け取るはずです。 そこにない場合は、スパムフォルダを確認してください。
このステップでは、システムで生成されたメッセージを自分の電子メールアドレスに転送するように設定しました。 ここで、メッセージの暗号化を有効にして、サーバーが送信するすべての電子メールが転送中の改ざんの影響を受けず、より正当であると見なされるようにします。
ステップ5—SMTP暗号化を有効にする
ここで、ドメインのLet’s Encryptから無料のTLS証明書を要求し(Certbotを使用)、メッセージの送信時にそれを使用するようにPostfixを構成することにより、SMTP暗号化を有効にします。
UbuntuのデフォルトのパッケージリポジトリにはCertbotが含まれていますが、古くなっている可能性があります。 代わりに、次のコマンドを実行して公式リポジトリを追加します。
- sudo add-apt-repository ppa:certbot/certbot
同意するように求められたら、ENTER
を押します。 次に、サーバーのパッケージマネージャーキャッシュを更新します。
- sudo apt update
最後に、最新バージョンのCertbotをインストールします。
- sudo apt install certbot -y
前提条件のサーバーの初期設定の一部として、複雑でないファイアウォールであるufw
をインストールしました。 ドメイン検証を完了できるように、HTTPポート80
を許可するように構成する必要があります。 次のコマンドを実行して有効にします。
- sudo ufw allow 80
出力は次のようになります。
OutputRule added
Rule added (v6)
ポートが開いたので、Certbotを実行して証明書を取得します。
- sudo certbot certonly --standalone --rsa-key-size 4096 --agree-tos --preferred-challenges http -d your_domain
このコマンドは、Certbotに4096ビットのRSAキーサイズの証明書を発行し、検証のために一時的なスタンドアロンWebサーバー(--standalone
)を実行し、ポート80
(your_domain
をドメインに置き換え、プロンプトが表示されたらメールアドレスを入力してください。
出力は次のようになります。
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for `your_domain`
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your_domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your_domain/privkey.pem
Your cert will expire on 2020-07-11. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
メモに記載されているように、証明書と秘密鍵ファイルは/etc/letsencrypt/live/your_domain
の下に保存されました。
証明書を取得したら、main.cf
を開いて編集します。
- sudo nano /etc/postfix/main.cf
次のセクションを見つけてください。
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
your_domain
を必要に応じてドメインに置き換えて、次のように変更します。これにより、PostfixのTLS設定が更新されます。
# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/your_domain/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/your_domain/privkey.pem
smtp_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
完了したら、ファイルを保存して閉じます。
Postfixを再起動して変更を適用します。
- sudo systemctl restart postfix
ここで、もう一度メールを送信してみてください。
- echo "This is the body of an encrypted email" | mail -s "This is the subject line" your_email_address
次に、指定したメールアドレスを確認します。 電子メールプロバイダーは暗号化されていないメッセージをスパムとしてマークする可能性が非常に高いため、受信トレイにメッセージがすぐに表示される可能性があります。
クライアントの電子メールメッセージに関する技術情報をチェックして、メッセージが実際に暗号化されていることを確認できます。
結論
これで、Postfixを利用した送信専用の電子メールサーバーができました。 すべての送信メッセージを暗号化することは、メッセージをスパムとして完全にマークしない電子メールプロバイダーにとって良い最初のステップです。 開発シナリオでこれを行う場合は、この対策で十分です。
ただし、ユースケースが潜在的なサイトユーザーにメールを送信する場合(メッセージボードの登録の確認メールなど)は、 SPFレコードの設定を調べて、サーバーのメールが均等になるようにする必要があります。正当なものと見なされる可能性が高くなります。