rspamdスパム対策メールとopensmtpdの統合

ネットワーク上のそのような統合については、かなりの情報があります。 問題が解決されたという事実は、サイトに関するまれなコメントによって証明されていますが、既成のソリューションは見つかりませんでした。 おそらくこれは、ほとんどがpostfix / eximを使用しているためです。







記事の目的:







  1. 問題を解決するための方法論を説明してください。そうすれば、私の足跡をたどる方が簡単になります。
  2. 古き良きポストフィックスと会社からコミュニティの注意をそらす。




はじめに



完成したWeb /メール/サーバーインフラストラクチャを古いサーバーから新しいサーバーに移動するプロセスで、メールインフラストラクチャを再度展開する必要に直面しました。







元のメールシステムは2012年に展開されました。 Ansibleはまだ初期段階にありました。 構成システムは、現在ほど一般的ではありませんでした。 それから私は仕事の自動化が今よりも好きではなかったので、すべてが手作業で構成されました。







新しいシステムは、ドッカー上に構築され(「将来のために」システムを構築する最も詳細な説明を意味する)、ドッカークラスターで動作するはずでした。







古いシステムの設定は保存されていましたが、「dnl」sendmail、postfixロジックの説明行、amavis + spamasassinを設定するためのわかりにくいプロセス、amavis + spamasassinを必要とする大量のメモリには戻りたくありませんでした。 代替案を探すことが決定されました。







だれも「あなたがpostfixをマスターしていないので、ある種のマージナルソフトウェアを使用してください」と言わないように、私は明確にします:マスター。 元のシステムは、後置+ dovecot + amavisd-new + spamasassin + dkim-proxy + razor + pyzord + dccで構成されていました。







今後:最終的なシステムは、opensmtpd + dbmail + dkim-proxy + rspamdで構成されます。







理論のビット



opensmtpdは、OpenBSDチームによる基本的な設定プロセスを備えた軽量のメールデーモンです。 構成ルールは非常にシンプルで直感的であるため、すぐに記憶され、メールサーバーの完全なロジックを10行で記述することができます。







dbmail-pop / imapインターフェースを備えたメールストレージ。 主な機能は、データベースにメールを保存することです。これにより、任意の数のエントリポイントを作成できます。







rspamdは、Ramblerの開発者によるスパム対策メールシステムです。







他の選択肢はありますか? なぜZimbraではないのですか? 必要なすべてのコンポーネントを含む既製のメールインボックスソリューションをお試しください。







ZimbraはJavaのために落ちました-リソースを使いたくありませんでした。







mail-in-a-box-再び、すべて同じ接尾辞と会社。







問題の説明



opensmtpdはすばらしいデーモンですが、rspamdと簡単に統合できないという欠陥があります。







これは:







  1. milterプロトコルのサポートの欠如。 このプロトコル(拡張)を使用すると、標準ツールを使用してrspamdと統合できます。







  2. フィルターサポートの欠如。 統合のためのrspamdの開発者は、opensmtpdフィルターの使用を推奨しています。 フィルターの開発は何年も続いていますが、まだ生産されていません。 rspamd用のフィルターもありますが、githubの別のスレッドにあります。







    コードに一定の改善を加えた後、このフィルターをコンパイルして実行できましたが、作業中にエラーがスローされ、コードをさらに理解する必要はありませんでした。







  3. メールプロトコル以外のメールを受信する方法の欠如。


また、状況は次の点で複雑でした。







  1. 互いからのサービスのリモート性:デーモンは、異なるIPを持つdockerコンテナーで動作します。 実際、opensmtpdを含むコンテナーとrspamdを含むコンテナーは、異なるサーバーで実行されていると考えることができます。







  2. ソフトウェアの不均一性:opensmtpdは安定版のAlpine Linux(ベースDockerイメージとしてよく使用されるLinuxバージョン)にありますが、rspamdはありません。 逆も同様です。rspamdはAlpineの不安定版ですが、opensmtpdはそこでは動作しません。


したがって、最初のタスクとして、opensmtpdがあります。これは、ポート25で受信メールを待機し、ポート10029でrspamdがチェックしたメールを待機しています。







問題解決



opensmtpdにはmdaがあります。 これはおそらくメール配信エージェントの略です。 mdaでメールをリダイレクトすると、外部プログラムが起動します。 リダイレクトルールの例:







accept tagged IN from any for domain <domains> userbase <virtual_users> deliver to mda "/usr/local/bin/rspamd.sh %{sender} %{rcpt}" as admin
      
      





ここでは、送信者アドレスと受信者アドレスを渡す外部スクリプトを呼び出します。







rspamdにはrspamcが含まれています-これはrspamdのメールmtaの類似物です。 このプログラムを使用すると、レターを入力として受け取り、HTTP APIを介してrspamdに転送し、応答を発行できます。







mdaとrspamdの統合は次のとおりです。







 /usr/bin/rspamc --mime -h rspamd.example.ru:11333
      
      





STDINスクリプトに電子メールを送信し、rspamdアドレスを指定し、メッセージ処理ヘッダー(スパムの判別に使用される)を追加する必要があることを--mimeパラメーターで指定します。







メッセージがrspamdによって処理された後、何らかの方法でopensmtpdに送り返す必要があります。 ただし、標準のmta(opensmtpdで完了)はポート25にしか送信できません(別のポートで確認済みの手紙を待っています)。







解決策:自分でメールプロトコルを使用して通信を作成し(簡単です)、netcatを使用して目的のポートにデータを送信します。







opensmtpdとrspamdを統合するための最終的なmda rspamd.shスクリプト







 #!/usr/bin/env sh mail_file=$(mktemp) echo 'HELO localhost' >> $mail_file echo "MAIL FROM: <$1>" >> $mail_file echo "RCPT TO: <$2>" >> $mail_file echo 'DATA' >> $mail_file /usr/bin/rspamc --mime -h rspamd.example.ru:11333 >> $mail_file echo '' >> $mail_file echo '.' >> $mail_file echo 'QUIT' >> $mail_file cut_file=$(mktemp) sed '/Delivered-To/d' $mail_file > $cut_file rm "$mail_file" count=0; IFS=''; while read -r line ; do if [ "$count" -gt "5" ]; then sleep 0.05; else sleep 0.1; fi; echo "$line"; count=$((count+1)); done < "$cut_file" | netcat localhost 10029 rm "$cut_file"
      
      





このスクリプトの機能:







  1. 接続セットアップフェーズの各行の後に、データを遅延させてnetcat経由で送信する必要があります。 これを行うために、戻り線の間に遅延を作成します。
  2. 元のレターから、opensmtpdが追加する「Delivered-To」ヘッダーをカットする必要があります。 それ以外の場合、opensmtpdはこの文字がループしていると見なします。


1つのコンテナでopensmtpdとrspamdを組み合わせる問題の解決:rspamdリポジトリが接続され、そこから最新バージョンがインストールされるDebian sidに基づくDockerイメージを使用します。 インストール例:







 wget -O- https://rspamd.com/apt-stable/gpg.key | apt-key add - \ && echo "deb http://rspamd.com/apt-stable/ sid main" > /etc/apt/sources.list.d/rspamd.list \ && apt-get update \ && apt-get install --no-install-recommends --no-install-suggests -y \ rspamd
      
      





まとめ



postfix + amavisからopensmtpd + rspamdに移行した結果、サービス構成がシンプルになり、メモリ消費量が少なくなり、メールのスパムが少なくなりました。







最終的なDockerコンテナの実装については、 こちらをご覧ください








All Articles