AWSでメールサーバを立てよう

はじめに

 こんにちは、システム情報学科3年の片山です。普段はWebアプリケーションの勉強をしています。

 メールサーバを立てたことはありますか?使うタイミングは限られるかもしれませんが、一度は自分でメールサーバを立てたいと思いますよね。
 ということで、今回はAWSのEC2で新しいインスタンスを立て、それをメールサーバとして構築する流れを解説していきます。ちなみに、メールがGoogleのsmtpサーバを中継するように設定します。

 また、もう一つWebサーバのインスタンスも立てて、簡単なメール送信フォームを作り、Webサーバ→メールサーバといったインスタンス間の通信についても解説します。

インスタンスの作成

 まずは、AWSのEC2インスタンスを作成します。簡単にざっくり説明すると、お好みのOS・スペック・ストレージ容量などをリクエストすれば、あとはAWSがサーバを用意してくれるサービスです。しかも、サーバを一時的に停止したり削除(終了)したり、スペックを上げ下げしたりすることもできます。大変便利ですが、使っている分だけお金がかかるので今回は無料枠を使用していきます。


AWS サービス検索画面

 AWSのアカウントを作成し(手順は省略します)、サービス検索場所に「EC2」と入力します。候補に「EC2」と出てくるので選択してください。


EC2 ダッシュボード画面

 これがEC2のダッシュボード画面です。「インスタンスを起動」をクリックしてインスタンス作成画面に行きます。

インスタンス作成画面1

 名前に「MailServer」を、OSは「Ubuntu」を選択してください。また「無料枠の対象」と表示されていることを確認してください。


インスタンス作成画面2

 おそらく初めから選択されていると思いますが「無料利用枠の対象」となっているインスタンスタイプを選択してください。過去にAWSのEC2を使用したことがあり無料枠を使い果たした方でも、.microや.nanoといった如何にも小さそうな名前の物を選んでおけば料金はそこまでかかりません。

 自分のキーペアを持っていない方は、ここで新しいキーペアを作成してください。


キーペア作成画面

 適当なキーペア名を入力し、キーペアを作成してください。


キーペア保存画面1
キーペア保存画面2

 作成したキーペアの片割れは、C:\Users\自分のユーザ名\.sshフォルダに保存してください。フォルダがなければ作成してください。


インスタンス作成画面3

 ネットワーク設定パネルで「からのSSHトラフィックを許可する」がONになっていることを確認してください。これをONにしないと、インスタンスにSSH接続することができません。


インスタンス作成画面4

 特にカスタムしたり確認したりするところはありません。


インスタンス作成画面5

 準備ができたら「インスタンスを起動」をクリックしてください。


インスタンス一覧画面

 作成したインスタンスが表示されていると思いますので「インスタンスID」をクリックしてください。


インスタンス概要画面

 インスタンスの概要が表示されています。「パブリックIPv4アドレス」をコピーしてください。(ここでは3.112.57.7でした)
 ついでに、隣の「プライベートIPv4アドレス」もコピーしてメモ帳などに貼り付けておくこの後の作業が楽になります。


.sshフォルダのconfigファイル
Host MailServer
    HostName パブリックIPv4アドレス
    User ubuntu
    IdentityFile C:\Users\自分のユーザ名\.ssh\先ほど作成したキーペア名.pem

 先ほどキーペアの片割れを保存した.sshフォルダにあるconfigファイルに、上記の内容を追記してください。configファイルがなければ作成してください。(拡張子はありません)
 これでメールサーバのインスタンスにSSH接続する準備が整いました。

メールサーバの構築

 ここからはpostfixを用いてメールサーバを構築していきます。
 まずは、Windowsのターミナルから以下のコマンドを実行してください。

ssh MailServer

 以下が表示されたら「yes」と入力してエンターキーを押してください。

Are you sure you want to continue connecting (yes/no/[fingerprint])?

 これで、ubuntuユーザでSSH接続できたと思います。

 次は、以下のコマンドを実行してpostfixをインストールしてください。

