まえがき
Postfix側での設定、フィルターには限界があるため、本稿ではamavisd-new、spamassassinの設定をしていく。動作させるための初期設定のお話ではないのであしからず。
amavisd-newの設定
vi /etc/amavis/conf.d/40-policy_banks
デフォルトではebayやamazon等海外ドメインのDKIM署名がホワイトリストとなっているが、利用しないサービスであればホワイトリストから外す。
誤判定されて迷惑メールボックスに配送されては困る送信者のドメインをMILD_WHITELISTに追加しておく・・・が、理由なく追加しない。運用環境の状況に合わせて記載。
@author_to_policy_bank_maps = ( {
# 'friends.example.net' => 'WHITELIST,NOBANNEDCHECK',
# 'user1@cust.example.net' => 'WHITELIST,NOBANNEDCHECK',
# '.ebay.com' => 'WHITELIST',
# '.ebay.co.uk' => 'WHITELIST',
# 'ebay.at' => 'WHITELIST',
# 'ebay.ca' => 'WHITELIST',
# 'ebay.de' => 'WHITELIST',
# 'ebay.fr' => 'WHITELIST',
# '.paypal.co.uk' => 'WHITELIST',
# '.paypal.com' => 'WHITELIST', # author signatures
# './@paypal.com' => 'WHITELIST', # 3rd-party sign. by paypal.com
# 'alert.bankofamerica.com' => 'WHITELIST',
# 'amazon.com' => 'WHITELIST',
# 'cisco.com' => 'WHITELIST',
# '.cnn.com' => 'WHITELIST',
# 'skype.net' => 'WHITELIST',
# 'welcome.skype.com' => 'WHITELIST',
# 'cc.yahoo-inc.com' => 'WHITELIST',
# 'cc.yahoo-inc.com/@yahoo-inc.com' => 'WHITELIST',
# 'google.com' => 'MILD_WHITELIST',
# 'googlemail.com' => 'MILD_WHITELIST',
'./@googlegroups.com' => 'MILD_WHITELIST',
# './@yahoogroups.com' => 'MILD_WHITELIST',
# './@yahoogroups.co.uk' => 'MILD_WHITELIST',
# './@yahoogroupes.fr' => 'MILD_WHITELIST',
# 'yousendit.com' => 'MILD_WHITELIST',
# 'meetup.com' => 'MILD_WHITELIST',
# 'dailyhoroscope@astrology.com' => 'MILD_WHITELIST',
#
# 海外のドメインは標準設定から無効化。以下は追記した設定。
# 本気で大事なところ以外は書かない方が良い。
'******.com' => 'MILD_WHITELIST',
'******.jp' => 'MILD_WHITELIST'
} );
amavisからのエラーメール対応
spamassassinを日本語に対応する設定にすると、Cron
から以下のようなメールがrootのアドレス宛に来る。
Wide character in print at /usr/share/perl5/Razor2/Logger.pm line 107.
対応のため、Razorスクリプト(Perl)中にutf-8にエンコードする工程を追記する。
vi /usr/share/perl5/Razor2/Logger.pm
長いので該当部分のみ抜粋。
# 13行目を追記
0008: use POSIX qw(strftime);
0009: use IO::File;
0010: # 2003/09/10 Anne Bennett: syslog of our choice (uses socket,
0011: # does not assume network listener).
0012: use Sys::Syslog;
0013: use Encode;
0014:
0015: # designed to be inherited module
# 107行目を入れ替え
0106: my $fd = $self->{fd};
0107: print $fd "$now_string$logstr"; # この行を削除
0107: print $fd encode('utf-8', "$now_string$logstr");
0108: }
spamassassinの設定
spamassassinの現在の設定。スコア7.5以上(デフォルトは5.0)をスパムと判断するようにしている。ベイズフィルタの学習状況、環境によって微調整。
rewrite_header Subject *****SPAM*****
add_header all Status _YESNO_, score=_SCORE_
report_safe 0
trusted_networks 192.168.0.0/16
required_score 7.5
normalize_charset 1
日本語メールのためのスコア調整
最終行に以下を追記。
# 日本語のための調整。
# TVD_SPACE_RATIO_MINFP:単語と単語の間に入るべきスペースが無い場合
# スコアが高くなる。もともと日本語はスペースを使わない文字文化なので
# スコアが高くなり誤判定の原因となります。
score TVD_SPACE_ENCODED 0.5
score TVD_SPACE_RATIO_MINFP 0.5
### WHITE_LIST
whitelist_from ******@******.ne.jp(誤判定されたメールアドレス)
### BLACKLIST
blacklist_from ******@******.ne.jp(許しがたいメールアドレス)
ホワイトリスト、ブラックリストは多くなりそうなら05_whitelist.cf
、10_blacklist.cf
ファイルを/etc/spamassassin
配下に作成して記述するのもアリ。
本文の語句ヒットでスコア定義を作成(spam判定)
メール本文の語句でオリジナルのスコア定義を作成する。実際に受信したスパムメールで、判定がされなかったものをよく見て、それらのメールにしかない共通の単語や語句を判定条件とする。スパムメールを排除したいのにスパムメールをよく読むようになるというこの矛盾・・・。
/etc/spamassassin
の下に***.cf
でファイルを作成すれば、起動時に読み込んでくれる。
vi /etc/spamassassin/70_user.cf
このオリジナル定義ファイルの書き方、日本語のソースがネット上に少なく、合ってるのか不安だったが、一応期待通りの動作をしてくれている。
body BODY_JA_EIGYOMAIL /突然の(ご連絡|御連絡|メール).*失礼(します|いたします|致します)/
describe BODY_JA_EIGYOMAIL I don't need these mails.
score BODY_JA_EIGYOMAIL 4.5
body BODY_JA_EIGYOAPO /(時間|時間を|機会を)(いただけ|頂け)(ませんか|ませんでしょうか|ないでしょうか)/
describe BODY_JA_EIGYOAPO I don't need these mails.
score BODY_JA_EIGYOAPO 3.0
body BODY_JA_SPAMLIER /配信停止/
describe BODY_JA_SPAMLIER You might be a spam sender.
score BODY_JA_SPAMLIER 1.0
本文の語句ヒットでスコア定義を作成(ham判定)
この語句があれば安全というスコア減点を定義する。社外の所属組織(何とか団体とかなんとか協会とか)や外部組織と連携してやっている事業等の語句があれば安全といえるかなぁ・・・。これも事業内容や運用環境に合わせて、且つ誤判定されてしまったメールを見て語句を決める。スパムメールには無くて安全メールに有る語句を探す。
vi /etc/spamassassin/75_safelist.cf
body BODY_JA_KYOUKAI /〇〇協会/
describe BODY_JA_KYOUKAI Safe mails from 〇〇.
score BODY_JA_KYOUKAI -5.0
body BODY_JA_RENGOU /〇〇連合/
describe BODY_JA_RENGOU Safe mails from 〇〇.
score BODY_JA_RENGOU -5.0
body BODY_JA_ZIGYOU /(〇〇事業|〇〇計画)/
describe BODY_JA_ZIGYOU Safe mails from 〇〇.
score BODY_JA_ZIGYOU -5.0
高スコアを自動的にREJECTする
あまりにもスコアが高いメールはスパム確定!
受け取る価値は無いので、文言を入れてREJECTする。
vi /etc/postfix/header_checks
add_header all Status _YESNO_, score=_SCORE_
を設定していればヘッダ情報にアスタリスクの数でスコアリングが挿入されるので、アスタリスクの数が何個以上をREJECTする、という設定をheader_checks
に記載する。以下の例は13個以上をREJECTするようにしている。
/^Received:.*127\.0\.0\.1.*/ IGNORE
/^Received:.*192\.168\..*/ IGNORE
# spamassassinの判定であまりにも高スコアなものはREJECTする
/X-Spam-Level: \*{13,}/ REJECT The Mail you sent was rejected because the spam score was too high.
しかし、なぜかこれが上手く動いてくれない・・・。なぜだろう??
2022年3月追記。postfix
がamavis
とやりとりする際に、ヘッダチェックをするかどうかの設定がamavis
だったかpostfix
だったかにあり、そこが関係するような気がする。困ってないので放置とする。
再起動して設定を反映する
systemctl restart amavisd-new spamassassin postfix
実際どうしてるの?
実際のサーバーでlsしてみた。
root@mydomain:~# ls /etc/spamassassin
65_debian.cf 73_body_rules.cf local.cf sa-update-hooks.d v312.pre v340.pre v343.pre
70_header_rules.cf 75_safelist.cf readme.txt sa-update-keys v320.pre v341.pre
71_senderlist_rules.cf init.pre sa-compile.pre v310.pre v330.pre v342.pre
実際はヘッダ情報、メールタイトル、送信元、内容文章、安全リストによるスコアリングを行い、最終的にスパム判定されたメールはdovecot sieve
で.Junk
ディレクトリへ自動振り分けしている。
70_header_rules.cf
タイトルの文字列でスコアリングするルール。業務で使用しているメールのためアマゾンや楽天からの連絡は来ないという前提。電力会社は利用していない所から来ないはず、というか利用している所からも来たことが無い。
header ORG_HD_SUBJ_FISHA subject =~ /business proposal/
describe ORG_HD_SUBJ_FISHA It looks FISHING.
score ORG_HD_SUBJ_FISHA 1.0
header ORG_HD_SUBJ_FISHB subject =~ /(個人情報|支払方法|支払い方法|カード).*(更新|問題|異常)/
describe ORG_HD_SUBJ_FISHB CardCamo FISHING.
score ORG_HD_SUBJ_FISHB 5.0
header ORG_HD_SUBJ_FISHC subject =~ /(関西|東北|東京|北陸)電力/
describe ORG_HD_SUBJ_FISHC It looks FISHING.
score ORG_HD_SUBJ_FISHC 3.0
header ORG_HD_SUBJ_FISHD subject =~ /purchase order/
describe ORG_HD_SUBJ_FISHD It looks FISHING.
score ORG_HD_SUBJ_FISHD 1.0
header ORG_HD_SUBJ_FISHE subject =~ /best deal/
describe ORG_HD_SUBJ_FISHE It looks FISHING.
score ORG_HD_SUBJ_FISHE 3.0
header ORG_HD_SUBJ_FISHF subject =~ /([aA]mazon|アマゾン|[rR]akuten|楽天).*(異常|状態|状況)/
describe ORG_HD_SUBJ_FISHF AmazonCamo FISHING.
score ORG_HD_SUBJ_FISHF 3.5
header ORG_HD_SUBJ_FISHG subject =~ /([aA]merican|アメリカン).*([eE]xpress|エクスプレス|エキスプレス)/
describe ORG_HD_SUBJ_FISHG CardCamo FISHING.
score ORG_HD_SUBJ_FISHG 3.5
header ORG_HD_SUBJ_FISHH subject =~ /プライム/
describe ORG_HD_SUBJ_FISHH AmazonCamo FISHING.
score ORG_HD_SUBJ_FISHH 2.8
header ORG_HD_SUBJ_FISHJ subject =~ /(メルカリ|ヨドバシ|ジャックス|ビックカメラ).*(コード|カード|アカウント)/
describe ORG_HD_SUBJ_FISHJ CardCamo FISHING.
score ORG_HD_SUBJ_FISHJ 3.5
header ORG_HD_SUBJ_FISHK subject =~ /(bitFlyer|ビットフライヤ).*ログイン/
describe ORG_HD_SUBJ_FISHK BitcoinCamo Fishing.
score ORG_HD_SUBJ_FISHK 5.0
header ORG_HD_SUBJ_FISHL subject =~ /(ご|御)提案/
describe ORG_HD_SUBJ_FISHL Many Fishing use this words.
score ORG_HD_SUBJ_FISHL 0.3
header ORG_HD_SUBJ_FISHL subject =~ /sunglasses/
describe ORG_HD_SUBJ_FISHL Fishing SPAM.
score ORG_HD_SUBJ_FISHL 0.5
header ORG_HD_SUBJ_FISHL subject =~ /(shop|sale|online|store)/
describe ORG_HD_SUBJ_FISHL Many Fishing use this word.
score ORG_HD_SUBJ_FISHL 0.4
71_senderlist_rules.cf
ヘッダ情報のFROM
やReceived
でスコアリングするルール。2つ目のunknown
ルールは、途中で経由するサーバーも含めるためかなりの数が該当する。あまり点数を上げすぎないように注意。
header UNTRUST_DOMAIN From =~ /\.(shop|work|tokyo)/
describe UNTRUST_DOMAIN Unreliable domains.
score UNTRUST_DOMAIN 1.35
header RECFRM_UNKNOWN Received =~ /unknown/
describe RECFRM_UNKNOWN Unknown host is not a desirable.
score RECFRM_UNKNOWN 0.35
header ORG_SS_LIST1 From =~ /list-finder\.jp/
describe ORG_SS_LIST1 SPAM sender.
score ORG_SS_LIST1 1.75
header ORG_SS_LIST2 From =~ /(hai2|blast)mail\.jp/
describe ORG_SS_LIST2 SPAM sender.
score ORG_SS_LIST2 1.75
header ORG_SS_LIST3 From =~ /gemini-mail\.net/
describe ORG_SS_LIST3 Black SPAM sender.
score ORG_SS_LIST3 10.0
header ORG_SS_LIST4 From =~ /tricorn\.net/
describe ORG_SS_LIST4 SPAM sender.
score ORG_SS_LIST4 2.25
header ORG_SS_LIST5 From =~ /mimirmarine\.com/
describe ORG_SS_LIST5 Black SPAM sender.
score ORG_SS_LIST5 10.0
header ORG_SS_LIST6 From =~ /ytshoubiao\.com/
describe ORG_SS_LIST6 Black SPAM sender.
score ORG_SS_LIST6 10.0
73_body_rules.cf
スコア定義作成の項で一部記載したが、続いて以下も記載している。通販サイト等利用するサービスがあれば該当するものを削除すると良い。
いくつか会社名もあるが、スパム送信者は名乗っているだけで実在している同じ名前の企業とは無関係?と考えられるので、同名の会社とやりとりがある場合は該当するルールを削除する。各企業のIT担当者さん、企業ブランドイメージのためにもDMARC
導入、reject
運用を推奨します。
body BODY_EN_SPAMLIER /click here to unsubscribe/
describe BODY_EN_SPAMLIER You ... SPAM!
score BODY_EN_SPAMLIER 0.6
body BODY_JA_NTCBELL /ログインに心当たりがない場合は/
describe BODY_JA_NTCBELL Many Fishings use these words.
score BODY_JA_NTCBELL 0.35
body BODY_JA_FISHALL /(システム|アカウント).*異常.*(検知|検出|発見|見つかり)/
describe BODY_JA_FISHALL I think these mails are fishing mails.
score BODY_JA_FISHALL 12.0
body BODY_JA_FISHTNF /(24|24|48|48)時間以内/
describe BODY_JA_FISHTNF Many Fishings use this.
score BODY_JA_FISHTNF 0.25
body BODY_JA_FISHAMZ1 /(Amazon|amazon|アマゾン)(Prime|prime|プライム)/
describe BODY_JA_FISHAMZ1 Definitely fishing!
score BODY_JA_FISHAMZ1 8.0
body BODY_JA_FISHACC1 /残念ながら.*更新できま/
describe BODY_JA_FISHACC1 Fishing mails with funny Japanese.
score BODY_JA_FISHACC1 19.0
body BODY_JA_FISHACC2 /(Amazon|amazon|アマゾン|Rakuten|rakuten|楽天).*アカウント.*(完了|更新|確認)してください/
describe BODY_JA_FISHACC2 These mails are definitely fishing mails.
score BODY_JA_FISHACC2 20.0
body BODY_JA_FISHACC3 /アカウント情報の一部が誤っていること/
describe BODY_JA_FISHACC3 Fishing mails with funny Japanese.
score BODY_JA_FISHACC3 18.0
body BODY_JA_FISHACC4 /サービスが停止され/
describe BODY_JA_FISHACC4 Many Fishing mails use this.
score BODY_JA_FISHACC4 0.65
body BODY_JA_FISHACC5 /アカウント(が|は)ロックされ/
describe BODY_JA_FISHACC5 Many Fishing mails use this.
score BODY_JA_FISHACC5 1.35
body BODY_JA_FISHSCR /セキュリティシステム.*アップグレード/
describe BODY_JA_FISHSCR Fishing mails with funny Japanese.
score BODY_JA_FISHSCR 18.0
body BODY_JA_FISHBGC /(カード|会員)(の情報|情報).*(更新|確認)(出来|でき)ま/
describe BODY_JA_FISHBGC These mails are fishing mails.
score BODY_JA_FISHBGC 20.0
body BODY_JA_FISHCRD /カード.*利用.*(停止|制限)/
describe BODY_JA_FISHCRD These mails are fishing mails.
score BODY_JA_FISHCRD 8.0
body BODY_JA_FISHBTC /カード.*(違法|不正|違法な|不正な)取引/
describe BODY_JA_FISHBTC These mails are fishing mails.
score BODY_JA_FISHBTC 18.0
body BODY_JA_FUNYJP /制限がかけされる/
describe BODY_JA_FUNYJP Funny Japanese means SPAM!
score BODY_JA_FUNYJP 8.0
body BODY_JA_FISHPAY /(支払|支払の)方法.*(更新|確認)/
describe BODY_JA_FISHPAY I think these mails are fishing mails.
score BODY_JA_FISHPAY 0.85
body BODY_JA_SCAMCPY /(スーパーコピー|コピーブランド)/
describe BODY_JA_SCAMCPY You sent spam mail? or wanna fish?
score BODY_JA_SCAMCPY 0.85
body BODY_JA_BTF /株式会社.(bitFlyer|ビットフライヤ)/
describe BODY_JA_BTF I've never used that service.
score BODY_JA_BTF 20.0
body BODY_BADCOOP1 /株式会社グランドツー/
describe BODY_BADCOOP1 SPAM & FISHING!
score BODY_BADCOOP1 20.0
body BODY_BADCOOP2 /HR サポートデスク/
describe BODY_BADCOOP2 SPAM & FISHING!
score BODY_BADCOOP2 20.0
body BODY_BADCOOP3 /株式会社経営承継支援/
describe BODY_BADCOOP3 SPAM & FISHING!
score BODY_BADCOOP3 20.0
body BODY_BADCOOP4 /(株式会社ビジョン|ビジョングループお客様サポートデスク)/
describe BODY_BADCOOP4 SPAM & FISHING!
score BODY_BADCOOP4 20.0
body BODY_BADCOOP5 /株式会社ビジネスサポート/
describe BODY_BADCOOP5 SPAM & FISHING!
score BODY_BADCOOP5 20.0
body BODY_BADCOOP6 /(株式会社ユニヴ|ファーネットビズ)/
describe BODY_BADCOOP6 SPAM & FISHING!
score BODY_BADCOOP6 20.0
body BODY_BADCOOP7 /ユアブライト/
describe BODY_BADCOOP7 SPAM & FISHING!
score BODY_BADCOOP7 20.0
body BODY_BADCOOP8 /株式会社ロフタル/
describe BODY_BADCOOP8 SPAM & FISHING!
score BODY_BADCOOP8 20.0
body BODY_JA_FISHSNS /友達申請.*(きました|来ました|きています|来ています).*(確認|承認)/
describe BODY_JA_FISHSNS I think these mails are fishing.
score BODY_JA_FISHSNS 5.0
body BODY_EN_EIGYO /business proposal/
describe BODY_EN_EIGYO I think these mails are fishing.
score BODY_EN_EIGYO 4.0
body BODY_FISHSPY1 /(consult|loan).*contact me/
describe BODY_FISHSPY1 I think these mails are fishing.
score BODY_FISHSPY1 4.0
body BODY_FISHSPY2 /need to know the price.*attach(ed|ment)/
describe BODY_FISHSPY2 I think these mails are fishing.
score BODY_FISHSPY2 1.5
body BODY_FISHSPY3 /(24|48)時間以内.*情報検証.*完了/
describe BODY_FISHSPY3 Funny Japanese means SPAM!
score BODY_FISHSPY3 8.0
body BODY_FISHSPY4 /個人情報.確認/
describe BODY_FISHSPY4 Many Fishings use this words.
score BODY_FISHSPY4 0.5
body BODY_FISHSPY5 /sorry to bother you/
describe BODY_FISHSPY5 It seems fishing spam.
score BODY_FISHSPY5 2.0
body BODY_FISHSPY6 /セキュリティシステム.*個人情報.更新/
describe BODY_FISHSPY6 Funny Japanese means SPAM.
score BODY_FISHSPY6 8.0
body BODY_FISHSPY7 /(自動電子メール検証\-失敗|ボタンをクリックするだけ.*数秒しか)/
describe BODY_FISHSPY7 Funny Japanese means SPAM.
score BODY_FISHSPY7 8.0
75_safelist.cf
正規のメールが上記までのルールに該当しても、特定の語句を含めば減算する。かなりローカルな語句が本当はもっとあるけど、見せられるものだけ・・・。
body BD_SAFE_M2PLUS /M2PLUS/
describe BD_SAFE_M2PLUS Safe mails from M2PLUS.
score BD_SAFE_M2PLUS -5.0
header HD_SAFE_GOOGLE From =~ /(google|googlegroups|gmail)\.com/
describe HD_SAFE_GOOGLE Safe sender but be careful.
score HD_SAFE_GOOGLE -0.6
header HD_SAFE_GYOUSEI1 From =~ /(ac|ad|ed|go|lg)\.jp/
describe HD_SAFE_GYOUSEI1 Safe sender unless they're infected.
score HD_SAFE_GYOUSEI1 -8.0
swatchで送信元IPをブロック
/var/log/mail.log
にreject:
、discard:
、Passed SPAM
が出力されたときに送信元ipをiptables
に登録すると効果が大きい。フィッシングメールやスパムメールを送ってくるのは真っ当なユーザーではない。ただし、しばらくはログを確認して、スパムに誤判定される正当なメールが無い状況になってからの方が安全。
watchfor /NOQUEUE: (reject|discard):/
pipe "/usr/local/bin/swatch_action.sh lock"
throttle=00:00:30
watchfor /Passed SPAM/
pipe "/usr/local/bin/swatch_action.sh lock"
throttle=00:00:20
watchfor /Blocked INFECTED/
pipe "/usr/local/bin/swatch_action.sh lock"
throttle=00:00:20
実際の受信メールでフィルタの効果を評価する
そこそこリテラシのある人なら、
①送信元のドメインが正式なものとは違う。
②ここ(投稿者)のJRは西日本。
③えきねっとアカウントは持っていない。
④メールアドレスでこんにちは、は99.9%フィッシング。
⑤ログイン先のリンクが怪しい。
などで判断ができる。実際の事例を出してスタッフに研修をするのも良い。
適応されたフィルタのスコアは自作した分で9.4
。自作フィルタがなければスパム判定に至っていないので、有効となっていることがわかる。