SpamFilter

 article  Comments Off on SpamFilter
Feb 262006
 

maildrop設定

bogofilterbsfiltermaildropと組み合わせて使う場合の設定内容です。

bogofilterの場合

bogofilterをmaildropと使う方法については、maildrop 利用メモ or tips?に詳しい情報があります。
bogofilterは日本語が通らないので、kakasiなどでわかち書きしてから判定させます。

~/.mailfilter設定

BOGORESULT=`nkf -ZSme | kakasi -w | bogofilter -epu \
  | reformail -X'X-Bogosity:'`

xfilter "reformail -i'${BOGORESULT}'"

if (/^X-Bogosity: Yes/:h)
  to "$MAILDIR/.Spam/"

ややこしいですが、最初にkakasiでわかち書きしたメールをbogofilterに判定させて結果のヘッダ値のみを取り出し、それをxfilterでインサートしていることになります。
xfilterでnkf、kakasi、bogofilterを指定すると、わかち書きされたメールが届いて悲しい思いをしますのでご注意ください。

bsfilterの場合

bogofilterと違ってbsfilterはそのままで日本語が通りますので、xfilterに直接指定できます。

~/.mailfilter設定

MAILDIR=".maildir"
DEFAULT="$MAILDIR/"

xfilter "bsfilter --auto-update --pipe --insert-flag --insert-probability"

if (/^X-Spam-Flag: Yes/:h)
  to "$MAILDIR/.Spam/"

WanderlustからのSpamFilter利用

Wanderlustではwl-spamという外部spamフィルタプログラムへのフロントエンドを提供されています。
Meadow上のWanderlustでもssh経由(PuTTYのplinkコマンド)で利用することができます。

以下は~/.wlでの指定です。

bogofilterの場合

bogofilterを使うときは以下のようなwrapperスクリプトを用意しておいて、プログラムに指定しています。
/usr/local/bin/bogowrapper

#!/bin/sh
nkf -ZSme | kakasi -w | bogofilter $@

~/.wl設定

