Upgrade to Pro — share decks privately, control downloads, hide ads and more …

milter-managerが便利な話

 milter-managerが便利な話

2019/08/10のNSEG勉強会で話した内容です。
milter-managerがどんなツールで、どんな便利な使い方があるかを簡単に説明しています。

SATOH Kiyoshi

March 22, 2022
Tweet

More Decks by SATOH Kiyoshi

Other Decks in Technology

Transcript

  1. milter-manager が便利な話 milter-manager が便利な話 2019/8/10 さとうきよし

  2. milter とは milter とは (m)ail f(ilter) でmilter 元々sendmail で実装されたフィルタする仕組み post

    x の lter やpolicy 委譲などに類するもの SMTP セッションのRCPT 等コマンド毎に動作を規定可
  3. milter どんなものがあるか milter どんなものがあるか clamav-milter ウイルス対策フィルタ spamass-milter spamassassin のmilter 版

    milter-greylist greylisting ⽤milter Rspamd スパム対策フィルタ
  4. milter-manager とは milter-manager とは milter を組み合わせて使えるようにする 条件に応じてmilter を適⽤といった設定が可能に ruby で簡単にmilter

    を書けるライブラリも提供 オープンソース
  5. milter のためのフレームワーク milter のためのフレームワーク milter-manager だけだと単にツールだが milter/client ライブラリで簡単にmilter 作れる milter

    を使うためのフレームワークへと昇華されてる
  6. 条件を絞ってmilter を当てる 条件を絞ってmilter を当てる 例)特定のSASL ユーザ名のみチェックを掛ける defile_milter("viruscheck-milter") do |milter| milter.connection_spec

    = "inet:8025@localhost" # ウイルスチェック⽤ milter milter.add_applicable_condition("sasl-username-check") end define_applicable_condition("sasl-username-check") do |condition| condition.define_envelope_from_stopper do |context, from| if context.authenticated? and context["auth_authen"] == "testuser" th false else true end end end auth 名取得のためにpost x 側の設定も必要 true/false 返す場合に、milter 掛けるほうが false であると ころに注意
  7. milter を作ってみる milter を作ってみる これだけでmilter が作れる require 'milter/client' class MilterClient

    < Milter::ClientSession def initialize(context) super(context) end def header(name, value) @headers << [name, value] end def body(chunk) @body << chunk end def end_of_message @headers.each do |name, value| case name
  8. MailParser MailParser MIME のメールをパート毎にパースしたい パースだけしたかったので利⽤ 「ruby mime parse 」で検索するとトップに MailParser

    - tmtm.org
  9. 実⽤的なmilter を作る 実⽤的なmilter を作る 例)ウイルスチェックで引っかかったパートのみを削除 require 'milter/client' require 'mailparser' class

    MilterCutThreat < Milter::ClientSession def initialize(context) super(context) @header_raw = "" @body_raw = "" end def header(name, value) @headers << [name, value] @header_raw += name + ": " + value + "\n" end def body(chunk) @body << chunk @body raw += chunk + "\n"
  10. 情報が少ない 情報が少ない そもそもmilter の情報がない。 は消えてる… milter-manager について実際の設定例が少ない milter-manager の公式サイトの情報が頼り ソース読んだり@ktou

    さんに直接教えてもらうなど milter.org
  11. milter-manager 使うための情報 milter-manager 使うための情報 設定: milter manager リファレンスマニュアル Ruby でmilter

    開発: milter manager リファレンスマニュアル github のruby バインディング⽤ソース https://milter- manager.osdn.jp/reference/ja/con guration.html https://milter-manager.osdn.jp/reference/ja/ruby-milter- tutorial.html https://github.com/milter-manager/milter- manager/blob/master/binding/ruby/lib/milter/client/session.rb
  12. milter を作るための雛形 milter を作るための雛形 github の milter-manager/binding/ruby/sample/ 以下にい くつかサンプルがある milter-test-client.rb

    各種パラメータの取得⽅法がわかる milter-replace.rb 本⽂の書き換え⽅法がわかる https://github.com/milter-manager/milter- manager/blob/master/binding/ruby/sample/
  13. milter-manager 便利だよ milter-manager 便利だよ と⾔ってる僕も仕事で使うの初だった でもほんと便利だったからみんな使おう