OpenDKIM/DMARC/ARC から Rspamd への乗り換え

Rspamd

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

コメント

タイトルとURLをコピーしました