AWSキーローテーションを使ってAWSセキュリティを管理する方法を、以前のブログ記事で取り上げました。この記事では、AWS SMTPリレーについて説明します。

最適なレベルのセキュリティを実現するには、EC2インスタンス・ロールまたはAWS STSを使ってアクセスキーの使用数を最小限に抑えるべきです。

この事例では、唯一残されたIAMユーザーとキーは、SES SMTPのためのものでした。このため、これらのキーをローテーションさせるか、完全に取り払ってしまう必要がありました。私は、完全に取り払うほうが良いと考えました。

##現行のインストレーション
弊社の現行のインストレーションでは、ほとんどの場合、デフォルトでローカル・ポストフィックスと設定済みのアクセスキーをインストールしています。これにより、アプリケーションが(メールを介して)ローカル・ポストフィックスと「話せる」ようになり、ポストフィックスからSMTPプロトコルでSESに情報をリレーできるようになります。

このプロセスは、次のように機能します。

AWS SES IAMの古いセットアップ

##新しいアーキテクチャ
キーの使用を避けるため、私たちは、EC2インスタンス・ロールを使用してコードを作成し、SMTPを直接、SES APIコールに変換することにしました。

アプリケーションそのものを変更せずにアプリケーションからメールを送れるようにするには、小さなSMTPサーバを設置して、SMTPコマンドからSES APIコールにデータをリレーする必要がありました。現在のAWS SMTPリレー・プロジェクトのは、次のようになっています。

AWS SMTPリレー

このプロジェクトはシンプルなJavaソフトウェアを基本としていて、これを.jarとしてサーバにインストールし、次のように起動することができます。

java -jar aws-smtp-relay.jar

usage: aws-smtp-relay
 -b,--bindAddress <arg>     Address to listen to
 -c,--configuration <arg>   AWS SES configuration to use
 -h,--help                  Display this help
 -p,--port <arg>            Port number to listen to
 -r,--region <arg>          AWS region to use

NuxeoのDamien Metzler、および社外からサポートを提供してくれているMorgan Christiansson氏とWilfried Martinache氏の尽力により、Dockerパッケージングを完了し、これをコンテナ・インフラに統合できるようになりました。

このDockerのイメージはDocker Hubで入手できます。これを次のようなシンプルなコマンドで実行します。

docker run -p 10025:10025 loopingz/aws-smtp-relay

最後に、次のステートメントをインスタンス・ロールのポリシーに追加するだけです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "ses:SendRawEmail",
      "Resource": "*"
    }
  ]
}

これで完成です!

このプロジェクトの詳細はGitHub(https://github.com/loopingz/aws-smtp-relay)でご確認いただけます。ご意見・ご感想をお待ちしております。