Ubuntu20.04に送信専用SMTPサーバーとしてPostfixをインストールして設定する方法

提供:Dev Guides
移動先:案内検索

著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

Postfix は、メール転送エージェント(MTA)であり、メールの送受信に使用されるアプリケーションです。 ローカルアプリケーションのみで電子メールを送信するために使用できるように構成できます。 これは、アプリから定期的にメール通知を送信する必要がある場合や、サードパーティのメールサービスプロバイダーが許可しない大量の送信トラフィックがある場合に役立ちます。 また、必要な機能を維持しながら、本格的なSMTPサーバーを実行するよりも軽量な代替手段です。

このチュートリアルでは、Postfixを送信専用のSMTPサーバーとしてインストールして設定します。 また、ドメインの Let's Encrypt に無料のTLS証明書をリクエストし、それらを使用して送信メールを暗号化します。

前提条件

独自のメールサーバーの設定と保守は複雑で時間がかかります。 ほとんどのユーザーにとって、代わりに有料のメールサービスに依存する方が現実的です。 独自のメールサーバーの実行を検討している場合は、この記事を確認して、実行したくない理由を確認することをお勧めします。

このガイドに従ってPostfixをインストールして設定することが確実な場合は、最初に次のものが必要です。

  • Ubuntu 20.04を使用した初期サーバーセットアップでセットアップされた1つのUbuntu20.04サーバー(sudo非rootユーザーの作成を含む)。
  • 完全に登録されたドメイン名。 このチュートリアルでは、全体を通してyour_domainを使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。
  • サーバーのパブリックIPアドレスを指すyour_domainを含むADNSレコード。 それらを追加する方法の詳細については、この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

次の行を見つけます。

/etc/postfix/main.cf

. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
. . .

inet_interfaces設定の値をloopback-onlyに設定します。

/etc/postfix/main.cf

. . .
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
. . .

変更する必要があるもう1つのディレクティブは、mydestinationです。これは、local_transportメール配信トランスポートを介して配信されるドメインのリストを指定します。 デフォルトでは、値は次のようになります。

/etc/postfix/main.cf

. . .
mydestination = $myhostname, your_domain, localhost.com, , localhost
. . .

次のように行を変更します。

/etc/postfix/main.cf

. . .
mydestination = localhost.$mydomain, localhost, $myhostname
. . .

ドメインが実際にはサブドメインであり、電子メールメッセージをメインドメインから送信されたように見せたい場合は、main.cfの末尾に次の行を追加できます。

/etc/postfix/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

デフォルトの状態では、次のようになります。

/ etc / aliases

# See man 5 aliases for format
postmaster:    root

存在する唯一のディレクティブは、システムで生成された電子メールがrootに送信されることを指定します。

ファイルの最後に次の行を追加します。

/ etc / aliases

...
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 apt install certbot

確認を求められたら、Yと入力し、ENTERを押します。

前提条件のサーバーの初期設定の一部として、複雑でないファイアウォールである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( [ X193X])。 コマンドを実行する前に、必ず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

次のセクションを見つけてください。

/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_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

your_domainを必要に応じてドメインに置き換えて、次のように変更します。 これにより、PostfixのTLS設定が更新されます。

/etc/postfix/main.cf

# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/your_domain/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/your_domain/privkey.pem
smtpd_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
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レコードの設定を調べて、サーバーのメールの可能性をさらに高めてください。正当なものと見なされます。