sudo apt update
sudo apt install postfix

 途中で色々と聞かれますが、すべてyesかエンター連打で構いません。無事にインストール出来たら、以下のコマンドを実行してpostfixの設定をしていきます。

vi /etc/postfix/main.cf

 postfixのコンフィグファイルを開いたら、以下のように編集してください。relayhostは編集、smtp_sasl_auth_enable = yes以降は追記です。

~ 略 ~

relayhost = [smtp.gmail.com]:587

~ 略 ~

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes

 今回はGoogleのSMTPサーバを中継したいので、メール送信者となるGoogleアカウントが必要になります。そのため、Googleの認証情報を設定する必要があります。以下のリンクをクリックして自分のアカウント画面に移動してください。

メール送信者のGoogleアカウント画面

 まずは、メール送信者となるGoogleアカウントのページに移動してください。右上のアイコンをクリックして該当のアカウントに切り替えることができます。


サービス検索欄

 画面上部の検索欄に「アプリパスワード」と入力して「アプリ パスワード」を選択します。
 この時に「アプリ パスワード」が表示されない方はGoogleアカウントの2段階認証が完了していませんので、先に設定を済ませてください。


アプリパスワード生成画面

 「アプリを選択」から「その他(名前を入力)」を選択します。


デバイス名入力画面

 デバイス名を入力する場所があるので、適当に入力して生成ボタンをクリックしてください。


アプリパスワード画面

 16桁のパスワードが表示されますのでコピーしてください。

 インスタンスでの作業に戻ります。以下のコマンドを実行して「gmail」ファイルを作成してください。

sudo vi /etc/postfix/gmail

 ファイルの中身は以下のように記述してください。メールアドレスとアプリパスワードの間に「:」があるので忘れないでください。

[smtp.gmail.com]:587 アプリパスワードを生成したGoogleアカウントのgmail:16桁のパスワード
/etc/postfix/gmail

 アプリパスワードが記述されたファイルなので、ファイルの所有者のみ読み込みと書き込みができるように以下のコマンドを実行してください。

sudo chmod 600 /etc/postfix/gmail
権限の確認と変更

 最後に、以下のコマンドを実行してgmail.dbファイルの生成と設定の再読み込みを行います。postfixがGoogleアカウントの認証情報を読みに行くのが、このgmail.dbファイルです。

sudo postmap /etc/postfix/gmail
sudo service postfix restart

 これでメールサーバの構築が完了しました。メールを送信するため、mailutilsをインストールします。(解説はしませんが、postfixについてきたsendmailコマンドでも構いません)
 以下のコマンドを実行してください。

sudo apt install mailutils

 それでは、メールを送信してみましょう!以下のコマンドを実行してください。「相手のメールアドレス」としているところに、メールを受信したいアドレスを入力してください。

echo "こんにちは!" | mail -s "テストメール" 相手のメールアドレス

 メールを確認してみましょう。


メールボックス

 無事にメールが届いていれば完了です!


メールの詳細

 メールの詳細を見てみましょう。無事にGoogleのSMTPサーバを中継できていることが確認できました。おそらく、迷惑メールフォルダにも入らずに済むと思います。

Webサーバの構築

 実際にメールサーバを利用する場面として「お問い合わせフォーム」からの入力を管理者にメール送信したいときに、メールサーバとは別のWebサーバなどを立てたいと思うはずです。
 さらに、Webサーバだけでなくさまざまなサーバを立てたときに毎回postfixのセットアップやGoogleアカウントのアプリパスワード生成を行うのは面倒なので、同じネットワーク内からであればどこのサーバからでもメールサーバを利用できるようにします。

 早速Webサーバ用のインスタンスを作成してみましょう。基本的な手順はメールサーバのインスタンス作成時と同じですので、変更点のみ解説します。


インスタンス作成画面1

 名前を「WebServer」、OSは同じく「Ubuntu」を選択します。


インスタンス作成画面2

 同じく無料枠を、キーペアは新しく作成してもいいですし、先ほど作成したものを再利用(こちらがオススメ)しても構いません。


