メールサーバの新たな選択肢「Stalwart Mail Server」を試す

はじめに

こんにちは、京都工芸繊維大学ロボコン挑戦プロジェクトのマンゴーです。この記事では、さくらインターネット様より提供いただいた「さくらのVPS」で使用しているメールサーバソフトウェア「Stalwart Mail Server」について紹介していこうと思います。

メールサーバのセルフホスティングと聞くと、PostfixやDovecotを組み合わせて、設定ファイルと格闘し、色々な鍵を手動で生成して…という面倒な作業が必要になります。実際に私も昔に一度やったことがありますが、もはや秘伝のタレ状態です。Stalwart Mail Serverは、そうした課題に対して取り組んでいるプロジェクトであり、実際にそうした作業なしにメールサーバを構築できるものになっています。Stalwart Mail Serverの公式サイトとGiuHubリポジトリはこちらです。

Stalwart Mail Serverとは

Stalwart Mail Serverは、Rustで書かれたオープンソースのオールインワンなメール&コラボレーションサーバです。一般的なIMAP4、POP3、SMTPに加えて、JMAP、CalDAV、CardDAV、WebDAVまでサポートしており、メールだけでなくカレンダーや連絡先の管理まで1つのバイナリで完結します。

従来のメールサーバ構築では、SMTPを取り仕切るMTA(Postfix)、IMAP/POP3を扱うMDA(Dovecot)、スパムフィルタ(SpamAssassin)、DKIM署名(OpenDKIM)などを別々にインストール・設定する必要がありました。Stalwartはこれらの機能をすべて単一のバイナリに統合しているため、構成がシンプルになっています。Rustで実装されていることにより、(脆弱性がないという意味ではありませんが)メモリ安全性が保証されているのも嬉しい点です。

Postfixと比較して何が楽なのか

オールインワンであること

Postfixベースの構成では、一般的に多くのソフトウェアを組み合わせる必要があります。PostfixとStalwartを比較した表を以下に掲載します。

機能Postfix構成Stalwart構成
MTA(送受信)PostfixStalwart
メールボックスDovecotStalwart
スパムフィルタSpamAssassin / RspamdStalwart
DKIM署名OpenDKIMStalwart
DKIM検証OpenDKIM / OpenDMARCStalwart
ユーザ管理LDAPやDBを別途用意内蔵ディレクトリ or 外部連携
Web管理画面なし(手動設定)Stalwart組み込みWebAdmin
TLS証明書certbotなどCLIACME(Stalwart組み込み)

これらをDockerなどで展開してくれるソフトウェアは存在しますが、複数のコンテナが必要になったりと面倒なことも多いです。また、管理画面の機能不足などが見られることもあります。しかし、Stalwartでは単一バイナリで動作するため、組み合わせる作業は不要になります。インストールスクリプトを実行するだけで、管理者アカウントが自動生成され、すぐにWebブラウザから設定を始められます。

Webベースの管理画面

Stalwartには、SPAとして実装されたWebベースの管理画面が組み込まれています。アカウント管理、ドメイン設定、SMTP配送キューの確認、ログの閲覧、そしてサーバ設定のほぼすべてをブラウザから行うことができます。

なんと管理画面もRustとWASMで動いています

Postfixの場合、設定変更のたびにmain.cfmaster.cfを編集してpostfix reloadを実行する必要がありますが、Stalwartではその作業が(Reloadまで含め)ブラウザ上で完結します。設定ファイルはTOML形式で保管されるものと、データベースにKVSのように保管されるものに分かれるので、完全にテキストファイルベースですべてを進めるのは難しいですが、およそ管理画面で完結できます。

インストールの簡単さ

公式のインストールスクリプトを使えば、以下のようにすぐ動く環境が手に入ります。

curl -fsSL https://get.stalw.art | sudo sh

デフォルトで安全な設計

