迷惑メール対策ツール「Rspamd」の導入。Postfix、CentOS Stream release 8版

迷惑メールを除去してくれるツール、「Rspamd」。

迷惑メール対策ツール「Rspamd」の導入。Postfix,CentOS7
SpamAssassinでの除去は、設定が大変で、精度がもう少し高かったらなー。 で、「RSPAMD」を! 確かに、postfix回り、その他のツール系も設定が楽になりました。 かつ、迷惑メールの判断も、それなりにいいですー。 関連...

の「CentOS Stream release 8」版です。
ほとんど変わりなく、インストールできます。

前提作業

Postfix 3.6 ソースインストール CentOS Stream8
Postfix 3.6、マルチドメン版をソースからインストールします。 Postfix 3.4 + CentOS7版は、上記から CentOS Stream8 CentOS9の中止、CentOS8のサポート短縮など、Cen...
Dovecot-2.3.14 [CentOS Stream 8] 基本設定
上記の作業の次、POP系のソフト、Dovecot-2.3.14のインストールメモ書きです。 CentOS7版は、上記。 今回も、Conoha VPSで、行いました。 dovecot 用 ユーザ/...
Postfix 3.6,Dovecot 2.3 SSL送受信 [CentOS Stream 8]
Postfixにて、SSL送信 Dovecotにて、SSL受信 を行う設定です。 ↑Postfix3.4 CentOS7版 今回も、Conoha VPSで、行いました。 Let's Encrypt ...
Postfix、Dovecot、メールボックス容量制限 [quota]
メールボックスの容量制限を行う場合、ネットを検索すると、postfixにパッチをあてる。 という方法をよく見ますが、パッチ自体、だいぶ前から更新されていなく・・・ 最近では、Dovecotで、Quotaプラグインを使う方法が無難な感...

CentOSバージョン

# cat /etc/centos-release 
CentOS Stream release 8
# uname -a
Linux 118-27-30-111 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

redis

Rspamdでは、NoSQLタイプの「redis」を使います。

# dnf install redis
Updating Subscription Management repositories.
Unable to read consumer identity

(略)

Installed:
  redis-5.0.3-2.module_el8.2.0+318+3d7e67ea.x86_64                                                                                                                            

Complete!
# redis-server --version
Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=28849dbea6f07cc8

↑redis version 5.0.3が入りました

# systemctl start redis.service
# systemctl status redis.service

● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Thu 2021-XX-XX XX:XX:XX JST; 6s ago
 Main PID: 2567 (redis-server)
    Tasks: 4 (limit: 11404)
   Memory: 6.5M
   CGroup: /system.slice/redis.service
           └─2567 /usr/bin/redis-server 127.0.0.1:6379

systemd[1]: Starting Redis persistent key-value database...
systemd[1]: Started Redis persistent key-value database.

↑redisを起動させました

# systemctl enable redis.service
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /usr/lib/systemd/system/redis.service.

↑redis 、自動起動を設定

rspamd 本体インストール

# curl https://rspamd.com/rpm-stable/centos-8/rspamd.repo > /etc/yum.repos.d/rspamd.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   167  100   167    0     0     65      0  0:00:02  0:00:02 --:--:--    65
# rpm --import https://rspamd.com/rpm-stable/gpg.key
# yum install rspamd
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

(略)

Installed:
  libsodium-1.0.18-2.el8.x86_64                                libunwind-1.3.1-3.el8.x86_64                                rspamd-2.7-42.x86_64                               

Complete!

rspamd 設定

