2022/12/24(土)メールサーバの中規模改修と基礎知識(2)~ SpamAssassin
2022/12/25 8:14
具体的には、電子メールヘッダを含めた電子メールメッセージ全体を与え、各種のテストを行い、その結果を spam 度合値として、判定値を提示するような動作になります。
概念図(電子メールメッセージは、① → ② のルートで流れる)
① ①上図のように、サーバサイドでは、spamd をデーモン形式で稼働させておき、spamc というクライアントプログラムにて、受信した電子メールメッセージ全体を、spamd に垂れ流し、メッセージの電子メールヘッダ先頭にその判定値が付加されたものが与えたメッセージ全体と共に出力される挙動になります。
spamc《チェック対象の電子メールメッセージ全体》===> socket通信 ===> spamd(SpamAssassin 本体)
《チェック結果を含む電子メールメッセージ》<=== socket通信 <===
② ②
spamc から見ると、標準入力(stdin) に電子メールメッセージを流し込み、標準出力(stdout)に結果が出てくるような挙動になります。
SpamAssassinは、下図のように X-Spam-Checker-Version・X-Spam-Level・X-Spam-Status という3つのメールヘッダを処理結果として付加します。
このうち、X-Spam-Status というメールヘッダ行が重要で、例示では、「score=-0.6」が spam 度合判定値、「required=4.0」が、spam と見做すしきい値で、この値は別途個別設定出来ます。
電子メール配送の最終段階で、このメールヘッダ部分を参照して、spam メール隔離か通常配送かを決定し、処理する仕組みになります。
「autolearn=ham」というのは、『spam ではないと自動的にパターン学習した』という意味で、spam として見做されると、ここは「autolearn=spam」という表示になります。
「autolearn_force=no」は、SpamAssassin の自動学習機能の如何に関わらず、強制的に「spam である」と学習させる判定値で、この例では「required=4.0」以上の場合に強制的に SpamAssassin に spam メールパターンの学習をさせる挙動になります。
インストール
インストール作業は、必ず root アカウントで行います。また、SpamAssassin は、Perl 上で動作するため、事前に Perl 5.26 以降が必要です。
FreeBSD,NetBSD 他のUnix系OS、Linux系OSにおいては、Perl をパッケージでインストールしても問題はないです。
お勧めは、現時点(2022/12/24 現在)で最新バージョンの Perl 5.36。
FreeBSD だと、Ports で以下の手順でインストールするのが確実。(依存パッケージが先に自動的にインストールされる)
# cd /usr/ports/lang/perl5.36 # make install # make clean
また、インストールに2つの方法がありますが、現状では後者の方法(方法その2)しかまともに出来ないみたいです。(当方の環境にて)
○ 方法その1(動作に必要な依存モジュールは自動的に探してインストールされる):
# perl -MCPAN -e shell cpan> install Mail::SpamAssassinこの方法だと、test 段階で、'spamd が見つからない' とメッセージが出て test自体がなかなか終わらない。
3.4系ではこの問題は出ません。なので、次に示す方法が有効:
○ 方法その2
・まず SpamAssassin の公式ダウンロードページ(https://spamassassin.apache.org/downloads.cgi)から、
Mail-SpamAssassin-4.0.0.tar.gz または、Mail-SpamAssassin-4.0.0.tar.bz2 をダウンロードし、インストール機器上にアップロードする。
・この方法の場合、CPAN で予め、下記モジュールをインストールしておいた方がよい:
# perl -MCPAN -e shell cpan> install NetAddr::IP cpan> install HTML::Parser cpan> install Digest::SHA1 cpan> install IP::Country cpan> install IP::Country::DB_File cpan> install Net::Ident cpan> install IO::Socket::SSL cpan> install LWP::UserAgent cpan> install BSD::Resource cpan> install Mail::SPF cpan> install Mail::DKIM cpan> exit・次に、下記コマンドを順に実行する。
# cp Mail-SpamAssassin-4.0.0.bz2 /usr/locall/src # cd /usr/local/src # tar xvzf Mail-SpamAssassin-4.0.0.bz2 # cd Mail-SpamAssassin-4.0.0 # perl Makefile.PL # make # make installインストール完了後、方法その1・方法その2の何れであっても、必ず以下のコマンドを実行しておきます。
# rehash # sa-update --no-gpgまた、運用時は、SpamAssassin 自体が意図しているセキュリティポリシーに合わせるため、ここで専用のユーザを予めvipw や useradd コマンドで作っておきます。
vipw の場合は、編集画面で、下記の行を追加しておきます:
spamd::783:783::0:0:SpamAssassin Daemon:/nonexistent:/usr/sbin/nologinvipw でユーザ追加した場合は、/etc/group ファイルに下記の行を追加しておきます:
spamd:*:783:ユーザID、グループIDは、783 にこだわる必要はありませんが、当然のことながら、ユーザID・グループIDが他と重複しないように注意です。
更に vipw でユーザ追加した場合は、つまらないセキュリティホールを作らないために、下記コマンドも一応実行しておきます:
# passwd spamdvipw,passwd,useradd コマンドは、どれも必ずroot ユーザ上で行います。
起動・停止スクリプトの設置(FreeBSD に特化している項目)
このスクリプトは一度作っておくと、バージョンアップの際に再作成の必要はありません。○ spamd の起動スクリプト
/usr/local/etc/rc.d ディレクトリ配下に、sa-spamd のファイル名で下記内容を作成します。
1行目から6行目( KEYWORD までの行 ) は、一見するとコメント行そのものですが、意味を持っているため削除しないようにしてください。/usr/local/etc/rc.d ディレクトリ配下のスクリプトは、全てこの挙動になります。
また、実行権限を与えることを忘れないようにしてください:
#!/bin/sh # PROVIDE: spamd # REQUIRE: LOGIN # BEFORE: mail # KEYWORD: shutdown # # Add the following line to /etc/rc.conf to enable spamd: # # spamd_enable="YES" # # You can pass flags to spamd with spamd_flags="..." # To change the user that spamd runs as, use # # spamd_flags="-u USER [-H /path/to/home... we suggest /var/spool/spamd]" # # To keep your user-config in a SQL database, use # # spamd_flags="-Q" # # and remove -c (auto-create user preference files). # . /etc/rc.subr name=spamd rcvar=${name}_enable extra_commands="reload" load_rc_config $name start_precmd="precmd" restart_precmd="precmd" stop_cmd="spamd_stop" pidfile=${spamd_pidfile:-"/var/run/${name}/${name}.pid"} # Set defaults : ${spamd_enable:="NO"} : ${spamd_flags:="-c -u spamd -r ${pidfile} -x --virtual-config-dir=/var/mail/%d/%l/spamassassin/spamd"} command=/usr/local/bin/${name} command_args="-d -r ${pidfile}" command_interpreter="/usr/local/bin/perl" required_dirs="/usr/local/share/spamassassin" precmd() { if [ ! -d /var/run/${name} ]; then mkdir -p /var/run/${name} chown spamd:spamd /var/run/${name} fi } spamd_stop() { kill -INT `cat /var/run/spamd/spamd.pid` echo ' Stop sa-spamd 4.0.0 ' } run_rc_command "$1"あとは、簡単な設定作業が残っていますが、メールサーバ構築作業全体の最後のほうで行います。
なので、とりあえずこのフェーズは完了です。