Stalwartの公式ドキュメントでは「Secure by design」と謳われています。デプロイした時点から安全なデフォルト設定が適用されるという設計思想です。

  • ブルートフォース攻撃の自動検出・ブロック: パスワードの総当り攻撃や、アカウント名の推測などを検出し、攻撃元のIPアドレスを自動的にブロックします。いわゆるfail2ban的な機能がサーバ自体に内蔵されています。
  • レート制限: SMTPの接続やメッセージ送信に対するレート制限が組み込まれています。
  • TLSの推奨: ACME(Let's Encrypt)によるTLS証明書の自動取得・更新がサポートされており、HTTPSやIMAPSの設定が容易にできます。

また、外部機関によるセキュリティ監査も受けているようで、そうした点からも安心して使うことができます。

DKIM対応が組み込まれている

メールサーバを運用する上で避けて通れないのがメール認証の設定です。特にDKIM(DomainKeys Identified Mail)は、GmailやOutlookなどの大手プロバイダで正しく受信されるために事実上必須となっています。

Stalwartでは、管理画面でドメインを追加するだけでDKIM署名鍵が自動生成されます。Management > Directory > Domainsからドメインを作成すると、鍵ペアが自動的に作成され、対応するDNSレコードの内容も画面上に表示されます。あとはそのレコードをDNSプロバイダに登録するだけです。

送信メールへのDKIM署名は、認証済みユーザからの送信時に自動的に行われます。DKIM検証についても、受信メールに対して自動的に署名を検証してくれ、必要ならスパム判定としてくれます。

SPF(Sender Policy Framework)やDMARC(Domain-based Message Authentication, Reporting, and Conformance)、ARC(Authenticated Received Chain)の検証も組み込まれているため、メール認証の仕組みが最初から一通り揃っています。

その他の特長

ここまで紹介してきた以外にも、Stalwartには便利な機能がたくさんあります。

スパムフィルタの内蔵

統計的スパム分類器が内蔵されており、自動学習機能も備えています。DNS Blocklist(DNSBL)の参照、協調フィルタリング(Pyzor対応)、フィッシング検出、送信者レピュテーションの監視、グレイリスティングなど、商用メールサーバと同等レベルの機能がそのまま使えます。SpamAssassinやRspamdを別途立てる必要がなくなるのは大きな利点です。ちなみにスパムフィルタはスケーラビリティの観点からフルスクラッチで書かれているそうです。

Sieveスクリプト対応

Sieveは、メールのフィルタリングや振り分けのためのスクリプト言語です。StalwartにはSieveインタープリタが内蔵されており、ManageSieveサーバ経由でスクリプトの管理ができます。Roundcube Webmailだとこのような感じで設定できます。

ACME対応

Let's EncryptなどのACMEプロバイダを使ったTLS証明書の自動取得に対応しています。TLS-ALPN-01、DNS-01、HTTP-01の各チャレンジ方式をサポートしており、certbotを別途管理する必要がなくなります。

メールクライアントの自動設定

autoconfigやautodiscoverに対応しているため、ThunderbirdやOutlookなどのメールクライアントでメールアドレスとパスワードを入力するだけで、IMAP・SMTPの設定が自動的に取得されます。

サーバの選定

Stalwart自体のインストールは簡単ですが、メールサーバを動かすサーバの選定は慎重に行う必要があります。メールサーバ特有の要件がいくつかあるためです。

25番ポートが使えること

メールサーバの運用において最も重要な前提条件は、TCP 25番ポート(SMTP)が外部との送受信に使えることです。25番ポートは、メールサーバ同士がメールを配送する際に使用するポートであり、これがブロックされているとメールの送受信ができません。

自宅サーバの場合、多くのISP(インターネットサービスプロバイダ)が OP25B(Outbound Port 25 Blocking)を実施しています。これは迷惑メール対策として、ISPのネットワークから外部の25番ポートへの通信をブロックするものです。動的IPアドレスの回線ではほぼ確実にOP25Bの対象となるため、自宅からメールサーバを運用するのは現実的ではありません。また、AWSなどの大手パブリッククラウドでは、OP25Bの解除申請が必要なことも多いです。

そのため、メールサーバの運用にはVPS(Virtual Private Server)を使うのがオススメです。ただし、VPSであっても25番ポートが使えるとは限りません。

VPS選定のチェックポイント

メールサーバ用のVPSを選ぶ際には、以下の点を確認しましょう。

  • 25番ポートの送受信が可能か: 契約前に必ず確認しましょう。VPSプロバイダによっては、申請なしで25番ポートが開放されているところもあれば、申請が必要なところ、一定期間後に自動解除されるところなど対応はさまざまです。
  • 逆引きDNS(PTR)レコードが設定できるか: メールの到達率に大きく影響します。サーバのIPアドレスからホスト名を引けるようにする逆引きDNS(PTRレコード)の設定は、GmailやOutlookなどの大手プロバイダがメール受信時に確認しています。PTRレコードが設定されていないと、スパム扱いされる可能性が高くなります。PTRレコードの設定は、VPSプロバイダのコントロールパネルから行えることが多いです。

ちなみにさくらのVPSにおいては、本登録後72時間程度経過したところで25番ポートが開放されます(出典:さくらのVPSニュース)。また逆引きDNSレコードの設定も可能です。

必要ポート一覧

Stalwartの運用に必要なポートは、IMAPを主に使う場合だと以下の通りです。ファイアウォールでこれらを開放しておく必要があります。

ポートプロトコル用途
25SMTPメールサーバ間の配送(受信)
143IMAPIMAP接続
465SMTPSクライアントからの送信(TLS)
587Submissionクライアントからの送信(STARTTLS)
993IMAPSIMAP接続(TLS)
443HTTPSJMAP、ACME検証の対応
4190ManageSieveSieveスクリプト管理(任意)

また、管理画面は通常8443/8080ポートで待機しています。管理画面の開放はあまり推奨しませんが、可能ではあります。

実際に構築してみる

ここからは、example.comというドメインでStalwartを構築する手順を具体的に見ていきます。サーバのOSはUbuntu 24.04 LTSを想定しています。

前提条件

  • VPS(25番ポートが開放されているもの)
  • 独自ドメイン(例: example.com
  • ドメインのDNSを管理できるアカウント

Step 1: 事前のDNS設定

インストールの前に、最低限のDNSレコードを先に設定しておきます。まず、メールサーバのホスト名となるAレコードを作成します。

A    mail.example.com <サーバのIPアドレス>

次に、MXレコードを追加します。これにより、example.com宛のメールがこのサーバに届くようになります。

MX   example.com mail.example.com (優先度: 10)

Step 2: Stalwartのインストール

サーバにSSHで接続し、インストールスクリプトを実行します(Dockerを使うこともできますが、ここでは省略します)。

curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
sudo sh install.sh

インストールが完了すると、以下のような出力が表示されます。自動でsystemdによる起動設定まで行ってくれるのは便利ですね。ただし、OSのパッケージマネージャーを使用するわけではないので、自動更新などはできません。

✅ Configuration file written to /opt/stalwart/etc/config.toml
🔑 Your administrator account is 'admin' with password 'XXXXXXXXX'.
🔐 Setting permissions...
🚀 Starting service...
Created symlink /etc/systemd/system/multi-user.target.wants/stalwart.service -> /etc/systemd/system/stalwart.service.
🎉 Installation complete! Continue the setup at http://<IP>:8080/login

ここで表示された管理者パスワードは必ず控えておきましょう。このパスワードは基本的に短いので、後で長いものに更新します。

Step 3: ホスト名の確認

ブラウザで http://mail.example.com:8080/login にアクセスし、先ほどのadminアカウントでログインします。

まずはセキュリティのこともあるため、adminのパスワードを変えましょう。Settings > Authentication > Settingsに移動し、Fallback Administratorのところのパスワードを変更します。

次に確認すべきは、Settings > Server > Networkにあるホスト名の設定です。ここをmail.example.comにします。ホスト名は、SMTPのHELO/EHLOで使われるため、正しく設定されていないと受信を拒否される原因になります。

設定を変更したら、必ず設定のリロードを行ってください。

いろいろな設定画面にあるSave & Reloadボタンを押すか、MaintenanceからReloadを押すと完了します。

もしくはsystemctlなどで再起動しても良いです。

sudo systemctl restart stalwart-mail

Step 4: ドメインの登録とDNSレコードの設定

Management > Directory > Domainsから、example.comを追加します。

ドメインを作成すると、Stalwartが自動的にDKIM鍵ペア(ED25519とRSA)を生成し、必要なDNSレコードの一覧を表示してくれます。ドメイン一覧の各ドメインのメニューから「DNS Records」を選択すると、設定すべきレコードが一覧で確認できます。

これらをDNSプロバイダの管理画面で登録していきます。Cloudflareを使っている場合、Stalwartが生成するZonefile形式のテキストをそのままインポートすることもできます。

Step 5: TLS証明書の設定

メールサーバはTLS証明書なしでは実用になりません。Stalwartには、ACMEによる証明書の自動取得が組み込まれています。

Settings > Server > TLS > ACME Providersから、Let's EncryptをACMEプロバイダとして追加します。Subject Namesにサーバのホスト名(mail.example.com)が含まれていることを確認してください。

チャレンジ方式は、443番ポートが直接アクセスできる環境であればtls-alpn-01が最もシンプルです。リバースプロキシの背後にいる場合は、dns-01(Cloudflare等のDNSプロバイダと連携)を使うか、リバースプロキシ側でTLSを終端する構成にします。dns-01の場合、Cloudflareなどと連携する機能があるため、APIキーなども設定します。

また、もしcertbotなどで自前のSSL証明書発行を行っている場合は、Settings > Server > TLS > Certificatesから追加できます。このとき、ファイルを参照する場合は、%{file:/opt/stalwart/etc/certs/cert.pem}%のようにCertificate/Private Keyを埋めることができます。

Step 6: 逆引きDNS(PTR)レコードの設定

これはStalwartの設定ではなく、VPSプロバイダ側で行う設定です。

サーバのIPアドレスに対して、PTRレコードをmail.example.comに設定します。さくらのVPSであれば、ネットワーク → ホスト名逆引き登録から変更できます。

正しく設定されているかは、以下のコマンドで確認できます。

dig -x <サーバのIPアドレス> +short
# mail.example.com. と返ってくればOK

PTRレコードが正しく設定されていないと、GmailやMicrosoftなどの大手プロバイダでメールが拒否されたりスパムフォルダに振り分けられたりする可能性があります。PTRレコードの値は、Stalwartに設定したホスト名と一致させる必要があります。

なお、さくらのVPSにおけるDNS逆引きレコードの設定方法については、さくらのVPSのマニュアルに記載されていますので、参照してください。

Step 7: ユーザアカウントの作成

Management > Directory > Accountsから、メールアカウントを作成します。

ログイン名(例: user)、メールアドレス(例: user@example.com)、(Authenticationタブから)パスワードを設定します。最初のアカウントにはpostmaster@example.comをエイリアスとして追加しておくと良いでしょう。DMARCやSPFのレポートがpostmaster宛に届くためです。

Step 8: メールクライアントの接続

Stalwartにはwebメールクライアントが内蔵されていないため、外部のメールクライアントを使います。Thunderbirdであれば、メールアドレスとパスワードを入力するだけで、autoconfigの仕組みにより接続設定が自動的に取得されます(SRVレコードを正しく設定している場合)。

手動で設定する場合は以下のような内容になります。

項目設定値
受信サーバ(IMAP)mail.example.com:993(SSL/TLS)
送信サーバ(SMTP)mail.example.com:465(SSL/TLS)または mail.example.com:587(STARTTLS)
認証方式通常のパスワード認証

Step 9: 動作確認

メールの送受信が正しく動作するか確認します。

  • 送信テスト: https://www.mail-tester.com/ など、DKIM設定等を検証してくれるサービスにアクセスし、表示されるアドレス宛にある程度本文を書いた上でメールを送信します。SPF、DKIM、DMARCの設定が正しければ、10/10のスコアが得られるはずです。
  • 受信テスト: Gmailなどの外部アカウントから、作成したメールアドレス宛にメールを送ってみます。最初はスパム判定されることもあります。

Step 10: ここからやるべきこと

セキュリティの強化

Stalwartは初回セットアップ時にフォールバック用の管理者アカウントを自動作成します。このアカウントは初期設定や緊急アクセス用のものなので、通常の管理者アカウントを作成した後は使用しないようにすると良いです。

また、Stalwartはデフォルトで全サービスのリスナーを有効にしています(IMAP、HTTP、SMTP、POP3、ManageSieve)。使っていないプロトコルがあれば、Settings > Server > Listenersから該当のリスナーを無効化するか、ファイアウォールで対応するポートを閉じておくと良いでしょう。

Webmailなどの整備

StalwartにはWebメールなどは内蔵されていません。そのため、必要に応じてRoundcube WebmailなどのWebメールを用意すると利便性が上がります。また、RoundcubeのようなXOAUTH2に対応したメールクライアントとOpenID Connectを組み合わせることで、OpenID Connectによる認証を行うこともできます。

注意点

良いところばかり書いてきましたが、いくつか注意すべき点もあります。

  1. Webメールクライアントは内蔵されていません。メールの閲覧・送信にはThunderbirdやApple Mailなどの外部クライアントを使う必要があります。JMAPに対応したクライアントを使えば、より快適に利用できるでしょう。
  2. 比較的新しいプロジェクトです。Postfix + Dovecotの構成に比べると、歴史は短いです。そのため、管理画面の機能不足などが見られることもあります。また、長期運用の実績などは歴史の浅さ故少なくなっています。
  3. アップグレードは手動です。現時点では自動アップグレードの仕組みがなく、バージョンアップは手動で行う必要があります。データのマイグレーションが含まれるバージョンもあるため、確認しながら進める必要があります。
  4. Postfix環境から移行する場合、マイグレーションの手間などはあります。CLIを使うことでMaildir形式やmbox形式のメールボックスからインポートすることが可能ですが、アカウントが増えるほど手間と時間が掛かりますし、引き継がれない情報もあります。

まとめ

Stalwart Mail Serverは、従来のPostfix + Dovecot + OpenDKIM + SpamAssassin + …という構成を1つのバイナリに統合し、「メールサーバのセルフホスティングはもっと簡単であるべきだ」という思想のもとで開発されているプロジェクトです。デフォルトでの安全な設定、DKIMやSPF/DMARCの組み込みサポート、Webベースの管理画面など、従来の構成で手間だった部分がうまく解消されています。

サーバの選定さえクリアすれば、インストールからメール送受信の確認まで1時間もかからないくらいで完了できます。個人のメールサーバや小規模なチーム向けの運用はもちろん、クラスタリングなど大規模なデプロイメントにも対応できるスケーラビリティも備えています。

メールサーバを自前で立てたいけれど、Postfixの設定は面倒…という人にとっては、とても良い選択肢になるのではないかと思います。