2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ubuntu 20.04】 スパムメール対策、spamassassinの設定

Last updated at Posted at 2021-06-23

まえがき

 Postfix側での設定、フィルターには限界があるため、本稿ではamavisd-new、spamassassinの設定をしていく。動作させるための初期設定のお話ではないのであしからず。

amavisd-newの設定

vi /etc/amavis/conf.d/40-policy_banks

 デフォルトではebayやamazon等海外ドメインのDKIM署名がホワイトリストとなっているが、利用しないサービスであればホワイトリストから外す。
 誤判定されて迷惑メールボックスに配送されては困る送信者のドメインをMILD_WHITELISTに追加しておく・・・が、理由なく追加しない。運用環境の状況に合わせて記載。

/etc/amavis/conf.d/40-policy_banks
@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のアドレス宛に来る。

amavis@myhostnameからのメール
Wide character in print at /usr/share/perl5/Razor2/Logger.pm line 107.

 対応のため、Razorスクリプト(Perl)中にutf-8にエンコードする工程を追記する。

vi /usr/share/perl5/Razor2/Logger.pm

 長いので該当部分のみ抜粋。

/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)をスパムと判断するようにしている。ベイズフィルタの学習状況、環境によって微調整。

/etc/spamassassin/local.cf

 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

日本語メールのためのスコア調整

 最終行に以下を追記。

/etc/spamassassin/local.cf
# 日本語のための調整。
# 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.cf10_blacklist.cfファイルを/etc/spamassassin配下に作成して記述するのもアリ。

本文の語句ヒットでスコア定義を作成(spam判定)

 メール本文の語句でオリジナルのスコア定義を作成する。実際に受信したスパムメールで、判定がされなかったものをよく見て、それらのメールにしかない共通の単語や語句を判定条件とする。スパムメールを排除したいのにスパムメールをよく読むようになるというこの矛盾・・・。

 /etc/spamassassinの下に***.cfでファイルを作成すれば、起動時に読み込んでくれる。

vi /etc/spamassassin/70_user.cf

 このオリジナル定義ファイルの書き方、日本語のソースがネット上に少なく、合ってるのか不安だったが、一応期待通りの動作をしてくれている。

/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
/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するようにしている。

/etc/postfix/header_checks
/^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月追記。postfixamavisとやりとりする際に、ヘッダチェックをするかどうかの設定が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

 タイトルの文字列でスコアリングするルール。業務で使用しているメールのためアマゾンや楽天からの連絡は来ないという前提。電力会社は利用していない所から来ないはず、というか利用している所からも来たことが無い。

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

 ヘッダ情報のFROMReceivedでスコアリングするルール。2つ目のunknownルールは、途中で経由するサーバーも含めるためかなりの数が該当する。あまり点数を上げすぎないように注意。

71_senderlist_rules.cf
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.logreject:discard:Passed SPAMが出力されたときに送信元ipをiptablesに登録すると効果が大きい。フィッシングメールやスパムメールを送ってくるのは真っ当なユーザーではない。ただし、しばらくはログを確認して、スパムに誤判定される正当なメールが無い状況になってからの方が安全。

/etc/swatch/mail.conf
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

実際の受信メールでフィルタの効果を評価する

 いらっしゃいませ~。
フィッシング本文例.jpg

 そこそこリテラシのある人なら、
①送信元のドメインが正式なものとは違う。
②ここ(投稿者)のJRは西日本。
③えきねっとアカウントは持っていない。
④メールアドレスでこんにちは、は99.9%フィッシング。
⑤ログイン先のリンクが怪しい。
 などで判断ができる。実際の事例を出してスタッフに研修をするのも良い。

 ヘッダ↓
header.PNG

 適応されたフィルタのスコアは自作した分で9.4。自作フィルタがなければスパム判定に至っていないので、有効となっていることがわかる。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?