インスタンス作成画面3

 先ほどと違う点はここです。「からのSSHトラフィックを許可する」の他に「インターネットからのHTTPトラフィックを許可」にチェックマークをつけましょう。
 これで、全世界からこのインスタンスにHTTP接続することができます。セキュリティリスクは勿論ありますので、一応自己責任でお願いします。

 インスタンスを作成したら、先ほどと同じ手順でSSH接続してください。接続したら、以下のコマンドを実行してWebサーバを構築します。

sudo apt update
sudo apt install postfix apache2 php8.1

 コマンドの実行が完了したら、ブラウザからWebServerインスタンスのパブリックIPアドレスにアクセスしてみてください。ただし、HTTPSには対応していないので「http://パブリックIPアドレス」にアクセスしてください。


Webサーバ起動確認画面(ブラウザ)

 このような画面が表示されればWebサーバ構築完了です。
 Webサーバ上でPHPが使用できるか確認するための準備を行います。以下のコマンドを実行して、公開フォルダに「info.php」ファイルを作成してください。

sudo vi /var/www/html/info.php

 ファイルの中身は以下のように記述してください。

<?php

phpinfo();

 ファイルへの記述が完了したら。「http://パブリックIPアドレス/info.php」にアクセスしてみてください。


phpの情報表示画面

 このような画面が表示されればPHPが使用できることが確認できます。

 次は、メール送信フォームを作成します。以下のコマンドを実行して、index.htmlを編集します。

sudo vi /var/www/html/index.html

 もとからあるコードを全て削除して、以下のHTML文を記述してください。長いのでコピペしてください。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>メールフォーム</title>
</head>

<body>
    <form action="./SendMail.php" method="post">
        <h2>メールアドレス</h2>
        <input type="email" name="to">
        <h2>件名</h2>
        <input type="text" name="sub">
        <h2>本文</h2>
        <textarea name="text" cols="30" rows="10"></textarea>
        <button type="submit">送信</button>
    </form>
</body>

</html>

 また、以下のコマンドを実行してindex.htmlと同じディレクトリにSendMail.phpファイルを作成します。

sudo vi /var/www/html/SendMail.php

 ファイルの中身は以下のように記述してください。

<?php

$to = $_POST["to"];
$sub = $_POST["sub"];
$text = $_POST["text"];
$addHeader = "From: メール送信者<アプリパスワードを生成したGoogleアカウントのメールアドレス>";

if (mail($to, $sub, $text, $addHeader)) {
    print("送信成功");
} else {
    print("送信失敗");
}

 簡単に解説すると、POSTリクエストから各inputフィールドのデータを変数に格納して、mailコマンド(中身はpostfixのsendmail -t -i コマンドらしい)でメールを送信します。
 $addHeaderでは追加のヘッダ情報を記述しています。「メール送信者」の部分は自分の好きな名前を付けて構いません。(この名前でメールが届きます)

 Webサーバ側でも、一か所だけpostfixの設定を変える必要があります。まずは以下のコマンドを実行してmain.cfファイルを開いてください。

vi /etc/postfix/main.cf

 ファイル内のrelayhostに、メールサーバのプライベートIPアドレスを記述してください。パブリックIPアドレスではありません!

relayhost = メールサーバ(インスタンス)のプライベートIPv4アドレス

 最後に以下のコマンドを実行してpostfixとapache2をリスタートしてください。これでWebサーバ側の準備は完了です。

sudo service postfix restart
sudo service apache2 restart

Webサーバからメールサーバへの通信

 先ほど、postfixのmain.cfを編集しrelayhostにメールサーバのプライベートアドレスを指定しました。これで、Webサーバ側で送信したメールはメールサーバに送信(中継)されるようになります。

メールの流れイメージ図

 これを実現するためには、Webサーバとメールサーバが同じネットワーク内に配置されている必要があります。実際に確認してみましょう。


インスタンス概要画面

 メールサーバとWebサーバのインスタンス概要画面を開いて「ネットワーキング」タブを選択してください。その後「サブネットID」をクリックしてサブネットの詳細を確認しに行きます。(メールサーバ(インスタンス)とWebサーバ(インスタンス)の両方を確認してください)


