技術解説
Milter × Nextcloud
ストリーミング配布
非同期ワーカー
技術アーキテクチャ
添付“リンク化”の内側
ZipCloudMilter は Postfix の Milter 連携で添付をクラウドへ退避し、本文を安全なダウンロードリンクへ置換します。
ここでは構成・データフロー・セキュリティ設計・非同期ワーカー・障害時の挙動をまとめます。
1. 全体構成図(論理)
2. データフロー(送信時)
- MUA から Postfix(submission/smtp)へ送信。
- 前段で Rspamd/ClamAV による拒否・隔離判定。
- 通過したメールを ZipCloudMilter に引き渡し、添付を抽出。
- Nextcloud にアップロード(フォルダ/権限/クォータ確認)。
- 本文を 配布リンク+案内文に置換(#LIMIT/#EXPIRE/#ZIP/#REPLY を反映)。
- 送出。必要に応じて 送信者へ初回DL通知の準備や公開停止URLを発行。
送信側の手順は基本不要。件名コマンドで案件ごとの上書きのみ。
3. データフロー(受信時)
- 受信者は本文の「ダウンロード開始」をクリック。
- 必要に応じて別送パスワードを入力。
- ストリーミング配布でダウンロード(ワンタイム/回数上限に追従)。
- 初回ダウンロード時、送信者へ 初回DL通知。
- 誤送信時は、送信者の公開停止リンクから即時無効化可能。
相手先ポリシーにより cloud / zip / reply へ自動切替(ドメイン別ポリシー)。
4. シーケンス(簡易時系列)
5. 非同期ワーカー(キュー&ファンアウト)
役割
- /var/tmp/zipcloudmilter/queue のジョブ(.json + .eml)を監視・処理
- Nextcloud へアップロード&共有情報取得(同期と同等)
- 受信者別トークンを生成・保存し、sendmailで個別に通知(Bcc漏れ回避)
- ワンタイム/回数/期限・返信リンク(#REPLY)・公開停止URLに対応
- 処理ログは
/var/log/zipcloudmilter_async.log
投入条件(代表例)
- 受信者が複数でストリーミング配布(またはワンタイム)
- 大容量メール(例:100MB超)
- 運用ポリシーにより明示的にオフロード
件名の #LIMIT / #EXPIRE は同期・非同期の両方で除去/適用します。
起動(例)
# FreeBSD 例:サービス化は任意
/usr/local/bin/python3 /usr/local/www/zipcloudmilter/async_processor.py &
tail -f /var/log/zipcloudmilter_async.log
安全策
- キューファイルは 0600、JSONは .part → rename で原子的保存
- 冪等キーで重複挿入を防止(同一メッセージの再処理対策)
- Bcc を除去し、受信者ごとに MIME を再構築
6. セキュリティ設計
配布リンクの保護
- 推測困難なトークン化URL(十分な長さ・無作為性)
- #LIMIT(回数上限)/ #EXPIRE(有効期限)
- オプション:#ZIP + パスワード別送
- 公開停止で即時無効化
保存・転送の安全
- Nextcloud 側の権限/クォータ/監査ログ
- HTTPS/TLS による転送経路の暗号化
- メール本文から実体を除去(リンクのみ)
- URL 直打ち時も制御値(回数/期限)で遮断
監査・通知
- 初回DL通知(送信者へ)
- アクセス履歴で追跡可能
- 削除/停止操作のイベント記録
- (任意)IP/UA/地理情報の記録・レポート
ドメイン別ポリシーで cloud / zip / reply を自動切替。相手先のセキュリティ要求や到達性に合わせて最適化します。
7. 障害時の挙動
事象 | 挙動/推奨対応 |
---|---|
Nextcloud 一時障害 | アップロード失敗時は本文置換を行わず原文を維持するモードを推奨(運用方針で選択)。再送または遅延リトライ。 |
クォータ不足 | 体験用/案件用クォータを分離。しきい値到達時は送信者へ通知し、リンク化をスキップ。 |
DL回数/期限超過 | リンクは自動失効。案内画面で送信者への連絡導線を提示。 |
誤送信に気付いた | 公開停止URLから即時無効化。必要に応じてログをエクスポートし、関係先に周知。 |
8. 非機能要件の目安
- スループット:本文は軽量(リンク化)→ MTA 負荷を抑制
- 待ち時間:非同期処理により数秒〜数十秒でリンク生成
- 可観測性:処理タイムライン/初回DL通知/履歴照会
- 拡張性:ポリシー・ルーティング・件名コマンドの追加で運用を拡張
段階導入:まずは submission 経路から適用 → 安定後に smtp(受信)へ。