前編では Postfix +Dovecot + PostfixAdmin の設定をしてきました。
今回はそこに Rspamd による 迷惑メール対策、ClamAntiVirus によるウイルススキャンを連動させていこうと思います。
スパムメール対策ソフトとしては SpamAssassin が有名ですが、今回はより多機能な Rspamd を採用しました。
Rspamd は多機能で、DKIM / SPF / DMARC / ARC のすべてに対応できるので、これまで個別に使っていた SpamAssassin や OpenDKIM、pypolicyd-spf を一本化することができます。
Redis のインストール
事前準備として Redis のインストールが必要ですが、WordPress プラグイン LiteSpeed Cache の導入時に設定済みですので、まだの方はそちらをご参照ください。
ClamAV のインストール
手順が煩雑になってしまうので、先に ClamAntiVirus をインストールしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # dnf install clamav clamd clamav-freshclam サブスクリプション管理リポジトリーを更新しています。 依存関係が解決しました。 ============================================================================================================================================================= パッケージ アーキテクチャー バージョン リポジトリー サイズ ============================================================================================================================================================= インストール: clamav x86_64 1.0.4-1.el9 epel 313 k clamav-freshclam x86_64 1.0.4-1.el9 epel 95 k clamd x86_64 1.0.4-1.el9 epel 91 k 依存関係のインストール: clamav-filesystem noarch 1.0.4-1.el9 epel 18 k clamav-lib x86_64 1.0.4-1.el9 epel 2.5 M トランザクションの概要 ============================================================================================================================================================= インストール 5 パッケージ ダウンロードサイズの合計: 3.0 M インストール後のサイズ: 232 M これでよろしいですか? [y/N]: y |
freshclam.conf を編集して、ウイルスデータベースを更新(freshclam)したときに clamd に通知する設定を行います。
1 2 | #NotifyClamd /path/to/clamd.conf NotifyClamd /etc/clamd.d/scan.conf |
次に、scan.conf を編集して clamd の設定を変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #LogFile /var/log/clamd.scan ↓(コメント解除) LogFile /var/log/clamd.scan #LogTime yes ↓(コメント解除) LogTime yes #LocalSocket /run/clamd.scan/clamd.sock ↓(コメント解除) LocalSocket /run/clamd.scan/clamd.sock #LocalSocketGroup virusgroup ↓(コメント解除) LocalSocketGroup virusgroup #LocalSocketMode 660 ↓(コメント解除) LocalSocketMode 660 #ExcludePath ^/proc/ #ExcludePath ^/sys/ ↓(コメント解除) ExcludePath ^/proc/ ExcludePath ^/sys/ User clamscan ↓(コメントアウト) #User clamscan |
1 2 3 4 5 6 7 | # systemctl start clamav-freshclam # systemctl enable clamav-freshclam Created symlink /etc/systemd/system/multi-user.target.wants/clamav-freshclam.service → /usr/lib/systemd/system/clamav-freshclam.service. # systemctl start clamd@scan # systemctl enable clamd@scan Created symlink /etc/systemd/system/multi-user.target.wants/clamd@scan.service → /usr/lib/systemd/system/clamd@.service. |
Rspamd のインストール
Rspamd リポジトリの導入
まず、Rspamd の Centos9 用リポジトリを導入します。
1 2 3 4 | # curl https://rspamd.com/rpm-stable/centos-9/rspamd.repo > /etc/yum.repos.d/rspamd.repo % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 169 100 169 0 0 159 0 0:00:01 0:00:01 --:--:-- 159 |
ダウンロードしたリポジトリから、Rspamd をインストールします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # dnf install rspamd サブスクリプション管理リポジトリーを更新しています。 Rspamd stable repository 242 B/s | 833 B 00:03 = Rspamd stable repository 2.5 kB/s | 3.9 kB 00:01 GPG 鍵 0xBF21E25E をインポート中: Userid : "Vsevolod Stakhov (Rspamd packages key) <vsevolod@rspamd.com>" Fingerprint: 3FA3 47D5 E599 BE45 95CA 2576 FFA2 32ED BF21 E25E From : http://rspamd.com/rpm/gpg.key これでよろしいですか? [y/N]: y Rspamd stable repository 依存関係が解決しました。 ============================================================================================================================================================= パッケージ アーキテクチャー バージョン リポジトリー サイズ ============================================================================================================================================================= インストール: rspamd x86_64 3.7.4-2.el9 rspamd 4.5 M 依存関係のインストール: hyperscan x86_64 5.4.1-2.el9 epel 2.3 M jemalloc x86_64 5.2.1-2.el9 epel 203 k libgfortran x86_64 11.4.1-2.1.el9 rhel-9-for-x86_64-baseos-rpms 807 k libquadmath x86_64 11.4.1-2.1.el9 rhel-9-for-x86_64-baseos-rpms 200 k libsodium x86_64 1.0.18-8.el9 epel 161 k openblas x86_64 0.3.21-2.el9 rhel-9-for-x86_64-appstream-rpms 38 k openblas-serial x86_64 0.3.21-2.el9 rhel-9-for-x86_64-appstream-rpms 4.6 M トランザクションの概要 ============================================================================================================================================================= インストール 8 パッケージ ダウンロードサイズの合計: 13 M インストール後のサイズ: 67 M これでよろしいですか? [y/N]: y パッケージのダウンロード: (1/8): jemalloc-5.2.1-2.el9.x86_64.rpm 4.4 MB/s | 203 kB 00:00 (2/8): libsodium-1.0.18-8.el9.x86_64.rpm 1.8 MB/s | 161 kB 00:00 (3/8): hyperscan-5.4.1-2.el9.x86_64.rpm 9.6 MB/s | 2.3 MB 00:00 (4/8): libquadmath-11.4.1-2.1.el9.x86_64.rpm 639 kB/s | 200 kB 00:00 (5/8): libgfortran-11.4.1-2.1.el9.x86_64.rpm 2.1 MB/s | 807 kB 00:00 (6/8): openblas-0.3.21-2.el9.x86_64.rpm 175 kB/s | 38 kB 00:00 (7/8): openblas-serial-0.3.21-2.el9.x86_64.rpm 1.5 MB/s | 4.6 MB 00:03 (8/8): rspamd-3.7.4-2.el9.x86_64.rpm 1.2 MB/s | 4.5 MB 00:03 ------------------------------------------------------------------------------------------------------------------------------------------------------------- 合計 2.9 MB/s | 13 MB 00:04 rspamd から暗号化されていない http://rspamd.com/rpm/gpg.key の repo キーを取得しています Rspamd stable repository 2.4 kB/s | 3.9 kB 00:01 GPG 鍵 0xBF21E25E をインポート中: Userid : "Vsevolod Stakhov (Rspamd packages key) <vsevolod@rspamd.com>" Fingerprint: 3FA3 47D5 E599 BE45 95CA 2576 FFA2 32ED BF21 E25E From : http://rspamd.com/rpm/gpg.key これでよろしいですか? [y/N]: y |
Redis へのアクセス権を追加
Redis グループに Rspamd のユーザー(_rspamd)を追加しておきます。
1 | # usermod -a -G redis _rspamd |
Rspamd の初期設定
Rspamd の設定ウイザードを実行すると、Web GUI のパスワードハッシュと DKIM の鍵を対話的に作成してくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | # rspamadm configwizard ____ _ | _ \ ___ _ __ __ _ _ __ ___ __| | | |_) |/ __|| '_ \ / _` || '_ ` _ \ / _` | | _ < \__ \| |_) || (_| || | | | | || (_| | |_| \_\|___/| .__/ \__,_||_| |_| |_| \__,_| |_| Welcome to the configuration tool We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd Modules enabled: whitelist, asn, emails, dmarc, chartable, milter_headers, phishing, regexp, spf, settings, bayes_expiry, force_actions, forged_recipients, once_received, fuzzy_check, dkim_signing, arc, trie, maillist, metadata_exporter, multimap, mid, rbl, dkim, hfilter, mime_types, elastic Modules disabled (explicitly): http_headers, known_senders, mx_check, p0f, aws_s3, spamtrap, rspamd_update, bimi, dcc, external_relay Modules disabled (unconfigured): spamassassin, ip_score, reputation, clickhouse, metric_exporter, clustering, fuzzy_collect, external_services, maps_stats, antivirus, dynamic_conf Modules disabled (no Redis): ratelimit, greylist, history_redis, neural, replies, url_redirector Modules disabled (experimental): Modules disabled (failed): Do you wish to continue?[Y/n]: y Setup WebUI and controller worker: Controller password is not set, do you want to set one?[Y/n]: y Enter passphrase:(パスワードを入力) Set encrypted password to: (暗号化パスワード) Redis servers are not set: The following modules will be enabled if you add Redis servers: * ratelimit * greylist * history_redis * neural * replies * url_redirector Do you wish to set Redis servers?[Y/n]: y Input read only servers separated by `,` [default: localhost]: /run/redis/redis.sock Input write only servers separated by `,` [default: /run/redis/redis.sock]: /run/redis/redis.sock Do you have any username set for your Redis (ACL SETUSER and Redis 6.0+)[y/N]: n Do you have any password set for your Redis?[y/N]: n Do you have any specific database for your Redis?[y/N]: n Do you want to setup dkim signing feature?[y/N]: y How would you like to set up DKIM signing? 1. Use domain from mime from header for sign 2. Use domain from SMTP envelope from for sign 3. Use domain from authenticated user for sign 4. Sign all mail from specific networks Enter your choice (1, 2, 3, 4) [default: 1]: 1 Do you want to sign mail from authenticated users? [Y/n]: y Allow data mismatch, e.g. if mime from domain is not equal to authenticated user domain? [Y/n]: y Do you want to use effective domain (e.g. example.com instead of foo.example.com)? [Y/n]: n Enter output directory for the keys [default: /var/lib/rspamd/dkim/]:(空エンター) Enter domain to sign: (ドメイン名) Enter selector [default: dkim]:(空エンター) Do you want to create privkey /var/lib/rspamd/dkim/example.com.dkim.key[Y/n]: y You need to chown private key file to rspamd user!! To make dkim signing working, to place the following record in your DNS zone: v=DKIM1; k=rsa; p=(公開鍵) Do you wish to add another DKIM domain?[y/N]: n File: /etc/rspamd/local.d/dkim_signing.conf, changes list: allow_username_mismatch => true domain => {[example.com] = {[path] = /var/lib/rspamd/dkim/example.com.dkim.key, [selector] = dkim}} sign_authenticated => true use_esld => false use_domain => header allow_hdrfrom_mismatch => true allow_hdrfrom_mismatch_sign_networks => true File: /etc/rspamd/local.d/worker-controller.inc, changes list: password => (暗号化パスワード) File: /etc/rspamd/local.d/redis.conf, changes list: write_servers => /run/redis/redis.sock read_servers => /run/redis/redis.sock Apply changes?[Y/n]: y Create file /etc/rspamd/local.d/dkim_signing.conf Create file /etc/rspamd/local.d/worker-controller.inc Create file /etc/rspamd/local.d/redis.conf 3 changes applied, the wizard is finished now *** Please reload the Rspamd configuration *** |
DKIM キーを作成した場合は、所有者を _rspamd に変更しておきます。
1 | # chown _rspamd. -R /var/lib/rspamd/dkim/ |
DKIM の設定
DKIM(DomainKeys Identified Mail)とは、メールに電子署名を付加することで、 メールの送信者および内容が改ざんされていないかどうかを検証できるようにするものです。
Rspamd の設定ウイザードで作成済ですので、DNS に公開鍵を登録します。
- セレクタ名が dkim の場合、DNS の TXT レコードに、dkim._domainkey を追加します。
- 値は rspamadm で表示された v=DKIM1; k=rsa; p=(公開鍵)になります。
※テスト運用の段階では、v=DKIM1; t=y; k=rsa; t=y; p=(公開鍵)としておき、確認ができたら t=y; を外すと良いでしょう。
SPF の設定
SPF(Sender Policy Framework)とは、DNS に登録された IP アドレスとメールサーバーの IP アドレスを比較して、送信元のドメインが詐称されていないかを検査するための仕組みです。
Rspamd は標準で SPF のチェックを行ってくれます。
DNS に自分のサーバーのグローバル IP アドレスを登録する必要があり、TXT レコードに v=spf1 ip4:(サーバーのIPアドレス) -all を登録します。
※受信者がサーバー上で自動転送設定をしていた場合、転送先で弾かれる可能性があります。問題がある場合には -all ではなく ~all で登録してください。
DMARC の設定
DMARC(Domain-based Message Authentication, Reporting, and Conformance)とは、SPF と DKIM の検査の結果や、メールの From の情報などを総合的に判断して、差出人詐称などの異常を検知した後の処理を、送信側の指定した方法で行う技術です。
Rspamd の local.d に設定(dmarc.conf)を配置することで、既存の設定にマージすることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | reporting { enabled = true; } actions = { quarantine = "add_header"; reject = "reject"; } send_reports = true; report_settings { org_name = "EXAMPLE.COM"; domain = "example.com"; email = "postmaster@example.com"; } |
DNS の TXT レコードに _dmarc という名称で、v=DMARC1; p=quarantine; pct=100; を登録します。
ARC の設定
ARC(Authenticated Received Chain)とはメールが再配送された場合でも、メール経路上の送信ドメイン認証の検査結果を辿って、正しい経路で転送されたことを確認できるようにする技術です。
Rspamd では DKIM の秘密鍵を ARC にも流用でき、DNS の公開鍵も共通で使えます。
まずは DKIM の設定ファイル(dkim_signing.conf)を、ARC 用(arc.conf)にコピーします。
1 | # cp /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf |
続いて、不要な行(domain セクション以外の行)を削除します。
1 2 3 4 5 6 | domain { example.com { path = "/var/lib/rspamd/dkim/example.com.dkim.key"; selector = "dkim"; } } |
ウイルスチェックの設定
Clam AntiVirus と連携して、メール受信時にウイルスチェックを行います。
Clam AntiVirus のグループ(virusgroup)に Rspamd のグループ(_rspamd)を追加して、ソケットにアクセス権を追加します。
1 | # usermod -a -G virusgroup _rspamd |
antivirus.conf を新規作成して、Clam AntiVirus の設定をします。
1 2 3 4 5 6 7 8 | clamav { action = "reject"; message = '${SCANNER}: virus found: "${VIRUS}"'; symbol = "CLAM_VIRUS"; type = "clamav"; servers = "/run/clamd.scan/clamd.sock"; whitelist = "/etc/rspamd/local.d/antivirus.wl"; } |
※ウイルスチェックのテストをする際に、EICAR のテスト用文字列をメール本文に入れても反応しません。テスト用文字列を記載したテキストを添付ファイルとして送信するようにしてください。
フィッシングメール対策
メール本文に記載された URL をフィッシングサイトのブラックリストで判定するように設定します。
phishing.conf を新規作成して、フィッシングメール対策の設定をします。
1 2 | openphish_enabled = true; phishtank_enabled = true; |
ブラックリスト・ホワイトリスト設定
差出人のメールアドレスやドメイン、IP アドレスごとに個別のブラックリスト・ホワイトリストの設定をできるようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # IP アドレスのホワイトリスト WHITELIST_IP { type = "ip"; prefilter = "true"; map = "${LOCAL_CONFDIR}/local.d/whitelist_ip.map"; action = "accept"; } # ドメインのホワイトリスト WHITELIST_SENDER_DOMAIN { type = "from"; filter = "email:domain"; map = "${LOCAL_CONFDIR}/local.d/whitelist_sender_domain.map"; score = -20.0 } # メールアドレスのホワイトリスト WHITELIST_SENDER_EMAIL { type = "from"; filter = "email:addr"; map = "${LOCAL_CONFDIR}/local.d/whitelist_sender_email.map"; score = -15.0 } # ドメインのブラックリスト BLACKLIST_SENDER_DOMAIN { type = "from"; filter = "email:domain"; map = "${LOCAL_CONFDIR}/local.d/blacklist_sender_domain.map"; score = 20.0 } # サブドメインのブラックリスト BLACKLIST_SENDER_DOMAIN_MULTI { type = "from"; filter = "email:domain:tld"; map = "${LOCAL_CONFDIR}/local.d/blacklist_sender_domain_multi.map"; score = 20.0 } # メールアドレスのブラックリスト BLACKLIST_SENDER_EMAIL { type = "from"; filter = "email:addr"; map = "${LOCAL_CONFDIR}/local.d/blacklist_sender_email.map"; score = 30.0 } |
それぞれの map ファイルを作成します。
1 2 3 4 5 6 | # touch /etc/rspamd/local.d/whitelist_ip.map # touch /etc/rspamd/local.d/whitelist_sender_domain.map # touch /etc/rspamd/local.d/whitelist_sender_email.map # touch /etc/rspamd/local.d/blacklist_sender_domain.map # touch /etc/rspamd/local.d/blacklist_sender_domain_multi.map # touch /etc/rspamd/local.d/blacklist_sender_email.map |
管理画面から操作できるように、所有者を変更します。
1 2 | # chown _rspamd. /etc/rspamd/local.d/ # chown _rspamd. /etc/rspamd/local.d/*.map |
Rspamd の管理画面で Configuration のタブから、これらの設定を編集することができるようになりました。
スコアに応じたアクションの設定
Rspamd のデフォルトではスコアが 15 ポイントを超えると Reject され、メールを受け取らずにエラーを送信元へ突き返します。誤判定も考えられる状況で、内容を確認できないのは危ないので、Reject は無効(null)にしておきます。
Rspamd の override.d に設定(actions.conf)を配置することで、スコアに応じた挙動を上書きします。
1 2 3 | reject = null; add_header = 10; greylist = 20; |
メールヘッダーに付与する情報の設定
milter_headers.conf を作成して、受信したメールのヘッダに追加したい項目をカスタマイズします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | use = ["spam-header", "x-spam-level", "x-spam-status", "x-virus", "authentication-results"]; skip_local = true; skip_authenticated = true; extended_spam_headers = true; routines { spam-header { header = "X-Spam-Flag"; remove = 1; value = "YES"; } x-spam-level { header = "X-Spam-Level"; remove = 1; char = "*"; } x-spam-status { header = "X-Spam-Status"; remove = 1; } x-virus { header = "X-Virus-Check"; remove = 0; symbols = ["CLAM_VIRUS"]; } authentication-results { header = "Authentication-Results"; remove = 1; add_smtp_user = false; spf_symbols { pass = "R_SPF_ALLOW"; fail = "R_SPF_FAIL"; softfail = "R_SPF_SOFTFAIL"; neutral = "R_SPF_NEUTRAL"; temperror = "R_SPF_DNSFAIL"; none = "R_SPF_NA"; permerror = "R_SPF_PERMFAIL"; } dkim_symbols { pass = "R_DKIM_ALLOW"; fail = "R_DKIM_REJECT"; temperror = "R_DKIM_TEMPFAIL"; none = "R_DKIM_NA"; permerror = "R_DKIM_PERMFAIL"; } dmarc_symbols { pass = "DMARC_POLICY_ALLOW"; permerror = "DMARC_BAD_POLICY"; temperror = "DMARC_DNSFAIL"; none = "DMARC_NA"; reject = "DMARC_POLICY_REJECT"; softfail = "DMARC_POLICY_SOFTFAIL"; quarantine = "DMARC_POLICY_QUARANTINE"; } } } |
Web GUI の編集権限を設定
Rspamd の初期設定で行った configwizard によって、worker-controller.inc に password の設定がされています。
ただし、これだけだと閲覧権限しかありませんので、 ルール等の編集可能な権限の enable_password も設定しておきます。
1 2 | password = "(閲覧ユーザーのパスワードハッシュ)"; enable_password = "(管理者用のパスワードハッシュ)"; |
Rspamd の起動
ここまで出来たら Rspamd を起動し、自動開始も設定しておきましょう。
1 2 | # systemctl start rspamd # systemctl enable rspamd |
Postfix と連動する
Rspamd のデフォルトでは INET ドメインで連携しますが、大量のメールを捌くサーバーの場合は UNIX ドメインソケットの方がスループットが優れているので、変更しておくと良いでしょう。
Rspamd のソケットを UNIX ドメインに変更
Rspamd の override.d に worker-proxy.inc を作成して、ソケットの設定を上書きします。
1 | bind_socket = "/run/rspamd/worker-proxy.sock mode=0660"; |
Rspamd を再起動(systemctl restart rspamd)すると、worker-proxy.sock が作成されます。これを Postfix からアクセスできるように Rspamd グループに Postfix ユーザーを追加します。
1 | # usermod -G _rspamd -a postfix |
Postfix の設定変更
Rspamd を Postfix の Milter(Mail Filter) に登録するため、main.cf の最終行に下記の設定を追加します。
1 2 3 4 5 | # Rspamd smtpd_milters = unix:/run/rspamd/worker-proxy.sock #smtpd_milters = inet:localhost:11332 milter_default_action = accept milter_protocol = 6 |
設定したら、Postfix を再起動(systemctl restart postfix)しておきましょう。
Rspamd の Web GUI 設定
Rspamd の管理画面は http://サーバーの IP アドレス:11334 から開くことができますが、ポートが塞がっているため外部からアクセスするにはファイヤーウォールの設定変更が必要です。
OpenLiteSpeed でリバースプロキシを設定して、ポートを開放せずにアクセスできるようにし、必要に応じてアクセス制限もできるようにします。
OpenLiteSpeed のリバースプロキシ設定
OLS の管理画面で、サーバー設定 ⇒ 外部アプリ に移動し「Web サーバー」を追加します。
- 名前:Rspamd
- アドレス:127.0.0.1:11334
次に、バーチャルホスト ⇒(バーチャルホスト名)⇒ Rewrite から Rewrite 制御の項目を下記に変更します。
- Rewrite を有効にする:はい
- Auto Load from .htaccess:はい
そして、Rewrite ルールを追加します。
1 2 | RewriteCond %{REMOTE_ADDR} ^198\.51\.100\.0$ RewriteRule ^/rspamd/(.*) http://Rspamd/$1 [P,L] |
RewriteCond でアクセスできる IP アドレスを制限し、RewriteRule で外部アプリに設定したアドレスに転送しています。(※アクセス制限が必要な場合のみ)
設定を変更したら、管理画面から OLS を再起動して反映させます。
ブラウザで https://(ドメイン名)/rspamd/ にアクセスして、Rspamd のログイン画面が表示されることを確認してください。
コメント