Webサーバ(インスタンス)の、サブネットのネットワークアドレス
メールサーバ(インスタンス)の、サブネットのネットワークアドレス

 Webサーバ(インスタンス)とメールサーバ(インスタンス)のネットワークアドレスが同じであることを確認してください。

メールの流れイメージ図

 メールサーバと同じサブネット内にあらゆるサーバを配置することで、メールサーバのプライベートIPアドレス宛にSMTPポート(25)でメールを送ってあげると、メールサーバが代表してGoogleのSMTPサーバ(メールサーバ)にメールを送信してくれます。面倒な認証もメールサーバが代表して行ってくれます!

 メールサーバは、同じサブネット内の他のサーバからSMTPポート(25)でメールが送られてくるのを待ち受ける必要があります。そのためのセキュリティ設定を行います。


メールサーバ(インスタンス)の概要画面

 メールサーバを立てたインスタンスの概要画面にアクセスし「セキュリティ」タブを開きます。その後「セキュリティグループ」をクリックしてください。


セキュリティグループ編集画面

 新しく開いた画面で「インバウンドのルールを編集」をクリックしてください。


インバウンドルール編集画面

 デフォルトで、すべてのネットワークからのSSH接続が許可されています。インスタンスを作成した際にチェックを付けた部分がここに反映されています。
 ここに、同じサブネット内からのSMTPポート(25)接続を許可するルールを追加します。「ルールを追加」をクリックしてください。


インバウンドルール追加画面

 「タイプ」から「SMTP」を選択して「ポート範囲」が「25」になっていることを確認してください。「ソース」には、先ほど確認したサブネットのネットワークアドレスを記述してください。

 ここで注意です!ソース部分に0.0.0.0/0を指定すると、全世界からのSMTP接続を許可することになります。つまり、あなたのメールサーバが悪意のあるハッカーに利用されて大変迷惑なことになります。(アプリパスワードを生成したGoogleアカウントが停止される可能性もあります)
 必ず、サブネットのネットワークアドレスを指定してください。

 念には念を、メールサーバのpostfixの設定を一部変更します。以下のコマンドをメールサーバで実行して、main.cfを開いてください。

sudo vi /etc/postfix/main.cf

 main.cfの「mynetworks」を、サブネットのネットワークアドレスに変更してください。

mynetworks = 172.31.0.0/20

 ファイル編集後は以下のコマンドを実行してpostfixを再起動してください。

sudo service postfix restart

 これで準備が完了しました。


メールフォーム画面

 ブラウザから、WebサーバのパブリックIPアドレスにHTTPアクセスしてください。先ほどindex.htmlを編集したので、このような画面が表示されるはずです。


メール内容入力画面

 メールを送信したい相手のメールアドレス、件名、本文を入力して「送信」ボタンを押してください。


送信成功確認画面

 mailコマンドが実行されれば、画面に「送信成功」と表示されます。以下のコマンドをWebサーバとメールサーバの両方で実行して、ログを確認することもできます。実行後は、Shift + F キーを入力すると、常に最新のログが表示され続けます。

sudo less /var/log/mail.log


メールボックス

 すべての設定が上手く行っていれば、無事にメールが届きます。


メールの詳細

 しっかりとGoogleのSMTPサーバを経由していることも確認できました。

おわりに

 以上が、AWSのEC2インスタンスでメールサーバを立てる流れとなります。一度メールサーバを構築すれば、後から新しいプロジェクトを立てたときでも気軽にメール送信機能を付けることができます。

 と言いたいところですが、AWSを使用しているならば「Amazon SES」という大変便利なメール送信サービスが利用できます。1か月で62,000件のメール送信が無料で利用できます。

 また、今回Webサーバで作成したお問い合わせフォームは全世界からアクセスすることができ、さらにBOTの対策をしていません。(他にもセキュリティリスクが沢山あるかも…)
 実際に動かす際は、最低限「/var/log/mail.log」を監視しながら、できれば認証機能もセットで作成してください。

 メールサーバ構築の参考になれば幸いです。最後まで見てくださりありがとうございました。

参考


この記事が気に入ったらサポートをしてみませんか?