web-dev-qa-db-ja.com

Eximを使用したGeoIPベースのグレーリスト?

私は何年もの間、いくつかのサイトで Sendmailmilter-greylist を一緒に使用しています。

milter-greylistは、GeoIPデータベースルックアップに基づいてグレーリストルールを定義することをサポートしています。これは、国際的にビジネスを行っていない企業にとって非常に便利です。ほとんどすべてのスパムは外部IPアドレスから送信されます。外国のアドレスからの正当な(ハム)電子メールがわずかに遅れてもかまいません。ローカル電子メールは遅滞なく到着する必要があるため、いくつかの国コードではグレーリストがスキップされます。また、SPFレコードが一致するか、IPがホワイトリストに含まれている場合、グレーリストはスキップされます。これは、sendmail.cfのmilterフックを使用してgreylist.confに実装するのは非常に簡単です。ほとんどのスパムはサーバーに到着する前にドロップされるため、メールサーバーのリソースにも適しています。したがって、spamassassinによってシステムの負荷が発生します。 )dspamベースのフィルタリングソリューションは、配信パスのさらに下にあります。

さて、本当の質問に:

Eximを使用して同様の(つまりGeoIPベースの)グレーリストを実装するにはどうすればよいですか?

私には、たまたまEximを実行し、大量のスパムを受信するさらに別のメールサーバーを処理するという新しい責任があります。私は彼らの電子メール配信システムを最初から再実装する気はありませんが、彼らのスパム量によって引き起こされる負荷については間違いなく何かをする必要があります。残念ながら、Eximにはmilterインターフェイスがないようです。また、EximのGeoIPサポートを備えたグレーリストソリューションを見つけることができませんでした。私はEximの完全な初心者です(sendmail.cfおよびsendmail m4マクロですべてを行うことができます)。

Exim構成ファイルの構文だけを使用してこの機能を実装できれば幸いです。その場合、私はそれを学び、おそらく他のサイトでもeximを使い始める努力をします。

2
snap

自分の好きな解決策ができたので、自分の質問に答えています。

グレイリスト自体は、Eximアクセス制御リストを使用して純粋に実装することも、外部のグレイリストヘルパーをACLにフックすることもできます。これにはいくつかのアプローチがあり、他の場所で文書化されています。

グレイリストは通常​​、アクセス制御リストに実装されているため、ACLに外部IPアドレスルックアップを追加して、グレイリストの動作を制御するのは簡単です(たとえば、国コードルックアップに従ってグレイリストをスキップする)。

国コードを取得するには、いくつかの方法があります。

  • たとえば http://countries.nerd.dk/ (mailqの回答のように)を使用したDNSBLルックアップ。
  • 一部のGeoIPデータベースをSQLデータベースにインポートし、ACLからSQLクエリを作成します。
  • いくつかのPerlGeoIPモジュールの1つを使用してGeoIPルックアップを実装し、Perlインターフェースを使用してEximACLにフックします。
  • ACLでGeoIPルックアップを実装するdlfuncライブラリを使用します。

私は個人的に最後のオプションを選択しました。これは最も効率的で、外部リソースに依存しないためです。既存のいくつかのライブラリのいずれもIPv6をサポートしていないため、この目的のために新しいdlfuncライブラリを実装しました。簡単な例を使用した私の実装は、 http://dist.epipe.com/exim/ で入手できます。これを実装しているときに、Exim ACLについて学び、あらゆる種類のメール受け入れポリシーを実装するのに非常に強力であることがわかりました。

グレーリストルールの前にACLルールを追加することで、特定の国のグレーリストを簡単にスキップできるようになりました。

warn    set acl_c_geoip_country_code = \
        ${dlfunc{/usr/local/lib/exim4/exim-geoipv6-dlfunc.so}\
        {geoip_country_code}{$sender_Host_address}}

accept  condition = ${if inlist{$acl_c_geoip_country_code}{FI:SE:EE}}

4.77より古いEximバージョンには、inlist{構文がありません。 2番目のルールを次のように変更することで同じことが実現できます。

accept  condition = ${if forany{FI:SE:EE}{eq{$item}{$acl_c_geoip_country_code}}}
1
snap

スパムを管理する最善の方法は、ベイジアンフィルタリングです。ベイジアンフィルターを適用する前に他のアプローチを適用すると一時的なメリットが得られる可能性がありますが、ベイジアンフィルタリングが成功するかどうかは、モデル化するスパムとハムが大量にあるかどうかにかかっています。したがって、IPアドレスに基づいてメールを拒否し始めると、損失が発生します。長期的には検出されません。 OTOHメッセージを単に拒否するのではなく、フラグを立てることができるはずです。

SPFとRBLも、スパムを防ぐための実証済みの方法です。そして、spamassassinによってサポートされています(ベイジアンフィルタリングなどとともに)。

国別ルックアップを追加するとスパム検出が改善されるかどうかを確認するためにデータをモデル化しましたか?適切に構成されたspamassassinインストールと比較して?

このルートを下る必要がある場合...

ミルターの作成は簡単ですが、IIRC、Eximはミルターをサポートしていません。

Exim ACLとして、許可されているすべてのIPアドレスをマップしようとするのは非常に困難です。

したがって、これを実装する最も実用的な方法は、ヘッダー挿入フィルター(procmailなど)をサポートするMDAを使用して、spamassassinにフィードすることです。

0
symcbean

少しだけ役立ちますが、DNSを介してクエリ可能なGeoIPサービス(DNSBLなど)があります。結果に基づいて決定を下すためのベースとして使用できるかもしれません。

たとえば、 http://www.netop.org/services/ip-geolocation を参照してください。

0
mailq