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(kmv64)」のようにSSSE3がサポートされていないタイプになっているので、「X64-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をコピーしました