こんにちは。GMOリザーブプラスの長司です。
今回メール監視に使用している環境を移行するにあたって、とあるメールサーバに対して外部からアクセスして調査する必要があったので、アプローチとして様々な方法をまとめます。
本記事では、メールサーバ監視環境の移行にあたって必要となった、外部からのメールサーバ調査手法について解説します。
もともとメール監視に関しては、 MSPとしてサーバ・DBなどのインフラ管理を実施頂いている協力会社でメールサーバを構築いただいた経緯があり、そこからメールボックスに転送をしていました。しかし数カ月ほどで容量不足に陥ったため、抜本的な仕組みの変更を実施する必要がありました。
そこで転送先を、メールボックスから AWS が提供している Amazon CloudWatch Logs に移行することを検討・実施しました。その過程で実施したメールサーバへの調査方法について紹介します。メールシステムと一口にいってもサーバ分類・プロトコルの種類が豊富にあるので、特にPOP3Sプロトコルを使用したサーバへのアクセス方法に焦点を当てています。
想定読者は以下になります。
・メールサーバの運用・保守を担当するエンジニア
・メールシステムの移行作業を行う必要がある方
・メールサーバの動作確認手順を学びたい方
メール監視を実施している環境の移行作業において、外部からメールサーバへアクセスして動作確認を行う必要がありました。別途サーバを管理しているパートナーの方もいらっしゃいますが、今回は勉強もかねて調査・移行を実施しました。
・プロトコル: POP3S (995番ポート)
・サーバソフトウェア: Dovecot (MDA: Mail Delivery Agent として利用しています)
・クライアントOS: Linux (RHEL系になります)
今回は以下3つの方法をあげています。
1. telnet を使う
遠隔ログインする際のコマンドとして古くから知られております。しかし今回は使用できませんでした。使用しているプロトコルが暗号化が施された POP3S であったためです。telnet では通信の暗号化がサポートされていないため、今回は使えなさそうです。
2. openssl を使う
秘密鍵、公開鍵、各種証明書を作成する際などに利用されるコマンドです。
s_client コマンドを使うと、簡易的にサーバとの接続を試みることができます。
調査した結果こちらで実行が可能にみえたため、今回はこの方法で実施しました。
以下がコマンドの実施例です。
$ openssl s_client -connect mx-record:995
CONNECTED(00000003)
depth=2 C = US, O = xxxxxxxxxxxxxxxxxxxxxx, CN = xxxx Root X1
verify return:1
depth=1 C = US, O = xxxxxxxxxxx, CN = xxx
verify return:1
depth=0 CN = hostname
verify return:1
---
Certificate chain
0 s:/CN=xxxxxxxxxxxxxxxxxxxxxxxx
i:/C=xxxxxxxxxxxxxxxxxxxxxxxx
1 s:/C=xxxxxxxxxxxxxxxxxxxxxxxx
i:/C=US/O=xxxxxxxxxxxxxxxxxxxxxxxx/CN=xxx Root X1
---
Server certificate
-----BEGIN CERTIFICATE-----
省略
-----END CERTIFICATE-----
subject=/CN=xxxxxxxxxxxxxxxxxxxxxxxx
issuer=/C=US/O=xxxxxxxxxxxxxxxxxxxxxxxx/CN=xxx
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 3237 bytes and written 415 bytes
---
(省略)
Start Time: 1733224772
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
+OK Dovecot ready.
このあとユーザー情報とパスワードを以下の形式で入力して、サーバへのログインができることを確認します。
user name@domainname
pass ****************
3. curl を使う
無事作業がひと段落した後に思いました。
(WebエンジニアがよくHTTPリクエストを実施する際に使う curl を使ってアクセス確認はできないか?)と...。
試しにサーバからコマンドを実行してマニュアルを見てみましょう。
$ man curl
curl(1) curl Manual curl(1)
NAME
curl - transfer a URL
SYNOPSIS
curl [options / URLs]
DESCRIPTION
curl is a tool for transferring data from or to a server using URLs. It supports these protocols: DICT, FILE, FTP, FTPS, GOPHER, GOPHERS,
HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS.
「It supports these protocols」の後に、POP3, POP3S とあるので確認できそうな雰囲気がしますね。調べてみましょう。
以下がコマンドの実施例です。
curl -v -u 'メールアカウント:パスワード' pop3s://domain:995
curl -v -u 'メールアカウント:パスワード' pop3s://IP:995
(略)
< +OK Logged in.
> LIST
ログインできました! この先は pop サーバのコマンドなどを使って、メールの一覧数や特定のメールIDからヘッダ情報やメッセージなどを含んだメールを確認できます。
上記方法で、外部環境からアクセスができることを確認できました。
実務としてはこの後MDAのテスト環境構築後に、監視環境の移行先として検討していた CloudWatch Logs への移行を実施できました。
現在は SendGrid などのメール処理に関してクラウドベースでAPIなどを提供してくれるサービスもありますが、日本語での欲しい情報が少なかったこともあったので記事のテーマとして選びました。必要になる機会の頻度は少ないかもしれませんが、今後必要になった方のご参考になればと思います。
調査・執筆にあたって、個人のブログではありますが以下が参考になりました。
・大量のメールを telnet + POP3 で一括削除
https://qiita.com/rinopo/items/a7db604d99608f2e123b
・ポートを使ったメールの受信方法
https://web.tku.ac.jp/~densan/local/mail/telnet/port-pop3/port-pop3.html
・Testing a POP3 server via telnet or OpenSSL
https://blog.yimingliu.com/2009/01/23/testing-a-pop3-server-via-telnet-or-openssl/
また調査にあたっては以下の公式マニュアルも大変参考になりました。
・RFC 1939 - Post Office Protocol - Version 3
https://tools.ietf.org/html/rfc1939
・OpenSSL コマンドラインツールガイド
https://www.openssl.org/docs/manmaster/man1/openssl.html
・curl マニュアル - POP3(S)プロトコル
https://curl.se/docs/manpage.html