金曜日 7 25, 2008

SJSMS - SpamAssassin と連携させてみよう

今回は、Sun Java System Messaging Server (以下 SJSMS) にて Mailbox に 保存されるメールを保存前にスパム判定を行い、必要に応じてスパムフォルダ に移動させる設定を行います。

SpamAssassin は、フリーのスパム判定プログラムとして有名かと思いますが、 SJSMS ではこの SpamAssassin と連携するための機能を持っています。

それでは早速 SpamAssassin の用意ですが、今回は、オープンソースソフトウェアの Solaris 向けバイナリパッケージを配布している Blastwave を利用しましょう。

まず、Blastwave からパッケージを取得・インストールを行う pkg-get を インストールします。
 # pkgadd -d http://www.blastwave.org/pkg_get.pkg
これで、Blastwave を利用する準備が出来ました。
次に、Blastwave から、SpamAssassin をダウンロード・インストールします。
 # /opt/csw/bin/pkg-get -i spamassassin
このコマンドひとつで、必要となるライブラリなどをすべてダウンロード・ インストールを行ってくれます。

spamassassin をインストールすると以下のパッケージがインストールされました。
 # pkginfo | grep CSW
 application CSWbdb44                         berkeleydb44 - embedded database libraries and utilities
 system      CSWcommon                        common - common files and dirs for CSW packages
 application CSWexpat                         expat -  XML Parser Toolkit
 system      CSWgdbm                          gdbm - GNU dbm
 application CSWossl                          openssl - Openssl meta package
 application CSWossldevel                     openssl_devel - Openssl development support
 application CSWosslrt                        openssl_rt - Openssl runtime libraries
 application CSWosslutils                     openssl_utils - Openssl binaries and related tools
 application CSWperl                          perl - A high-level, general-purpose programming language.
 system      CSWpkgget                        pkg_get - CSW version of automated package download tool
 system      CSWpmarchivetar                  pm_archivetar - Module for manipulation of tar archives
 system      CSWpmauthensasl                  pm_authensasl - SASL Authentication framework
 application CSWpmcompressrawzlib             pm_compressrawzlib - Low-Level Interface to zlib compression library
 application CSWpmcompresszlib                pm_compresszlib - Interface to zlib compression library
 system      CSWpmconvertasn1                 pm_convertasn1 - ASN.1 Encode/Decode library
 application CSWpmcryptosslrandom             pm_osslrandom - Perl Crypt::OpenSSL::Random module
 application CSWpmcryptosslrsa                pm_osslrsa - Perl Crypt::OpenSSL::RSA module
 system      CSWpmdbi                         pm_dbi - Database independent interface for Perl
 application CSWpmdigesthmac                  pm_digesthmac - keyed-hashing for message authentication
 system      CSWpmdigestsha                   pm_digestsha - Perl extension for SHA-1/224/256/384/512
 application CSWpmdigestsha1                  pm_digestsha1 - interface to the SHA-1 Algorithm
 system      CSWpmerror                       pm_error - Error/exception handling
 system      CSWpmfontafm                     pm_fontafm - Interface to Adobe Font Metrics files
 system      CSWpmgeocountries                pm_geocountries - 2-letter, 3-letter, and numerical codes for countries
 system      CSWpmhtmlfmt                     pm_htmlfmt - Format HTML as plaintext, PostScript or RTF
 application CSWpmhtmlparser                  pm_htmlparser - HTML parser class
 application CSWpmhtmltagset                  pm_htmltagset - data tables useful in parsing HTML
 system      CSWpmhtmltree                    pm_htmltree - Parser that builds a HTML syntax tree
 application CSWpmiocompressbase              pm_iocompressbase - Base Class for IO::Compress perl modules
 application CSWpmiocompresszlib              pm_iocompresszlib - Interface to allow reading and writing of gzip and zip files/buffers
 system      CSWpmiosocketinet6               pm_iosocketinet6 - Object interface for AF_INET|AF_INET6 domain sockets
 application CSWpmiosocketssl                 pm_iosocketssl - Perl extension for using OpenSSL
 system      CSWpmiozlib                      pm_iozlib - IO:: style interface to the Compress::Zlib package
 system      CSWpmipcountry                   pm_ipcountry - Fast lookup of country codes from IP address
 system      CSWpmldap                        pm_ldap - A client interface to LDAP servers
 system      CSWpmlibwww                      pm_libwww - Collection of perlmodules that provide an api to the World Wide Web
 application CSWpmmaildkim                    pm_maildkim - Signs/verifies Internet mail with DKIM/DomainKey signatures
 system      CSWpmmailspf                     pm_mailspf - Perl extension for Sender Policy Framework
 application CSWpmmailtools                   pm_mailtools - various mail manipulation modules
 system      CSWpmmimebase64                  pm_mimebase64 - Encoding and decoding of base64 strings
 system      CSWpmnetaddrip                   pm_netaddrip - Perl extension to manage IPv4 and IPv6 addresses and subnets
 application CSWpmnetdaemon                   pm_netdaemon - Perl extension for portable daemons
 application CSWpmnetdns                      pm_netdns - Perl interface to the DNS resolver
 application CSWpmnetip                       pm_netip - Perl extension for manipulating IPv4/IPv6 addresses
 application CSWpmnetssleay                   pm_netssleay - extension for using OpenSSL
 application CSWpmplrpc                       pm_plrpc - Perl extension for writing perl RPC servers and clients
 system      CSWpmsocket6                     pm_socket6 - IPv6 related part of the C socket.h defines and structure manipulators
 application CSWpmuri                         pm_uri - Uniform Resource Identifiers (absolute and relative)
 application CSWpmversion                     pm_version - Perl extension for Version Objects
 system      CSWpmxmlnssupp                   pm_xmlnssupp - Simple generic namespace support class
 application CSWpmxmlparser                   pm_xmlparser - A perl module for parsing XML documents
 system      CSWpmxmlsax                      pm_xmlsax - Simple API for XML
 application CSWspamassassin                  spamassassin - A mail filter which attempts to identify spam using text analysis
 application CSWzlib                          zlib - Zlib Data Compression Library
