著者は、 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にバンドルされています。

まず、パッケージデータベースを更新します。

  1. sudo apt update

次に、次のコマンドを実行してPostfixをインストールします。

  1. sudo apt install mailutils

インストールプロセスの終わり近くに、Postfix設定ウィンドウが表示されます。

Select Internet Site from the menu, then press TAB to select <Ok>, then ENTER

デフォルトのオプションはInternet Siteです。 これがユースケースに推奨されるオプションなので、TABを押してから、ENTERを押します。 説明テキストしか表示されない場合は、TABを押してOKを選択し、次にENTERを選択します。

自動的に表示されない場合は、次のコマンドを実行して起動します。

  1. sudo dpkg-reconfigure postfix

その後、システムメール名に関する別の設定プロンプトが表示されます。

Enter your domain name, then press TAB to select <Ok>, ENTER

システムメール名は、サーバーの作成時にサーバーに割り当てた名前と同じである必要があります。 終了したら、TABを押し、次にENTERを押します。

これでPostfixがインストールされ、構成を開始する準備が整いました。

ステップ2—Postfixを設定する

このステップでは、Postfixが実行されているサーバー、つまりlocalhostからのみメールを送受信するようにPostfixを設定します。

そのためには、サーバーが内部通信に使用する仮想ネットワークインターフェイスであるループバックインターフェイスでのみリッスンするようにPostfixを構成する必要があります。 変更を加えるには、etc/postfixの下に保存されているmain.cfというメインのPostfix設定ファイルを編集する必要があります。

お気に入りのテキストエディタを使用して編集するために開きます。

  1. 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を再起動します。

  1. sudo systemctl restart postfix

サーバーからの電子メールのみを送信するようにPostfixを構成しました。 次に、サンプルメッセージを電子メールアドレスに送信してテストします。

ステップ3—SMTPサーバーをテストする

このステップでは、最初のステップでインストールしたmailutilsパッケージの一部であるmailコマンドを使用して、Postfixが外部の電子メールアカウントに電子メールを送信できるかどうかをテストします。

テストメールを送信するには、次のコマンドを実行します。

  1. 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ファイルには、電子メール受信者の代替名のリストが含まれています。 編集のために開きます:

  1. 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を個人のメールアドレスに置き換えることを忘れないでください。 完了したら、ファイルを保存して閉じます。

変更を有効にするには、次のコマンドを実行します。

  1. sudo newaliases

newaliasesを実行すると、mailコマンドが使用するエイリアスのデータベースが構築されます。このデータベースは、編集したばかりの構成ファイルから取得されます。

rootへのメール送信が、次のコマンドを実行して機能することをテストします。

  1. 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が含まれていますが、古くなっている可能性があります。 代わりに、次のコマンドを実行して公式リポジトリを追加します。

  1. sudo add-apt-repository ppa:certbot/certbot

同意するように求められたら、ENTERを押します。 次に、サーバーのパッケージマネージャーキャッシュを更新します。

  1. sudo apt update

最後に、最新バージョンのCertbotをインストールします。

  1. sudo apt install certbot -y

前提条件のサーバーの初期設定の一部として、複雑でないファイアウォールであるufwをインストールしました。 ドメイン検証を完了できるように、HTTPポート80を許可するように構成する必要があります。 次のコマンドを実行して有効にします。

  1. sudo ufw allow 80

出力は次のようになります。

Output
Rule added Rule added (v6)

ポートが開いたので、Certbotを実行して証明書を取得します。

  1. 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をドメインに置き換え、プロンプトが表示されたらメールアドレスを入力してください。

出力は次のようになります。

Output
Saving 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を開いて編集します。

  1. 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_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設定が更新されます。

/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
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を再起動して変更を適用します。

  1. sudo systemctl restart postfix

ここで、もう一度メールを送信してみてください。

  1. echo "This is the body of an encrypted email" | mail -s "This is the subject line" your_email_address

次に、指定したメールアドレスを確認します。 電子メールプロバイダーは暗号化されていないメッセージをスパムとしてマークする可能性が非常に高いため、受信トレイにメッセージがすぐに表示される可能性があります。

クライアントの電子メールメッセージに関する技術情報をチェックして、メッセージが実際に暗号化されていることを確認できます。

結論

これで、Postfixを利用した送信専用の電子メールサーバーができました。 すべての送信メッセージを暗号化することは、メッセージをスパムとして完全にマークしない電子メールプロバイダーにとって良い最初のステップです。 開発シナリオでこれを行う場合は、この対策で十分です。

ただし、ユースケースが潜在的なサイトユーザーにメールを送信する場合(メッセージボードの登録の確認メールなど)は、 SPFレコードの設定を調べて、サーバーのメールが均等になるようにする必要があります。正当なものと見なされる可能性が高くなります。