labunix's blog

labunixのラボUnix

Fortigateのスパムフィルタの正規表現、ワイルドカードを試してみる。

■Fortigateのスパムフィルタの正規表現、ワイルドカードを試してみる。

# get system status | grep ^Ver
Version: FortiGate-80C v5.2.3,build0670,150318 (GA)

■SMTPのアクションをタグにして、件名に「[Spam]」というタグを入れてみる。
 ちなみにデフォルトは単に「spam」。

# show spamfilter profile
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回以上の繰り返し「*」なので、順番に注意。

# show spamfilter bwl
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 
#!/bin/bash

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)に転送するポリシーを作成。

# show | grep -f Vmail
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文字以上の繰り返し」の意味を持つワイルドカードを使う。

# show spamfilter bwl | grep -f nonespam
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,