SpamAssassin インストール後の設定については、/opt/csw/doc/spamassassin/README.CSW に記載がありますので、そちらをご覧下さい。

SJSMS では、SpamAssassin の spamd を利用しますので、上記ファイルを確認後、 rc script などで spamd を起動させます。

spamd が起動したら、いよいよ SJSMS の設定を行いましょう。

まず、SJSMS が SpamAssassin を使用するために option.dat に以下の記述を 行います。
\* /opt/SUNWmsgsr/config/option.dat

 ! for Spamassassin
 spamfilter1_config_file=/opt/SUNWmsgsr/config/spamassassin.opt
 spamfilter1_library=/opt/SUNWmsgsr/lib/libspamass.so
 spamfilter1_optional=1
 spamfilter1_string_action=data:,require ["addheader"];addheader "X-SJSMS-Spamscore: $U";
spamfilter1_config_file にて、spamassassin に対する SJSMS の設定ファイルを 指定します。
spamfilter1_library にて、SpamAssassin を利用するための SJSMS ライブラリを 指定します。
spamfilter1_optional=1 とする事で、spamd に正しく接続できなかった際に、 スパム判定を省略して、メール配送処理を継続する設定になります。
spamfilter1_string_action にて、spamd から返ってきた結果の処理を指定します。
この例では、X-SJSMS-Spamscore というメールヘッダを追加し、SpamAssassin の判定 結果のスコアを入れています。

次に spamfilter1_config_file に指定したファイルに以下の設定を記述します。
\* /opt/SUNWmsgsr/config/spamassassin.opt

 host=127.0.0.1
 port=785
 mode=2
 debug=1
host に spamd が起動しているホストの IP Address を指定します。
同様に、port に spamd が待機している port を指定します。
mode=2 は、SpamAssassin によって確認したメールがスパムであると判断 されたかどうかに係らず、判定結果のスコアを返す設定になります。
debug=1 は、debug 出力有りの設定ですので、必要なければいりません。

ここまでで、SJSMS から SpamAssassin を利用する準備は整いましたので、 次にどのメールに対して SpamAssassin の判定を通すかの設定を行います。

今回は、channel に対して設定してみましょう。

この SJSMS ホストの Mailbox に保存されるメールは、ims_ms チャネルを 通って、Mailbox に保存されますので、ims_ms チャネルに入るメールを SpamAssassin によって確認させます。