# rspamadm configwizard
  ____                                     _
 |  _ \  ___  _ __    __ _  _ __ ___    __| |
 | |_) |/ __|| '_ \  / _` || '_ ` _ \  / _` |
 |  _ < \__ \| |_) || (_| || | | | | || (_| |
 |_| \_\|___/| .__/  \__,_||_| |_| |_| \__,_|
             |_|

Welcome to the configuration tool
We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd
Modules enabled: metadata_exporter, elastic, mime_types, once_received, milter_headers, spf, phishing, whitelist, dkim_signing, mid, emails, arc, hfilter, settings, asn, force_actions, forged_recipients, bayes_expiry, regexp, fuzzy_check, multimap, chartable, dmarc, rbl, dkim, trie, maillist
Modules disabled (explicitly): http_headers, mx_check, spamtrap, p0f, rspamd_update, dcc
Modules disabled (unconfigured): antivirus, external_services, ip_score, dynamic_conf, spamassassin, maps_stats, reputation, metric_exporter, clustering, clickhouse, fuzzy_collect
Modules disabled (no Redis): neural, url_redirector, history_redis, ratelimit, greylist, replies
Modules disabled (experimental): 
Modules disabled (failed): 
Do you wish to continue?[Y/n]: 【(Enter)】
Setup WebUI and controller worker:
Controller password is not set, do you want to set one?[Y/n]: 【n】
Redis servers are not set:
The following modules will be enabled if you add Redis servers:
        * neural
        * url_redirector
        * history_redis
        * ratelimit
        * greylist
        * replies
Do you wish to set Redis servers?[Y/n]: 【(Enter)】
Input read only servers separated by `,` [default: localhost]: 【(Enter)】
Input write only servers separated by `,` [default: localhost]: 【(Enter)】
Do you have any password set for your Redis?[y/N]: 【(Enter)】
Do you have any specific database for your Redis?[y/N]: 【(Enter)】
Do you want to setup dkim signing feature?[y/N]: 【(Enter)】
File: /etc/rspamd/local.d/redis.conf, changes list:【(Enter)】
write_servers => localhost
read_servers => localhost

Apply changes?[Y/n]: 【(Enter)】
Create file /etc/rspamd/local.d/redis.conf
1 changes applied, the wizard is finished now
*** Please reload the Rspamd configuration ***
vi /etc/rspamd/local.d/redis.conf
----------------------------------
write_servers = "localhost";
read_servers = "localhost";
 ↓
write_servers = "127.0.0.1:6379";
read_servers = "127.0.0.1:6379";
vi /etc/rspamd/local.d/milter_headers.conf

use = ["spam-header", "x-spam-level", "x-spam-status", "x-virus", "authentication-results"];
skip_local = false;
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 = 1;
    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上のパスワードを設定します。

rspamadmコマンドで、パスワードを設定します。
パスワードを入れると、長い英数字が出てきます。

閲覧用パスワード

# rspamadm pw
Enter passphrase: (閲覧用パスワード)
(長い英数字)

管理用パスワード

# rspamadm pw
Enter passphrase: (管理用パスワード)
(長い英数字)
# vi /etc/rspamd/local.d/worker-controller.inc

password = " (閲覧用パスワードで出力された長い英数字)";
enable_password = "(管理用パスワードで出力された長い英数字)";

↑rspamadm コマンドで出力された英数字をファイルに保存します。

Postfix 連携

vi /etc/postfix/main.cf
# rspamd
smtpd_milters = inet:localhost:11332
milter_default_action = accept
milter_protocol = 6

↑上記の設定を加えるだけでOKです

Rspamd起動

# systemctl start rspamd
# systemctl status rspamd
● rspamd.service - rapid spam filtering system
   Loaded: loaded (/usr/lib/systemd/system/rspamd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-XX-XX XX:XX:XX JST; 4s ago
     Docs: https://rspamd.com/doc/
 Main PID: 3961 (rspamd)
    Tasks: 5 (limit: 11404)
   Memory: 132.2M
   CGroup: /system.slice/rspamd.service
           ├─3961 rspamd: main process
           ├─3962 rspamd: rspamd_proxy process (localhost:11332)
           ├─3963 rspamd: controller process (localhost:11334)
           ├─3964 rspamd: normal process (localhost:11333)
           └─3965 rspamd: hs_helper process

systemd[1]: Started rapid spam filtering system.
# systemctl enable rspamd

↑起動をして、自動起動も設定をします。

Rspamd WEB設定

# vi /etc/httpd/conf.d/userdir.conf

<Location /rspamd>
        Order allow,deny
        Allow from all
</Location>
<IfModule mod_rewrite.c>
        RewriteEngine  on
        RewriteRule ^/rspamd$ /rspamd/ [R,L]
        RewriteRule ^/rspamd/(.*) http://localhost:11334/$1 [P,L]
</IfModule>

http://(サーバーのIPアドレス)/rspamd/
で、アクセスができます。

↑ブラウザからアクセスをすると、パスワードを入れる小窓が出てきます。

↑ログインすると、このような画面が出てきます。

DKIM

# dnf install opendkim
Updating Subscription Management repositories.
Unable to read consumer identity

This system is not registered with an entitlement server. You can use subscription-manager to register.

(略)

Installed:
  libbsd-0.9.1-4.el8.x86_64            libmemcached-libs-1.0.18-15.el8.x86_64 libopendkim-2.11.0-0.17.el8.x86_64 opendbx-1.4.6-21.el8.x86_64 opendkim-2.11.0-0.17.el8.x86_64
  sendmail-milter-8.15.2-34.el8.x86_64

Complete!

↑「opendkim」が入りました。

# mkdir /etc/opendkim/keys/(ドメイン)
# opendkim-genkey -d (ドメイン) -s (セレクタ) -D /etc/opendkim/keys/(ドメイン)/
# chown -R opendkim.opendkim /etc/opendkim/keys/(ドメイン)/
# chmod a+r /etc/opendkim/keys/(ドメイン)z/(セレクタ).*
# chmod 755 /etc/opendkim/keys/

↑特定ドメインの設定です。ドメイン毎に行います。
「セレクタ」は、「YYYYMMDD」という数字にするのが通例な感じのようです。

# vi /etc/rspamd/local.d/dkim_signing.conf

domain {
    (ドメイン) {
        selector = "(セレクタ)";
        path = "/etc/opendkim/keys/(ドメイン)/(セレクタ).private";
    }
}
use_domain = "header";

↑ドメインが増える場合は、「(ドメイン){・・・}」の部分を増やします。

# cat /etc/opendkim/keys/(ドメイン)/(セレクタ).txt 
(セレクタ)._domainkey      IN      TXT ・・・

↑ 上記を、ドメインのDNSに登録をします。

DMARC

# vi /etc/rspamd/local.d/dmarc.conf

# Enables storing reporting information to redis
reporting = true;
actions = {
    quarantine = "add_header";
    reject = "reject";
}
_dmarc.(ドメイン).              IN TXT "v=DMARC1; p=none;"

↑該当ドメインのDNSで、上記を設定します。

SPF

(ドメイン).  IN TXT "v=spf1 ip4:XXX.XXX.XXX.XXX ip6:XX:XX:XX:XX:XX:XX:XX:XX -all"

↑SPFは、DNSの設定をするだけで有効となります。サーバーのグローバルIPを入れます。
上記では、ipv4と、ipv6の設定をしています。

↑ SPF、DKIM、DMARC の設定がうまくいくと、gmail宛てにメールを送ると、gmail側で「PASS」と表示されます。

Rspamd メールの振り分け

外部から来たメールが、迷惑メールだと判定されたら、「.Junk」フォルダに移動させて、通常のメールボックスには、配送されない設定です。

「pigeonhole」を使います。

# wget https://pigeonhole.dovecot.org/releases/2.3/dovecot-2.3-pigeonhole-0.5.14.tar.gz
# tar xzvf dovecot-2.3-pigeonhole-0.5.14.tar.gz
# cd dovecot-2.3-pigeonhole-0.5.14/
# ./configure --with-dovecot=/usr/lib64/dovecot/

# make
# make install
# cp /usr/share/doc/dovecot/example-config/conf.d/90-sieve.conf /etc/dovecot/conf.d/
# vi /etc/dovecot/conf.d/90-sieve.conf

  #sieve_default = /var/lib/dovecot/sieve/default.sieve
  ↓
  sieve_default = /var/lib/dovecot/sieve/default.sieve
# mkdir -p /var/lib/dovecot/sieve/
# vi /var/lib/dovecot/sieve/default.sieve

require ["fileinto", "reject"];
if header :contains ["X-Spam"] "spam" {
      fileinto "Junk";
      stop;
}
if header :contains ["X-Spam-Flag"] "YES" {
      fileinto "Junk";
      stop;
}
if header :contains ["X-Spam-Status"] "YES" {
      fileinto "Junk";
      stop;
}
vi /etc/dovecot/conf.d/15-mailboxes.conf
--------------------------
  mailbox Junk {
    special_use = \Junk
  }
 
 ↓
  mailbox Junk {
    special_use = \Junk
    auto = subscribe
  }
--------------------------
# cd /var/lib/dovecot
# chown -R vuser.vuser sieve
# vi /etc/dovecot/local.conf

base_dir = /var/run/dovecot/
# vi /etc/dovecot/conf.d/15-lda.conf
-------------------------
protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins
}
 ↓
protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  mail_plugins = $mail_plugins sieve
}
vi /etc/postfix/main.cf

dovecot_destination_recipient_limit = 1
# vi /etc/rspamd/local.d/actions.conf
# 「greylist」は設定しない・・・
greylist = null;

↑ 上記のようになった、迷惑メールは、「.Junk」フォルダに配送されて、通常のメール受信では配送されません。

許可リスト/拒否リスト(ホワイトリスト/ブラックリスト)

vi /etc/rspamd/local.d/multimap.conf

# IPアドレスで「許可」
IP_WHITELIST {
      type = "ip";
      prefilter = "true";
      map = "${LOCAL_CONFDIR}/local.d/ip_whitelist.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 = -20.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 = 20.0
}
# chown _rspamd._rspamd /etc/rspamd/local.d/
# systemctl restart rspamd

↑ 画面上からは、上記のように見えます

その他設定

迷惑メールと判断されて、「.Junk」フォルダに入ったメールを救い出す、一つの方法は、Rainloopです。

下記の設定を参考にしてみてください。

Postfix 3.4 [RainLoop] CentOS7 (マルチドメイン)
Webからメールをチェックできる、RainLoopの設定です。 SpamAssassinで、迷惑メール扱いになったメールを、閲覧/救出することができます。 RainLoop インストール/設定 # wget # mkdir /va...

 

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