■Fortigateのスパムフィルタの正規表現、ワイルドカードを試してみる。
Version: FortiGate-80C v5.2.3,build0670,150318 (GA)
■SMTPのアクションをタグにして、件名に「[Spam]」というタグを入れてみる。
ちなみにデフォルトは単に「spam」。
config spamfilter profile
edit "default"
set comment "Malware and phishing URL filtering."
set spam-filtering enable
set options spambwl spamfsip spamfssubmit spamfschksum spamfsurl spamfsphish
config imap
set tag-msg "[Spam]"
end
config pop3
set tag-msg "[Spam]"
end
config smtp
set action tag
set tag-msg "[Spam]"
end
set spam-bwl-table 1
next
end
■正規表現(regexp)では直前の文字の0回以上の繰り返し「*」なので、順番に注意。
config spamfilter bwl
edit 1
set name "default"
config entries
edit 1
set type email
set action clear
set pattern-type regexp
set email-pattern ".*nonespam.example.jp"
next
edit 2
set type email
set pattern-type regexp
set email-pattern ".*spam.example.jp"
next
end
next
end
■以下のようなドメインでスパムメール送信してみる。
$ cat spamtestmail.sh
RCPT_TO=labunix@myhome.example.jp
TARGET=192.168.1.250
for domainlist in \
nonespam.example.jp \
mail.nonespam.example.jp \
nonenonespam.example.jp \
spam.example.jp \
mail.spam.example.jp \
nospam.example.jp \
;do \
(sleep 1;echo "ehlo localhost"; \
sleep 1;echo "mail from:sample@"${domainlist}; \
sleep 1;echo "rcpt to:"${RCPT_TO}; \
sleep 1;echo "data"; \
sleep 1;echo "Subject: Hello,"`date '+%Y/%m/%d %H:%M:%S'`; \
sleep 1;echo "http://blacklist.com"; \
sleep 1;echo "."; \
sleep 1;echo "quit"; \
) | telnet $TARGET 25
done
unset TARGET RCPT_TO domainlist
exit 0
■wan1のバーチャルIP(192.168.1.250:25)で受けて、
Internalのメールサーバ(172.31.31.254:25)に転送するポリシーを作成。
config firewall vip
edit "Vmail" <---
set extip 192.168.1.250
set extintf "wan1"
set portforward enable
set mappedip "172.31.31.254"
set extport 25
set mappedport 25
next
end
config firewall policy
edit 2
set srcintf "wan1"
set dstintf "internal"
set srcaddr "all"
set dstaddr "Vmail" <---
set action accept
set schedule "always"
set service "SMTP"
set utm-status enable
set spamfilter-profile "default"
set profile-protocol-options "default"
set ssl-ssh-profile "certificate-inspection"
set nat enable
next
end
■正規表現として、想定したとおりのスパム検知であることを確認。
0回以上のマッチのため、「nonespam.example.jp」と
そのサブドメインを考慮した「mail.nonespam.example.jp」を除外すると、
実際には想定外のサブドメインでは無い「nonenonespam.example.jp」にもマッチしてしまう。
$ ./spamtestmail.sh
$ grep "^Subject\|^Return" /var/spool/mail/labunix
$ grep -A 1 "^Subject\|Return" /var/spool/mail/labunix | \
nkf -w | grep -v "^-\|^http\|^X-Original-To"
Return-Path: <sample@nonespam.example.jp>
Subject: Hello,2015/06/18 22:21:50
Return-Path: <sample@mail.nonespam.example.jp>
Subject: Hello,2015/06/18 22:21:58
Return-Path: <sample@nonenonespam.example.jp>
Subject: Hello,2015/06/18 22:22:06
Return-Path: <sample@spam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:22:14
Return-Path: <sample@mail.spam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:22:23
Return-Path: <sample@nospam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:22:31
■サブドメインではない「nonenonespam.example.jp」を除外して欲しくない場合は、
「@」を使ってもう少し厳密に書くか、
元々「1文字以上の繰り返し」の意味を持つワイルドカードを使う。
config spamfilter bwl
edit 1
set name "default"
config entries
edit 1
set type email
set action clear
set pattern-type regexp
set email-pattern "@nonespam.example.jp" <---
next
edit 2
set type email
set action clear
set email-pattern "@*.nonespam.example.jp" <---
next
end
next
end
■実際にやりたい想定通りの動作であることを確認。
「mail.nonespam.example.jp」のようなサブドメインは任意で許可するが、
「nonenonespam.example.jp」のようなドメイン名が異なる場合はスパムとして判断。
$ grep -A 1 "^Subject\|Return" /var/spool/mail/labunix | \
nkf -w | grep -v "^-\|^http\|^X-Original-To"
Return-Path: <sample@nonespam.example.jp>
Subject: Hello,2015/06/18 22:51:20
Return-Path: <sample@mail.nonespam.example.jp>
Subject: Hello,2015/06/18 22:51:28
Return-Path: <sample@nonenonespam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:51:36
Return-Path: <sample@spam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:51:44
Return-Path: <sample@mail.spam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:51:53
Return-Path: <sample@nospam.example.jp>
Subject: [Spam] Hello,2015/06/18 22:52:01
■メールヘッダにはFortigateを通った証の「X-Quarantine-ID」が付いて、
メール本文にはFortigateの「X-SpamInfo: email-address,」というスパム判定の理由が
文末に追加される。
$ grep -A 1 "X-SpamInfo\|X-Quarantine-ID\|^Return\|^Subject" \
/var/spool/mail/labunix | \
nkf -w | grep -v "^-\|^X-Original-To\|^X-Virus-Scanned\|^http\|^\$"
Return-Path: <sample@nonespam.example.jp>
X-Quarantine-ID: <Q0n42_EVXG_M>
Subject: Hello,2015/06/18 22:51:20
Return-Path: <sample@mail.nonespam.example.jp>
X-Quarantine-ID: <pGseMgxAr5Dm>
Subject: Hello,2015/06/18 22:51:28
Return-Path: <sample@nonenonespam.example.jp>
X-Quarantine-ID: <gcGax_eLe8xk>
Subject: [Spam] Hello,2015/06/18 22:51:36
X-SpamInfo: email-address,
Return-Path: <sample@spam.example.jp>
X-Quarantine-ID: <nzARL5m29lVk>
Subject: [Spam] Hello,2015/06/18 22:51:44
X-SpamInfo: email-address,
Return-Path: <sample@mail.spam.example.jp>
X-Quarantine-ID: <aCoe3KAV3nqN>
Subject: [Spam] Hello,2015/06/18 22:51:53
X-SpamInfo: email-address,
Return-Path: <sample@nospam.example.jp>
X-Quarantine-ID: <tK5X8YdmFavp>
Subject: [Spam] Hello,2015/06/18 22:52:01
X-SpamInfo: email-address,