(require 'wl-spam)
(setq elmo-spam-scheme 'bogofilter)
(setq elmo-spam-bogofilter-program "C:/PuTTY/PLINK.EXE")
(setq elmo-spam-bogofilter-args '("server.example.com"
                                  "/usr/local/bin/bogowrapper")
(add-to-list 'elmo-spam-header-good-alist '("X-Bogosity" . "No"))
(add-to-list 'elmo-spam-header-spam-alist '("X-Bogosity" . "Yes"))

elmo-spam-header-{good,spam}-alistは、初期値がX-Spam-FlagになっているのでbogofilterにあわせてX-Bogosityを追加しています。

bsfilterの場合

~/.wl

(require 'wl-spam)
(setq elmo-spam-scheme 'bsfilter)
(setq elmo-spam-bsfilter-shell-program "C:/PuTTY/PLINK.EXE")
(setq elmo-spam-bsfilter-shell-switch "server.example.com")
(setq elmo-spam-bsfilter-program "bsfilter")

参考

Wanderlust 日本語マニュアル – 12. Spam フィルタ
Wanderlust FAQ 日本語版 – 設定編 – SpamAssassin をリモートで使いたい

学習方法

bogofilter

Bogofilter FAQHow do I start my bogofilter training?にいくつか方法が紹介されています。

そのうちMethod 2のbogominitrain.plを使う方法についてはLinux とりわけ Debian GNU/Linuxが参考になります。

Bogofilter FAQの通りに実行してみます。

$ /usr/share/bogofilter/contrib/bogominitrain.pl \
> -fnv ~/.bogofilter mbox.good mbox.spam '-o 0.9,0,3'

Starting with this database:
                                 spam   good
.MSG_COUNT                       5535 108403

H -- Training spam message 8.
H -- Training spam message 10.
H -- Training spam message 27.

End of run #1 (in 2782s):
Read 204 ham mails and 53 spam mails.
Added 0 ham mails and 3 spam mails to the database.
                                 spam   good
.MSG_COUNT                       5538 108420

False negatives: 0

Mailman Tips

 article  Comments Off on Mailman Tips
Feb 262006
 

設定内容のテキスト化

config_listコマンドで設定内容をテキストに書き出したり、テキストから読み込ませることができます。

$ config_list -o ${config_filename} ${listname}

でテキストファイルに出力されます。これをエディタ等で変更して

$ config_list -i ${config_filename} ${listname}

とすることでWebインターフェースを使わずに設定を変更することができます。

通し番号を変更する

こちらの情報そのままに、以下の手順で変更できます。

$ withlist ${listname}
${listname} のリストを読み込中 (ロック解除)
変数 `m' が ${listname} の MailList インスタンスです
>>> m.Lock()
>>> m.post_id
5.0
>>> m.post_id = 1.0
>>> m.Save()
>>> ^D
リストをロック解除 (保存はしてません): ${listname}
最終処理中
$

post_idに設定された値が次の投稿に付与される番号になります(何番まで投稿されたかではありません)。

Feb 052006
 

maildropで

cc "!転送先メールアドレス"

を使って転送しようと思ったら、

k158SUIZ014678: to="|/opt/csw/bin/maildrop", ctladdr=user@localhost (1000/1), delay=00:01:37, xdelay=00:00:00, mailer=prog, pri=120390, dsn=4.0.0, stat=Deferred: prog mailer (/bin/sh) exited with EX_TEMPFAIL

とエラーになってしまいました。
転送先が携帯だったせいもあって余計なことを考えちょっと悩んだのですが、sendmailにPATHが通ってなかったのが原因でした。
.mailfilterにSENDMAILの定義を追加して解決です。

PATH=/bin:/usr/bin:/usr/local/bin
SENDMAIL=/usr/sbin/sendmail

もしくは、

cc "|/usr/sbin/sendmail 転送先メールアドレス"

のようにしてもOK。

 Posted by at 6:18 pm  Tagged with:
Jan 102006
 

ULTRA 10には結局Solaris 10をいれて、とりあえず自宅メールサーバに仕立てました。

CSWパッケージ導入

ソースからコンパイル、インストールして導入していくのは大変なので、Blastwave.orgで提供されるバイナリパッケージを利用します。
こちらの手順にしたがって環境を構築すると、pkg-getコマンドでバイナリパッケージの導入、アップデートがおこなえるので便利です。
メール環境構築に必要な、以下のパッケージ群(と依存パッケージ)を導入します。

  • CSWcourierimap – Courier-IMAP
  • CSWmaildrop – maildrop
  • CSWfetchmail – fetchmail

SendmailのMaildir対応

IMAPサーバにはCourierを使いますので、Maildir配送となるようにsendmail.cfを変更します。
Sendmail で Maildir を使う」の情報を参考に、ローカル配送プログラムを/opt/csw/bin/maildropに変更し、/opt/csw/etc/maildrop/maildroprcを用意します。

# cd /etc/mail/cf/cf
# cp sendmail.mc sendmail-maildrop.mc; vi sendmail-maildrop.mc
# diff -u sendmail.mc sendmail-maildrop.mc
--- sendmail.mc Sat Jan 22 08:30:45 2005
+++ sendmail-maildrop.mc        Tue Jan 10 12:22:07 2006
@@ -26,6 +26,7 @@
 OSTYPE(`solaris8')dnl
 DOMAIN(`solaris-generic')dnl
 define(`confFALLBACK_SMARTHOST', `mailhost$?m.$m$.')dnl
+FEATURE(`local_procmail', `/opt/csw/bin/maildrop', `maildrop -d $u')
 MAILER(`local')dnl
 MAILER(`smtp')dnl

# /usr/sfw/bin/gmake sendmail-maildrop.cf
# cp -p sendmail-maildrop.cf /etc/mail/sendmail.cf
# svcadm refresh smtp:sendmail

ここまでやってから気がついたのですが、/usr/ccs/bin/makeを使えとMakefileに書かれていました 😛

bogofilter導入

SPAMフィルタに利用しているbogofilterと、日本語わかちがきに必要となるkakasi、nkfはCSWでパッケージングされていないため、ソースからコンパイル、インストールします(spamassassinはバイナリパッケージがあります)。
ちなみに.mailfilterは以下のような記述にしています(抜粋)。

PATH=/bin:/usr/bin:/usr/local/bin:/opt/csw/bin

MAILDIR="Maildir"
DEFAULT="$MAILDIR/"

BOGORESULT=`nkf -ZSme|kakasi -w|bogofilter -epu|reformail -X'X-Bogosity:'`
xfilter "reformail -i'${BOGORESULT}'"
if (/^X-Bogosity: Spam/:h)
  to "$MAILDIR/.Spam/"

bogofilterのwordlist.dbは旧メールサーバでdump(bogoutil)してから再インポートします。

famのエラー対応

このままだとFAQにもなっているfamのエラーメッセージが出力されます
解決方法はFAQの通りなのですが、CSWfamパッケージは依存パッケージとして導入されており、/etc/inetd.confにもエントリができています。
ちょっと悩んだのですが、Solaris 10の場合/etc/inetd.confにエントリを追加するだけでは不十分でinetconvを実行してsmf管理下にする必要があったようです。

# inetconv
inetconv: Notice: Service manifest for 100235/1 already generated as /var/svc/manifest/network/rpc/100235_1-rpc_ticotsord.xml, skipped
inetconv: Notice: Service manifest for 100083/1 already generated as /var/svc/manifest/network/rpc/100083_1-rpc_tcp.xml, skipped
inetconv: Notice: Service manifest for 100068/2-5 already generated as /var/svc/manifest/network/rpc/100068_2-5-rpc_udp.xml, skipped
sgi_fam/1-2 -> /var/svc/manifest/network/rpc/sgi_fam_1-2-rpc_tcp.xml
Importing sgi_fam_1-2-rpc_tcp.xml ...Done

これでfamのエラーも出なくなりました。

Aug 222005
 

bogofilterでSPAM判定されたメール群をチェックしていたら

■スパムと格闘する運用管理者の嘆き「覆面座談会」/「インターネットVPNサービス」の基礎

というメールがキーマンズネットから届いてました 😛

メルマガや広告メールは大抵スパム判定されちゃいます。かといってFromでnon SPAMと判定するのもイヤだし。困ったもんです。

いわゆる出会い系サイト関係のSPAMメールが急増しているような気がします。どこから漏れるんでしょうねぇ。

 Posted by at 3:04 am  Tagged with:
Aug 212005
 

DovecotはFedora Core 1の標準POP/IMAPサーバになったときから気になっていたのですが、当時(0.99.10)はSSL証明書によるクライアント制限が未実装だったのでCourierから移行できませんでした。
現在はssl_verify_client_certパラメータで制御できるようになっているので、1.0リリース版が出たら試してみようかと思います。
でもDebian、Courierで順調に動いているのでわざわざコンパイルするのも面倒…暇ができたら考えます 😉

 Posted by at 2:39 am  Tagged with:

Mailman非公開リストのNamazu検索

 article  Comments Off on Mailman非公開リストのNamazu検索
Mar 252005
 

最近、自分が管理を手伝っているサーバにMailmanを入れました。
今まではMajordomoで運営していてNamazuで検索可能にしていたのですが、MailmanでもNamazu検索できるようにしたいものの、非公開リストに対する認証をどうするかが悩みのタネでした。
Mailmanの標準機能で認証したあとNamazuの検索画面にいける方法があればいいと思っていたのですが、日本語Mailman利用者MLにもろヒットする情報がありました。

Cgi/private.pyの改造で動作も不完全なようですが、こちらを参考にするしか手がなさそうです。

Oct 162004
 

LDAPを使った統合認証を目指すべく、まずはIMAPサーバの認証をLDAPに格納したパスワードで実施するようにしてみました。
関連するパッケージはcourier-authldap、courier-imap、slapd (OpenLDAP)になる。

  1. ユーザのuserPassword読み取り用LDAPアカウントを作成する
  2. slapdのACLで(/etc/ldap/slapd.conf)、用意したLDAPアカウントにuserPasswordのread権限を付与する
  3. LDAPアカウント構造にあわせて/etc/courier/authldaprcを設定
    • LDAP_BINDDNとLDAP_BINDPWに、userPassword読み取り用LDAPアカウントを設定
    • LDAP_CLEARPWにuserPasswordを指定(ファイルのコメントにあるとおり、クリアパスワードにすることでCRAM-MD5認証ができるようになる)
  4. 利用ユーザのuserPasswordをクリアテキストで再設定する

これでCourier-IMAP、OpenLDAP連携によるCRAM-MD5認証がおこなえるようになります。
LDAPデータベースにクリアパスワードを格納するのは賛否両論ありそうですが、わたしは

  • SSLやるにはサーバの能力が厳しめなのでCRAM-MD5認証にしたかった
  • でもLDAPへの認証統合化も目指したい

といった動機からクリアパスワード格納を選択しました。

なお、こちらのroughtrade.net / dovecotでは、Dovecot用のCRAM-MD5認証パッチを配布しているようです。
この場合もLDAPにクリアパスワードを格納すれば、LDAPバックエンドでCRAM-MD5認証が可能になるのかな 😕

Oct 162004
 

SSLのクライアント証明書を強制し、なおかつ特定の認証局で署名したクライアント証明書でなければ接続できないようにする方法。認証局の設置やSSLそのものの設定は割愛します。

Apacheの場合

httpd.conf等で以下のように設定します。

  • SSLCACertificateFileに認証局の証明書ファイルを指定
  • SSLVerifyClient requireでクライアント証明書を強制
  • SSLVerifyDepth 1でクライアント証明書の検証時に遡る認証局を制限(認証局が自己署名によるものなら実質不要)

Courier-IMAPの場合

imap-sslで以下のように設定します。

  • TLS_TRUSTCERTSに認証局の証明書ファイルを指定
  • TLS_VERIFYPEER=REQUIREPEERを指定

これで認証局で署名されたクライアント証明書が提示されないと、接続を拒否するようになります。

opensslコマンドで接続すると、こんな感じ。

$ openssl s_client -connect servername:443
CONNECTED(00000003)
depth=1 /C=JP/O=Organization
verify error:num=19:self signed certificate in certificate chain
verify return:0
15549:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1052:SSL alert number 40
15549:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:226:
$ 

証明書を使用すると接続は成功します。

$ openssl s_client -connect cancer:443 -cert client.crt -key client.key
CONNECTED(00000003)
depth=1 /C=JP/O=Organization
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
:

Meadowで円マークを入力

 article  Comments Off on Meadowで円マークを入力
Oct 092004
 

MeadowでBDFフォントを使っている場合、例えばメールなどで円マークとバックスラッシュを区別して表示できるようになっている。

長年「表示はできるけど入力はみんなどうやってるんだろう?」と思っていたのだが、Mew-Win32のメールでは以前話題にあがっていたようだ。

[Mew-Win32 01530] Re: non ISO-2022-JP (Re: fiber, movemail on meadow1.04a1)

(define-key global-map "C-x9" 'jisx0201-input)
(defun jisx0201-input (&optional string)
  (interactive "sInput(ASCII only) ")
  (let ((count (length string))
	(pos 0))
    (while (> count 0)
      (cond
       ((functionp 'char-to-int)
	(insert (make-char 'latin-jisx0201 (char-to-int (aref string pos)))))
       ((functionp 'make-char)
	(insert (make-char 'latin-jisx0201 (aref string pos))))
       (t
	(insert (make-character lc-roman (aref string pos)))))
      (setq count (1- count))
      (setq pos (1+ pos)))))