Open{DKIM,DMARC,ARC}を設定してきたが(pypolicyd-spfも)、openarcで複数ドメインを取り扱う方法がわからなかったので運用2日目にしてRspamdに乗り換えてみる。
また、fedoraで動作させている例がすくなかったのでその方法も記載しておく。
インストール
まず、テスト環境でメールサーバを構築して確認出来たら運用中のサーバにも適用…しようと思っていたけど簡単に定義戻せそうなので、運用中のサーバでおこなうことに。運用中サーバではpostfixとdovecotが動作している。
rspamdリポジトリの設定
以下のコマンドを実施する。「copr」がわからないと思うので検索して調べる。私は今日(2024/03/19)まで知らなかった。rspamdはいくつかあるが現時点でビルド日付が一番新しいものを選択した。
# dnf copr enable lorbus/rspamd
# dnf repolist
repo id repo name
copr:copr.fedorainfracloud.org:lorbus:rspamd Copr repo for rspamd owned by lorbus
fedora Fedora 39 - x86_64
fedora-cisco-openh264 Fedora 39 openh264 (From Cisco) - x86_64
updates Fedora 39 - x86_64 - Updates
#
rspamdのインストール
# dnf -y install rspamd
redis, nginxのインストール
redis, nginxをインストールしておく。
設定
サーバ証明書の作成(コピー)
当サイトではletsencryptのサーバ証明書を取得している。運用中のサーバにもコピーされているのでこれを利用する。
redisの設定
まず自動起動の設定を行う。
# systemctl enable redis
# systemctl start redis
# systemctl status redis
デフォルトでポート6379で待ち受る。
Rspamd公式では「不揮発性データを保存するモジュールごとに、特に統計モジュール (BAYES 分類子) とファジー ストレージに対して個別のRedisインスタンスを使用することを強くお勧めします。」とか、「Redis が使用するメモリを適切な値に制限することも良い考え」とか「さらに、不揮発性データを保存する Redis インスタンスの場合は、eviction policyとしてvolatile-ttlの設定を検討することもよい」とか「デフォルトではすべてのネットワーク インターフェイスからの接続をリッスンするのでループバックに制限する」とかの記載がある。※公式は英文、「」内はchromeで日本語にしたものを当方が手を加えたもの。
モジュールごとにインスタンスを分けるのは後で余裕がある時にやるとして、とりあえず以下のように設定した(設定するファイルは/etc/redis/redis.conf)。
maxmemory 500mb
maxmemory-policy volatile-ttl
なお、以下の行はredis-7.2.4-1.fc39.x86_64ではインストール時点で設定ファイルに記載されていた。
bind 127.0.0.1 -::1
nginxの設定
SSL関連の設定(証明書の場所を変更することもわすれずに)と自動起動設定を行っておく。
その他、必要な設定(テストページを表示しないとか、rspamdに関係ないが必要な設定)を行っておく。
Rsmapd設定
Rsmapd設定ファイルの作法
オリジナルファイルは基本的に編集しない。local.dもしくはoverride.dにコピーしてそちらを編集する。
local.dとoverride.dの違いは以下の通り。
- local.dは既存の設定を変更または追加する
- override.dはデフォルト設定を完全にオーバーライドすることができる
override.dの意味がちょっと分かりにくいが、オリジナルを変更するのと同じ効果?local.dと同じ定義があったら?
わかったらここに記載するかも。→Rspamd公式のこのページ(英文)に詳しく説明してある。
rspam初期設定
以下のコマンドを実行する。とりあえず、みんなが実行してるから実行する。
rspamadm configwizard
local.dの下にファイルができる。override.dの下には何もできていない。local.dにできたファイルの内容をのぞいてみると、大したこと書かれていない。でもみんなが(以下省略)
定義体修正
/etc/rspamd/local.d/redis.conf
初期設定でできた内容を以下の内容で置き換える。
write_servers = "127.0.0.1:6379";
read_servers = "127.0.0.1:6379";
/etc/rspamd/local.d/worker-controller.inc
新規作成する。まず、rspamadm pwコマンドを二回実行する。
# rspamadm pw
CPU doesn't have SSSE3 instructions set required for hyperscan, disable it
Enter passphrase:
$2$dutqacnswepnprbz4whj6rfbx9nfafuz$94m89ja3cfksbq46qp1ss4jy5tsh9rhbmoxb6dctxqsb39ehofry
#
上記のようにCPUがSSSE3をサポートしていない旨のメッセージが出る場合は、PVEのCPU設定で「Default(kvm64)」のようにSSSE3がサポートされていないタイプになっているので、「x86-64-v2-AES」などに変更する。
# rspamadm pw
Enter passphrase:
$2$oziomh6mnf3zk1x48tbd8tdxh7ojq9os$7msy6o8fkt5c1xejdpxwkerxu797mbyemcubbyr88eiswmyo6udy
# rspamadm pw
Enter passphrase:
$2$81zkr8msn8shf9i3wcg13nzyscp3uarn$xmwr77f714oz1tcdrewm4nfrmiqnakke4tz5tcs9psbdchbfbe7y
#
一つ目を参照用のパスワード、もう一つを管理用のパスワードとする。
worker-controller.incの内容は以下のようになる。
password = "$2$oziomh6mnf3zk1x48tbd8tdxh7ojq9os$7msy6o8fkt5c1xejdpxwkerxu797mbyemcubbyr88eiswmyo6udy"
enable_password = "$2$81zkr8msn8shf9i3wcg13nzyscp3uarn$xmwr77f714oz1tcdrewm4nfrmiqnakke4tz5tcs9psbdchbfbe7y"
nginx定義追加
/etc/nginx/default/rspamd.confを以下の内容で作成しておく。
location /rspamd {
proxy_pass http://127.0.0.1:11334/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
SELinux設定
ブラウザでhttp(s)://サーバアドレス/rspamd/に接続できない場合、SELinuxの設定が足りていない。以下のコマンドを実行する。
# setsebool -P httpd_can_network_connect 1
# setsebool -P nis_enabled 1
これで、https://FQDN/rspamd/でアクセスできるはず。
postfixの定義修正
/etc/postfix/master.cf
pypolicyd-spfの定義をコメントにする。以下の行をコメントに。
policyd-spf unix - n n - 0 spawn
user=nobody argv=/usr/libexec/postfix/policyd-spf
/etc/postfix/main.cf
smtpd_recipient_restrictions から check_policy_service unix:private/policyd-spf をはずす。
また、以下の行を
smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:8893, inet:127.0.0.1:8892
次のように変更する。
smtpd_milters = inet:localhost:11332
rspamdの定義修正
SPF設定
rspamdでは標準でSPF検証を行う。特に何もする必要はない。
DKIM設定
鍵の作成はrspamadm dkim_keygenコマンドで実行する。公開鍵は標準出力にでるのでリダイレクトしている。この情報をDNSに登録する。
# rspamadm dkim_keygen -b 2048 -s '20240320' -d yo7612.com -k /var/lib/rspamd/dkim/yo7612.com/20240320.prive > /var/lib/rspamd/dkim/yo7612.com/20240320.txt
# rspamadm dkim_keygen -t ed25519 -b 2048 -s '20240320-ed25519' -d yo7612.com -k /var/lib/rspamd/dkim/yo7612.com/20240320-ed25519.prive > /var/lib/rspamd/dkim/yo7612.com/20240320-ed25519.txt
なお、opendkimで作成した鍵も利用可能。当サイトではすでにopendkimで作成した鍵がありDNSにも公開鍵を登録しているのでコピーして利用している。
忘れないようにアクセス権の設定を行う。
# chown -R rspamd:rspamd /var/lib/rspamd/dkim/
つづいて、/etc/rspamd/local.d/dkim_signing.confを作成する。以下のように設定した。
# cat dkim_signing.conf
allow_envfrom_empty = true;
allow_hdrfrom_mismatch = true;
allow_hdrfrom_mismatch_sign_networks = true;
allow_username_mismatch = true;
use_domain = "header";
use_esld = true;
sign_local = true;
use_redis = false;
try_fallback = true;
domain {
yo7612.com {
selectors [
{
path: "/var/lib/rspamd/dkim/yo7612.com/20240311.private";
selector: "20240311";
},
{
path: "/var/lib/rspamd/dkim/yo7612.com/20240319-ed25519.private";
selector: "20240319-ed25519";
}
]
},
foo.example.com {
selectors [
{
path: "/var/lib/rspamd/dkim/foo.example.com/20240311.private";
selector: "20240311";
},
{
path: "/var/lib/rspamd/dkim/foo.example.com/20240319-ed25519.private";
selector: "20240319-ed25519";
}
]
}
}
#
DMARC設定
/etc/rspamd/local.d/dmarc.conf を以下のように設定した。
reporting {
enabled = true;
}
actions = {
quarantine = "add_header";
reject = "reject";
}
send_reports = true;
report_settings {
org_name = "YO7612.COM";
domain = "yo7612.com";
email = "foo@yo7612.com";
}
ARC設定
/etc/rspamd/local.d/dkim_signing.confを/etc/rspamd/local.d/arc.confにコピーして利用する。
# cd /etc/rspamd/local.d
# cp dkim_signing.conf arc.conf
つづいて、arc.confを以下のようにdomainセクションのみにする。
domain {
yo7612.com {
selectors [
{
path: "/var/lib/rspamd/dkim/yo7612.com/20240311.private";
selector: "20240311";
},
{
path: "/var/lib/rspamd/dkim/yo7612.com/20240319-ed25519.private";
selector: "20240319-ed25519";
}
]
},
foo.example.com {
selectors [
{
path: "/var/lib/rspamd/dkim/foo.example.com/20240311.private";
selector: "20240311";
},
{
path: "/var/lib/rspamd/dkim/foo.example.com/20240319-ed25519.private";
selector: "20240319-ed25519";
}
]
}
}
rspamdのarcは定義上は複数ドメインに対応しているのがわかる。
postfixとrspamdの再起動
rspamdの自動起動設定
自動起動設定を行っていない場合はここで行っておく。
# systemctl status rspamd
# systemctl enable rspamd
# systemctl status rspamd
rspamd定義のチェック
以下のコマンドで定義体のチェックを行う。以下のように、syntax OKとなればよい。
# rspamadm configtest
syntax OK
#
postfixの再起動とrspamdの起動
# systemctl start rspamd
# systemctl restart postfix
動作確認
メールの送受信確認。メールのヘッダなどを確認する。また、ログを監視しておく。
一日ほどたつが今のところ問題なさそうなので、しばらく様子をみる。
しかし、みんなメールのテストってどうやってるのだろう?
OpenDKIM/OpenDMARC/OpenARCの停止
以下のコマンドを実行し、opendkim/opendmarc/openarcを停止する。
# systemctl stop opendkim opendmarc openarc
# systemctl disable opendkim opendmarc openarc
学習方法
SPAMとHAMの学習方法
spamの学習方法
ひとつのメールを学習させる。
# rspamc -c bayes learn_spam /var/mail/vmailbox/example.com/foo/.Junk/cur/spam-mail-001.eml
指定ディレクトリすべてのメールを学習させる。
# rspamc -c bayes learn_spam /var/mail/vmailbox/example.com/foo/.Junk/cur/
HAMの学習方法
spam学習に加えてHAMの学習も行う必要がある。
ひとつのメールを学習させるコマンド。
# rspamc -c bayes learn_ham /var/mail/vmailbox/example.com/foo/cur/ham-mail-001.eml
指定ディレクトリのすべてのメールを学習させるコマンド。
# rspamc -c bayes learn_ham /var/mail/vmailbox/example.com/foo/cur
コメント