Rspamd の設定を細かくやってみる

先日、前々からやろうと思っていた、自宅内のサーバの用途変更作業をやったんですが、

ということで、自宅内のサーバの役割変更をしていくことになるわけですが、今回入手した 5800/53Xg が仮想環境用とするのであれば、HA8000 を現在自宅内でメールサーバとして動いている Express5800/110Ge の後継に据えて、 5800/110Ge は退役ということにしようかと…。

[From Express5800/53Xg を手に入れたので、色々配置替え中 - Soukaku's HENA-CHOKO Blog]

その際に色々手順をしくじったために、サーバの設定ファイル一式を固めていたバックアップデータの最新のものをふっ飛ばしてしまい、その復旧でアタフタしていたんですが、メール部分だけがなかなかうまく復旧できなかったので、思い切って Rspamd を利用することに…。

いやホントに秘伝のタレ状態になってて、自分でもどー設定したのかを思い出せない部分がチラホラあったんですよ…。

ということで、心機一転。
Rspamd でスパム対策の一切合財をやってしまおう、ということで、実際に設定した内容をまとめておきます。

で、Rspamd を設定する上でのお作法というか、注意点というか、基本的な設定ファイルは /etc/rspamd ディレクトリとその配下にある /etc/rspamd/modules.d ディレクトリに配置されていますが、直接それらはいじらず、基本的な動作や個別に設定を変えたいモジュールの設定ファイルを /etc/rspamd/local.d ディレクトリに配置する形になります。

設定がどうなっているのか、変更した内容がどう反映されるのかは、rspamadm コマンド使ってモジュール単位で確認することが出来るので、ファイル書き換えた後のチェックに使えます。

# rspamadm configdump phishing
*** Section phishing ***
symbol = "PHISHING";
openphish_enabled = true;
openphish_premium = false;
openphish_map = "https://www.openphish.com/feed.txt";
phishtank_enabled = true;
phishtank_map = "https://rspamd.com/phishtank/online-valid.json.zst";
redirector_domains [
"/etc/rspamd/redirectors.inc:REDIRECTOR_FALSE",
"/etc/rspamd/local.d/redirectors.inc:LOCAL_REDIRECTOR_FALSE",
]

*** End of section phishing ***

実際に設定した状態は、以下の通り。

nexus01:/etc/rspamd/local.d# pwd
/etc/rspamd/local.d
nexus01:/etc/rspamd/local.d# ls -l
合計 56
-rw-r--r-- 1 root root 199 11月 6 15:01 antivirus.conf
-rw-r--r-- 1 root root 144 11月 12 23:46 dkim_signing.conf
-rw-r--r-- 1 root root 111 11月 18 00:08 logging.inc
-rw-r--r-- 1 root root 62 11月 10 09:21 options.inc
-rw-r--r-- 1 root root 69 11月 18 02:02 phishing.conf
-rw-r--r-- 1 root root 23 11月 6 14:11 redis.conf
-rw-r--r-- 1 root root 16 11月 10 09:24 url_reputation.conf
-rw-r--r-- 1 root root 236 11月 6 15:35 worker-controller.inc
-rw-r--r-- 1 root root 115 11月 5 22:13 worker-proxy.inc

設定ファイルの拡張子部分、".conf" と ".inc" が混在していますが、これどちらにすればいいかは、/etc/rspamd.conf や /etc/rspamd/modules.d ディレクトリ内の設定ファイルに書いてあるので、そちらを確認してください。
例えば、こんな感じに書いてあります。

    .include(try=true,priority=5) "${DBDIR}/dynamic/dkim.conf"
.include(try=true,priority=1,duplicate=merge) "$LOCAL_CONFDIR/local.d/dkim.conf"
.include(try=true,priority=10) "$LOCAL_CONFDIR/override.d/dkim.conf"

デーモン自体の設定は ".inc" 、個々のモジュールの設定は ".conf" となっている、とみればほぼ間違いないですが。

で、実際設定してみるとわかりますが、設定ファイルが機能毎に分割されて、かつデフォルトから追加したい点・変更したい点だけが抜き出されている形式だと、「設定ファイルを書き換えたのはいいけど、元の戻せなくなった」なんてことが起きにくくなるというメリットは有りますね。一時的に設定をデフォルト戻したければ、 /etc/rspamd/local.d ディレクトリ内のファイルを一旦どこかに移動して、デーモン再起動すれば良いわけですし…。

実際に設定してみた内容は…

ということで、実際に設定したのは以下の通りとなります。

logging.inc

Rspamd のログをどこに出力するのかを指定します。以下の例では、ファシリティを "mail.info" に指定して、syslogに出力する形にしています。(Debian の rsyslog の設定では、"mail.info" を指定すると、/var/log/mail.info、/var/log/mail.log に出力。)

#systemd = true;
type = "syslog";
facility = "mail";
level = "info";

debug_modules = ["dkim_signing"];

options.inc

Rspamd の基本的な設定を変更したい場合に使用します。変えるとしたら、 history の値と local_addrs ぐらいでしょうか?

history_rows = 10240;
local_addrs = "192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, fd00::/8, 169.254.0.0/16, fe80::/10, 218.219.149.233/29, 2001:470:fc27::/48";

redis.inc

モジュールの幾つかが、 Redis へのデータの格納・読み出しを前提としているので、コレを設定しておきます。
ドキュメント読めばわかると思いますが、特定のモジュールだけ指定した Redis サーバ使うとか、 Redis サーバを複数利用する、というような設定もできるようですが、自分のところでは Rspamd が動くサーバに同居させた Redis サーバを指定しています。

servers = "127.0.0.1";

worker-controller.inc

Rspamd の Web GUI のポート番号とログインする際に入力するパスワード(パスフレーズ)を指定します。

bind_socket     = "*:11334";
password = "HIMITSUNOMOJIRETSU1";
enable_password = "HIMITSUNOMOJIRETSU2";

password と enable_password には、エンコードされたパスワードの文字列を記載するのですが、それは rspamadm コマンドで生成します。(念のため、password と enable_password は、他で使ってない別々のものを指定しましょうね。)

# rspamadm pw
Enter passphrase:
HIMITUNOMOJIRETU

コマンド実行して、パスワード(パスフレーズ)を入力して得られる文字列を、それそれに記述します。

実際に Web GUI を使うようにするための設定や、 Web GUI で出来ることなどについては、以下のエントリーを参照してください。 httpd 側の設定については、こちらでは扱いません。

と言っても、実際のところデフォルトの設定の状態でも、Web GUI は待受ポート 11334 で起動していて、下のような形で待ち受けしています。ただ、そのままでは localhost からの接続要求しか受け付けてくれないので、外部からも見れるように設定を変える必要があるというわけです。

[From rspamd の Web GUI にアクセスしてみる - Soukaku's HENA-CHOKO Blog]

rspamd の Web UI の書き換え、 FAQ 通りに設定したのに上手く行かなかったといういうのは、前回書いた通り。

[From rspamd の Web UIの URLを 書き換える - Soukaku's HENA-CHOKO Blog]

worker-proxy.inc

Rspamd を Postfix と連携させるために milter サービスの設定をします。

milter  = yes;		# enable milter mode
timeout = 120s;

upstream "scan" {
default = yes;
hosts = "round-robin:127.0.0.1:11333:10";
compression = yes;
}

こちらも、詳しくは以前書いているので、そちらを参照ください。

で、 1.6 から、rmilter の利用が非推奨(使えないわけではないが)となり、その代わりに Rspamd Proxy を利用して、 MTA との milter 接続を行うように変更されています。

[From "Rspamd 1.6.0 has been released" ということなので - Soukaku's HENA-CHOKO Blog]

antivirus.conf

アンチウィルスソフトによるメールのスキャンの実行を設定しますが、デフォルトで ClamAV を使うようになっています。自分のところでも、以前から ClamAV を使っていてインストール済みなので、 "servers=" を自分の環境に合わせています。

clamav {
action = "reject";
type = "clamav";
servers = "127.0.0.1:3310";
symbol = "CLAM_VIRUS";
patterns {
#symbol_name = "pattern";
JUST_EICAR = "^Eicar-Test-Signature$";
}
}

上の書き方だと、ローカルサーバの ClamAV を使うよう(アドレス指定ですが、 ClamAV 側の設定次第では socket 指定でも可)になりますが、別サーバで ClamAV を動かしているという場合には、そのサーバのアドレスを指定すればOK。

ClamAV 以外では、 F-Prot 、 Sophos 、 Avira に対応している模様。
#試してないけど、上記の 4 つのいずれかを組み合わせて使うこともできそうな感じ…。

dkim.conf or dkim_signing.conf

Rspamd の特徴でもあるのだけど、C で書かれたモジュールと Lua で書かれたモジュールがあって、それそれで同じ用途のものが幾つかあります。 DKIM 認証のためのモジュールがそれの一つ。
もちろん、DKIM 認証を有効化したければ、どちらか一方の設定ファイルを用意すればいいのだけど、個人的には Lua のほうの dkim_signing が設定内容がシンプルなので、そちらをお薦めしたい。

domain {
downtown.jp {
# Private key path
path = "/etc/rspamd/keys/DKIM.downtown.jp";
# Selector
selector = "gaia2018";
}
}

これが、C のモジュール向けの設定だと、こんな感じになる。

sign_condition =<<EOD
return function(task)
local from = task:get_from('smtp')

if from and from[1]['addr'] then
if string.find(from[1]['addr'], '@downtown.jp$') then
return {
key = "/etc/rspamd/keys/DKIM.downtown.jp",
domain = "downtown.jp",
selector = "gaia2018._domainkey"
}
end
end

return false
end
EOD;

ということで、Lua モジュールのほうが圧倒的に記述内容がシンプル。

DKIM 用のキーの生成は、 rspamadm コマンドを使って生成。

# rspamadm dkim_keygen -d downtown.jp -s gaia2018 -b 1024
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKnVSCcsHrlBVIoP
iO8EGVXFndNqy7i9mOeabt2PC4jEZNfxJKShvy0IkPoWn676uqfFMX2bikqDXL1Y
uqgLPyGJ3apv2Z93AP68t07Fs3vspenkXTkrEcYj5AzAi8/TUU1xzNgLglVf8+n7
lHln122b1ahQlz+0Ami/9ZZK5cpJAgMBAAECgYB1IQqdMZmS7NKwURyAs9QBSsSZ
ver445IkEWdq2K/8yG5AXCiIfqFKHsFWKepBlNzMvnxug6pxz31TfXFmWjNT/30U
Vgo/eLtZzO6eLgssVe0aHlbden7+vbiVE50/6Lsk3KQy5IYYIky6pMQ9NgaOygJr
QpaRqPLj0loRtdwIvQJBANWwGQcsoKbayP5w8ddZRbi/TmQINGE4Q3p29a1VJ4TM
CuS/GHqUhWSIPs5lHf4sS+EaNnoUOQRcv/ditVahdIMCQQDLdix9aGRaxGL+6fZj
nVTvJo6/3oJu39R0eRk/tPDwoASsuzHdMVJbGcOf329Kli008gaNq4ysNjI6AQ6d
0MRDAkEAm6WBFXC0M9T4whySi0FDP6ZY+xPe01GgFPvBR1fXSSs2ZBetRNwZrXhw
BvYwOosZWgU12QYR4dONICyN2WQQ8QJAMCxJumOmJyuKeOqyUMGmo30QnXM0lMXg
SreFd+UCiyaIFNG5q7KK2lEOVWMUuac3CusnDBILG5c1azBm4ozUewJAMQ3ZD+cx
cg5pWlG+Ma/Kd5N/9poqP3lvmdFclbHFanKTYNg4h5VbAQv8B6LUYs9mbWST1Fb8
-----END PRIVATE KEY-----
gaia2018._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp1UgnLB65QVSKD4jvBBlVxZ3Tasu4vZjnmm7djwuIxGTX8SSkob8tCJD6Fp+u+rqnxTF9m4pKg1y9WLqoCz8hid2qb9mfdwD+vLdOxbN77KXp5F05KxHGI+QMwIvP01FNcczYC4JVX/Pp+5R5Z9dtm9WoUJc/tAJov/WWSuXKSQIDAQAB" ) ;

-----BEGIN PRIVATE KEY---------END PRIVATE KEY----- の部分を適当なファイル名で保存して、その保存先を "path="、"key="に記述し、"セレクタ名._domainkey" から始まる 2 行を、bind のゾーンファイルに記載すれば準備。

domain {
downtown.jp {
# Private key path
path = "/etc/rspamd/keys/DKIM.downtown.jp";
# Selector
selector = "gaia2018";
}
}

phishing.conf

メールの HTML 部分に記述された URL をチェックしてフィッシングサイトかどうか判定するための設定。フィッシングサイトの URL 情報は、外部から取得する形になっていて、基本的な設定は /etc/rspamd/modules.d/phishing.conf に書かれているため、こちらでは有効にするための設定を書くだけ。

openphish_enabled = true;
phishtank_enabled = true;

#設定して、一週間ほど経つんだけど、これが効いて SPAM 判定されたと思われるメールは、今のところない。

url_reputation.conf

レピュテーションによる URL チェックを有効化します。
modules.d/url_reputation.conf を見ても、デフォルトでは無効化されている上に、設定値がすべてコメントとなっているので、 設定値の部分をコピペして、必要な項目を有効にします。

enabled = true;

# Key prefix for redis - default "Ur."
key_prefix = "Ur.";

# Symbols to insert - defaults as shown
symbols {
white = "URL_REPUTATION_WHITE";
black = "URL_REPUTATION_BLACK";
grey = "URL_REPUTATION_GREY";
neutral = "URL_REPUTATION_NEUTRAL";
}

# DKIM/DMARC/SPF allow symbols - defaults as shown
foreign_symbols {
dmarc = "DMARC_POLICY_ALLOW";
dkim = "R_DKIM_ALLOW";
spf = "R_SPF_ALLOW";
}

# SURBL metatags to ignore - default as shown
ignore_surbl = ["URIBL_BLOCKED", "DBL_PROHIBIT", "SURBL_BLOCKED"];

# Amount of samples required for scoring - default 5
threshold = 5;

#Maximum number of TLDs to update reputation on (default 1)
update_limit = 1;

# Maximum number of TLDs to query reputation on (default 100)
query_limit = 100;

# If true, try to find most 'relevant' URL (default true)
relevance = true;

さて、この後ですけど

ま、ここまでやっておくと、結構な精度でスパムをブロックしてくれるので、これ以上手を入れなくてもいい感じにはなるんですけど、それでもすり抜けてくる奴らがいるので、それを何とかしてブロックするのが、当面の課題ではあります。
modules.d ディレクトリの中を見ると、 SpamAssassin と連携するための spammassassin.conf や メールヘッダや本文中の文字列を正規表現で引っ掛けるための regexp.conf といったものがあるので、このあたりを使いこなせれば更に検知精度が上げられそうです。正規表現での検知は、実際には Rspamd デフォルトのものが有効化されているので、使われていないわけではないんですけど。
#実際、 regexp.conf は設定しようと試してみたものの、個別設定の内容が反映されないので、設定ファイルの書き方についての研究がもう少し必要…。

トラックバック(1)

正規表現でのフィルタリング、「一応」出来るようになったので、メモとして残しておく。 modules.d ディレクトリの中を見ると、 SpamAssassi... 続きを読む

コメントする