目次
はじめに
こんにちは、ディーネットの山田です。
Amazon SES経由でメールを送信する際のウイルスチェックについて調べる機会がありましたので、その内容をブログにしてみたいと思います。
あくまで、動作検証が目的ですので、EICARテストファイルを用いて、自社のメールアドレスに送信します。
本物のウイルスを使った場合、AWSの禁止事項に触れて不正使用を疑われる可能性がありますので、その点は自己責任でお願いいたします。
Amazon SESを使って外部にメールを送信する構成
環境構成図
実際に送信していきます
1. PHPMailerで以下のようなソースコードを使ってEicarテストファイルを添付する
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require('PHPMailer/src/PHPMailer.php');
require('PHPMailer/src/Exception.php');
require('PHPMailer/src/SMTP.php');
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = SMTP::DEBUG_SERVER;
$mail->isSMTP();
$mail->Host = 'email-smtp.your-region.amazonaws.com'; //Amazon SES SMTPエンドポイントを指定
$mail->SMTPAuth = true;
$mail->Username = 'YOUR_ACCESS_KEY'; //SMTP認証情報として発行されたアクセスキーを指定
$mail->Password = 'YOUR_SECRET_ACCESS_KEY'; //SMTP認証情報として発行されたシークレットアクセスキーを指定
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
//Recipients
$mail->Sender = 'your-sender-email@example.com'; //Amazon SES送信者アドレスを指定
$mail->setFrom('your-sender-email@example.com'); //Amazon SES送信者アドレスを指定
$mail->addAddress('recipient-email@example.com'); //宛先アドレスを指定
//Attachment
$mail->AddAttachment("./eicar.com");
//Content
$mail->isHTML(false);
$mail->Subject = 'Test Subject';
$mail->Body = 'Test Body';
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>
2. 送信結果
- ファイル名が、”eicar.com”だとAmazon SESに受け取り自体を拒否されました。
2024-05-21 01:17:11 SERVER -> CLIENT: 554 Transaction failed: Illegal filename 'eicar.com'.
2024-05-21 01:17:11 SMTP ERROR: DATA END command failed: 554 Transaction failed: Illegal filename 'eicar.com'.
2024-05-21 01:17:11 SMTP Error: data not accepted.
Message could not be sent. Mailer Error: SMTP Error: data not accepted.SMTP server error: DATA END command failed Detail: Transaction failed: Illegal filename 'eicar.com'.
SMTP code: 5542024-05-21 01:17:11 CLIENT -> SERVER: QUIT
2024-05-21 01:17:11 SERVER -> CLIENT: 221 Bye
- 改めて、ファイル名を変更(attachment.txt)して送信したところ送信可能でした。
2024-05-21 01:19:01 SERVER -> CLIENT: 250 Ok 0106018f98bafa86-15222e61-220f-4598-a61f-2cd84396f724-000000
2024-05-21 01:19:01 CLIENT -> SERVER: QUIT
2024-05-21 01:19:01 SERVER -> CLIENT: 221 Bye
Message has been sent
3. 実際には、どちらのケースも宛先には届きません
- ファイル名を変更(attachment.txt)して送信した場合、Amazon SES的には受け取りが行われますが、その後内部で実施されるウイルスチェックで拒否されました。
{
"eventType": "Reject",
"mail": {
"timestamp": "2024-05-21T01:19:01.766Z",
"source": "your-sender-email@example.com",
"sourceArn": "arn:aws:ses:your-region:YOUR_ACCOUNT_ID:identity/your-domain",
"sendingAccountId": "YOUR_ACCOUNT_ID",
"messageId": "0106018f98bafa86-15222e61-220f-4598-a61f-2cd84396f724-000000",
"destination": ["recipient-email@example.com"],
"headersTruncated": false,
"headers": [
{
"name": "Received",
"value": "from vscode.localdomain (your-ip-address) by email-smtp.amazonaws.com with SMTP (SimpleEmailService-d-QLRVU3HU5) id NMXfmpv8hqFuq7w0lVna for recipient-email@example.com; Tue, 21 May 2024 01:19:01 +0000 (UTC)"
},
{
"name": "Date",
"value": "Tue, 21 May 2024 01:19:01 +0000"
},
{
"name": "To",
"value": "recipient-email@example.com"
},
{
"name": "From",
"value": "your-sender-email@example.com"
},
{
"name": "Subject",
"value": "hello"
},
{
"name": "Message-ID",
"value": "<2CV0RIeK5hQ6wrHsqNPadDiPoA9NrdjCMgpJOQBJIOQ@vscode.localdomain>"
},
{
"name": "X-Mailer",
"value": "PHPMailer 6.6.0 (https://github.com/PHPMailer/PHPMailer)"
},
{
"name": "MIME-Version",
"value": "1.0"
},
{
"name": "Content-Type",
"value": "multipart/mixed; boundary=\"b1_2CV0RIeK5hQ6wrHsqNPadDiPoA9NrdjCMgpJOQBJIOQ\""
},
{
"name": "Content-Transfer-Encoding",
"value": "8bit"
}
],
"commonHeaders": {
"from": ["your-sender-email@example.com"],
"date": "Tue, 21 May 2024 01:19:01 +0000",
"to": ["recipient-email@example.com"],
"messageId": "0106018f98bafa86-15222e61-220f-4598-a61f-2cd84396f724-000000",
"subject": "hello"
},
"tags": {
"ses:source-tls-version": ["TLSv1.2"],
"ses:operation": ["SendSmtpEmail"],
"ses:configuration-set": ["ses-log"],
"ses:recipient-isp": ["UNKNOWN_ISP"],
"ses:source-ip": ["your-ip-address"],
"ses:from-domain": ["your-domain"],
"ses:sender-identity": ["your-domain"],
"ses:caller-identity": ["ses-smtp-user.DATE_TIME"]
}
},
"reject": {
"reason": "Bad content"
}
}
ドキュメントから拒否された原因を調査します
- Amazon SESの開発者ガイドに”Reject”が記録された際の意味について記述があります。
フィールド名 | 説明 |
---|---|
reason | メールが拒否された理由。このフィールドの唯一の値は Bad content です。E メール内のウイルスを Amazon SES で検出したことを意味します。メッセージが拒否されると、Amazon SES はメッセージの処理を停止し、そのメッセージを受信者のメールサーバーに配信しようとしません。 |
まとめ
- Amazon SESには、送信時においてもウイルスチェック機能が存在する。
- ウイルスチェック機能の詳細は、明かされていないが少なくともEicarテストファイルで検証した限り正しくブロックされた。
- 最新のウイルスに対する対応やどういったウイルスが検知されたか等については、正直わからないのでセキュリティレベルを重視する場合は、別途メールアプライアンスの利用を検討してください。
- ウイルスチェックで拒否されたメールは、「Virtual Deliverability Manager」には記録されないので、SESのログ出力を有効化しておくことをおすすめいたします。
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