AWS Lightsailでサーバーを構築-メールサーバーSSL対応編

XAMPPのMercuryMailはSTARTTLSには対応しているらしいが、TLSには対応していないらしい。

Windowsメールが2024年にはOutlookに移行するというので、何度か移行を試してみたが、現状のセキュリティでは移行できなくて元に戻すの繰り返しだった。

また、AWSのLightsailが2024年5月1日から、IPv4アドレスを有料化するというのでIPv6への移行も検討している。

そこで、TLSに対応したプロキシーの一種であるstunnelを使用して、外部からはTLSを使用できるようにした。

stunnelのインストール

https://www.stunnel.org/downloads.html からインストーラーをダウンロードする
  または、最新版へのリンク https://www.stunnel.org/downloads/stunnel-latest-win64-installer.exe をダウンロード
ダウンロードした stunnel-5.72-win64-installer.exe を実行する
  Choose Users Instak fir anyone using : this computer
  Choose Components : all
  Choose Install Locations : C:\Program Files (x86)\stunnel
  コマンドプロンプトが開くので、すべて<enter> 。この内容でstunnel.pemが作られるらしい
    Country Name (2 letter code) [PL]:
    State or Province Name (full name) [Mazovia Province]:
    Locality Name (eg, city) [Warsaw]:
    Organization Name (eg, company) [Stunnel Developers]:
    Organizational Unit Name (eg, section) [Provisional CA]:
    Common Name (FQDN of your server) [localhost]:
  あとで、スタートメニューの Buid a Self-signed stunnnel.pem を実行すると再生成できるのかもしれない。

stunnelの実行

スタートメニューーすべてのアプリ-stunnel AllUsers-stunnel GUI Startを実行する

タスクバーの設定-その他のシステムトレイアイコン stunnel – TLS offloading and load-balancing proxy をオンにする

タスクトレイのstunnelアイコンを右クリックし、Edit Configurationを選び、設定ファイルを変更する

サーバー証明書は、サーバー証明書を取得で取得した証明書がそのまま使えるみたい。

  gmail関係は ; でコメントアウト
  [imaps]
  accept  = 993
  connect = 143
  cert = C:/xampp/apache/conf/certs/domain.com-chain.pem
  key  = C:/xampp/apache/conf/certs/domain.com-key.pem

   [imapsv6]
  accept  = :::993
  connect = 143
  cert = C:/xampp/apache/conf/certs/domain.com-chain.pem
  key  = C:/xampp/apache/conf/certs/domain.com-key.pem

  [ssmtp]
  accept  = 465
  connect = 25
  cert = C:/xampp/apache/conf/certs/domain.com-chain.pem
  key  = C:/xampp/apache/conf/certs/domain.com-key.pem
 [ssmtpv6]
  accept  = :::465
  connect = 25
  cert = C:/xampp/apache/conf/certs/domain.com-chain.pem
  key  = C:/xampp/apache/conf/certs/domain.com-key.pem

スタートメニューーすべてのアプリ-stunnel AllUsers-stunnel GUI Stopを実行
スタートメニューーすべてのアプリ-stunnel AllUsers-stunnel Service Installを実行
スタートメニューーすべてのアプリ-stunnel AllUsers-stunnel Service Startを実行
  stunnel GUIを動かしていると、サービスstunnelは起動できないので、先にサービスを起動しておくこと

スタートメニューーすべてのアプリ-stunnel AllUsers-stunnel GUI Start のショートカットを、"%HOMEDRIVE%%HOMEPATH%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup" にコピーして、起動時に立ち上げるようにする

ファイアウォールの設定

ファイアウォールで以下のポートをブロックする
143(mailman用にサーバーのIPアドレスのみを許可しておく)

ファイアウォールで以下のポートを許可する
465,993

ログのローテート

ログファイルは増えていく一方なので、定期的に分割するスクリプトを作ってみた。

stunnelサービスが実行中はログファイルを変更できないため、

  1. 一旦、stunnelサービスを止めて、その間にログファイルを切り替える。
  2. 2種類のfonfファイルを用意して、ログを出力しないconfファイルと、新しいログファイル名を指定したconfファイルを新たに読み込ませる
  3. confファイルを定期的に書き換えて、stunnel.exe -reloadで読み込ませる

いろいろやり方はあるが、なるべく単純な3.で実現してみた。

stunnel_LogRotate.bat

@echo off
echo %DATE%-%TIME: =0% : Excecuting ... %0 %*
rem stunnelのログファイルを月ごとに分けるため、月初めにconfファイルを書き換えてサービスに反映する

setlocal

set YEAR=%date:~-10,4%
set MONTH=%date:~-5,2%

set CONF_FILE=stunnel.conf
set CONF_FILE_TEMP=stunnel.conf.tmp
set CONF_FILE_BACKUP=stunnel.conf.bak
set LOG_FILE=stunnel_%YEAR%%MONTH%.log

set STUNNEL_FOLDER=C:\Program Files (x86)\stunnel\
set CONF_FOLDER=%STUNNEL_FOLDER%config\

set STUNNEL_EXE=%STUNNEL_FOLDER%bin\stunnel.exe

set CONF_PATH=%CONF_FOLDER%%CONF_FILE%
set TEMP_PATH=%CONF_FOLDER%%CONF_FILE_TEMP%
set  LOG_PATH=%CONF_FOLDER%%LOG_FILE%

rem 今月のログファイルが存在すれば、なにもしない
if exist "%LOG_PATH%" (
  echo No need to rotate log.
  echo.
  goto :DONE
)

if exist "%TEMP_PATH%" del /F "%TEMP_PATH%"

rem stunnel.conf の output行を置き換える
powershell "Get-Content \"%CONF_PATH%\" | %% { $_ -replace \"^^(output = ).*\", \"`$1%LOG_FILE%\" } | Out-File -Encoding UTF8 \"%TEMP_PATH%\" "

rem conf ファイルを置き換える
if exist "%CONF_FOLDER%%CONF_FILE_BACKUP%" del /F "%CONF_FOLDER%%CONF_FILE_BACKUP%"
ren "%CONF_FOLDER%%CONF_FILE%" "%CONF_FILE_BACKUP%"
ren "%CONF_FOLDER%%CONF_FILE_TEMP%" "%CONF_FILE%"


rem reload stunnel serveie
"%STUNNEL_EXE%" -reload -quiet

echo Rotate log to %LOG_FILE%\.
echo.

:DONE
endlocal
exit /b 0

powershellのところで、文字のエスケープ処理が面倒だった。

毎日0時過ぎに実行しているサーバーメインテナンス用のスクリプトに組み込んでおけば、毎月1日の0時過ぎに実行され、ログファイルが月単位に分割される。

まあ厳密には、0時からスクリプトが実行されるまでのログは前月分に含まれるけど、これ以上手を加えるほどメリットもないと思う。

終わりに

これによりOutlookから、メールサーバーのメールが読み出せるようになった。

Outlookは、当初なぜか英語の表示だったので、言語設定を変えるのに手間取って元に戻そうかと思った。

アカウント設定でメールサーバーの名前やポート番号は、どうやらドメインごととかに覚えているらしく同じサーバーの別アカウントでの設定は楽に行えた。