imta.cnf の ims_ms チャネルにキーワード "destinationspamfilter1optin spam" を追加します。
\* /opt/SUNWmsgsr/config/imta.cnf

 !
 ! ims-ms
 ims-ms defragment subdirs 20 notices 1 7 14 21 28 backoff "pt5m" "pt10m" "pt30m"
  "pt1h" "pt2h" "pt4h" maxjobs 2 pool IMS_POOL fileinto $U+$S@$D 
  destinationspamfilter1optin spam
 ims-ms-daemon
つぎに、インターネット上に出て行くメールに対しても SpamAssassin を通したい場合は、同様に tcp_local チャネルに対してもチャネルキーワード を追加してください。
\* /opt/SUNWmsgsr/config/imta.cnf

 !
 ! tcp_local
 tcp_local smtp nomx daemon smarthost.nonedomain.com nochunkingclient
  nochunkingserver single_sys remotehost inner switchchannel
  identnonenumeric subdirs 20 maxjobs 7 pool SMTP_POOL maytlsserver
  maysaslserver saslswitchchannel tcp_auth missingrecipientpolicy 0
  loopchec destinationspamfilter1optin spam
最後に Mailbox に保存されるメールの SpamAssassin スコアに応じて、 スパムフォルダに移動させる設定を行いましょう。

これは、チャネルレベルに設定可能な SIEVE フィルタにて行う事が出来ます。
先ほどの imta.cnf ファイルの ims_ms チャネルにキーワード "destinationfilter file:///opt/SUNWmsgsr/config/ims-ms.filter" を追加します。
\* /opt/SUNWmsgsr/config/imta.cnf

 !
 ! ims-ms
 ims-ms defragment subdirs 20 notices 1 7 14 21 28 backoff "pt5m" "pt10m" "pt30m"
  "pt1h" "pt2h" "pt4h" maxjobs 2 pool IMS_POOL fileinto $U+$S@$D 
  destinationspamfilter1optin spam destinationfilter file:///opt/SUNWmsgsr/config/ims-ms.filter
 ims-ms-daemon
次に、ファイル "/opt/SUNWmsgsr/config/ims-ms.filter" に SIEVE フィルタ を定義します。
\* /opt/SUNWmsgsr/config/ims-ms.filter

 require ["spamtest","relational","comparator-i;ascii-numeric","fileinto"];
 if spamtest :value "ge" :comparator "i;ascii-numeric" "5" {fileinto "spam";}
 else {keep;}
上記の SIEVE フィルタでは、スパム判定のスコアが "5" 以上であった場合、 IMAP 上の "spam" フォルダへ移動、"5" 以下であった場合、通常通り配送 (INBOX へ保存)を行うフィルタになります。

同様にインターネットへ出て行くメールについてもスコアに応じたフィルタを 行う場合は、チャネルキーワードと、SIEVE フィルタを作成してください。
\* /opt/SUNWmsgsr/config/imta.cnf

 !
 ! tcp_local
 tcp_local smtp nomx daemon smarthost.nonedomain.com nochunkingclient
  nochunkingserver single_sys remotehost inner switchchannel
  identnonenumeric subdirs 20 maxjobs 7 pool SMTP_POOL maytlsserver
  maysaslserver saslswitchchannel tcp_auth missingrecipientpolicy 0
  loopchec destinationspamfilter1optin spam
  destinationfilter file:///opt/SUNWmsgsr/config/tcp_local.filter

\* /opt/SUNWmsgsr/config/tcp_local.filter

 require ["spamtest","relational","comparator-i;ascii-numeric","reject"];
 if spamtest :value "ge" :comparator "i;ascii-numeric" "5" {reject "This E-mail was judged spam. ";}
 else {keep;}
上記の SIEVE フィルタでは、スパム判定のスコアが "5" 以上であった場合、 メール配送を拒否、"5" 以下であった場合、通常通り配送を行うフィルタに なります。

ここまでの設定がすべて完了したら、MTA 設定の再構成・再起動を行います。
 # imsimta cnbuild
 # stop-msg ; start-msg
SpamAssassin 自体はオープンソースソフトウェアになりますので、比較的 容易に試すことが出来ると思います。是非お試し下さい。

ご参考 : Sun Java System Messaging Server 6.3 管理ガイド
※ SpamAssassin 自体は Sun からサポートされるわけでは無い事をご注意ください。
About

Search

Archives
« 4月 2014
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今日