CentOS8でメールサーバ構築 – 迷惑メール対策の導入(RSPAMD)

メールサーバを運用していると迷惑メールが来てしまう可能性があります。

大手のフリーメールを使っているとそうそう迷惑メールは見ないですがそれはそのフリーメール自体が迷惑メールフィルタで振り分けをしている為で、自分のメールサーバでは何の対策もしていないと迷惑メールが届くようになってしまいます。

迷惑メール対策の為にオープンソースのメールフィルタであるRSPAMDを導入します。

この記事で行うこと

  1. 必要なソフトウェア
  2. RSPAMDのインストール
  3. RSPAMDの初回設定
  4. Redisの設定
  5. Postfixの設定
  6. WebUIの設定
  7. RSPAMDの起動

1. 必要なソフトウェア

RSPAMD自体は単体で動作できるソフトウェアになります。

しかしRSPAMD単体では機能やパフォーマンスが制限されるため、以下のソフトウェアのインストールをオススメします。

本記事ではここで挙げているソフトウェアがインストールされている前提で話を進めます。

  • Postfix
  • Dovecot

この2つは既にここに至るまでにインストールしているはずなので割愛します。

  • Redis

Redisは主にキャッシュ情報の保持に使われます。これによって高速化が出来ます。

また、一部のモジュール(機能)はRedisが必須となっています。

公式ページの説明上もRedisは準必須という扱いとされているためインストールすることを推奨します。

Redisのインストールについては以下のページを参照してください。

今回はNginxを通じてRedisを使う訳ではないので、Nginx以降の部分は設定不要です。
(ただ、別途で同じような設定を行います。)
  • Nginx

NginxはRSPAMDのWebUIへのアクセスに使います。

Nginx無しでもアクセスは可能ですが、接続が暗号化されないこととアクセス制御が面倒なため、一回Nginxに接続してそこからTLSでRSPAMDに繋ぐ方法を取ります。

Nginxのインストールについては以下のページを参照してください。

Webページの暗号化まで行うようにしてください。(PHPは不要です)

2. RSPAMDのインストール

RSPAMDはRSPAMDの公式リポジトリからインストールすることが出来ます。

リポジトリについては以下のページを参照してください。

今回は「3-1-2.提供元からダウンロード」の方法でリポジトリを追加します。

以下のコマンドでリポジトリの追加・RSPAMDのインストールを行います。

[root@localhost ~]# wget https://rspamd.com/rpm-stable/centos-8/rspamd.repo -P /etc/yum.repos.d/
[root@localhost ~]# dnf install rspamd

GPGキーの確認などがありますが、全て y で大丈夫です。

もしソフトウェアの改竄などが気になるのであれば、先にGPGキーをダウンロードしておくと安心かもしれません。

[root@localhost ~]# rpm --import https://rspamd.com/rpm-stable/gpg.key

3. RSPAMDの初期設定

RSPAMDをインストールすると rspamadm configwizard というコマンドが使えます。

このコマンドを使うことでRSPAMDの設定を対話的に行うことができます。

以下に設定を示します。最初のコマンド以外の部分で "" で括られている物は自分で入力する部分です。 "" とだけ記載されている場合は空欄のままEnterを押してください。

[root@localhost ~]# rspamadm configwizard
  ____                                     _
 |  _ \  ___  _ __    __ _  _ __ ___    __| |
 | |_) |/ __|| '_ \  / _` || '_ ` _ \  / _` |
 |  _ < \__ \| |_) || (_| || | | | | || (_| |
 |_| \_\|___/| .__/  \__,_||_| |_| |_| \__,_|
             |_|

Welcome to the configuration tool
We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd
Modules enabled: force_actions, forged_recipients, trie, milter_headers, fuzzy_check, emails, whitelist, dkim, chartable, multimap, elastic, dmarc, spf, settings, rbl, hfilter, mime_types, regexp, asn, dkim_signing, once_received, mid, bayes_expiry, phishing, maillist, metadata_exporter, arc
Modules disabled (explicitly): rspamd_update, spamtrap, dcc, p0f, mx_check
Modules disabled (unconfigured): fuzzy_collect, clickhouse, spamassassin, reputation, dynamic_conf, clustering, external_services, ip_score, antivirus, maps_stats, metric_exporter
Modules disabled (no Redis): neural, ratelimit, replies, url_redirector, history_redis, greylist
Modules disabled (experimental):
Modules disabled (failed):
Do you wish to continue?[Y/n]: ""
Setup WebUI and controller worker:
Controller password is not set, do you want to set one?[Y/n]: ""
Enter passphrase: "好きなパスワードを入力する"
Set encrypted password to: $1$cybjp37q4w63iogc4erncz1tgm1ce9i5$kxfx9xc1wk9uuakw7nittbt6dgf3qyqa394cnradg191iqgxr8kb
Redis servers are not set:
The following modules will be enabled if you add Redis servers:
        * neural
        * ratelimit
        * replies
        * url_redirector
        * history_redis
        * greylist
Do you wish to set Redis servers?[Y/n]: ""
Input read only servers separated by `,` [default: localhost]: "RedisのUNIXドメインソケットの場所。このサイトの記述通りに設定した場合は /run/redis/redis.sock"
Input write only servers separated by `,` [default: /run/redis/redis.sock]: ""
Do you have any password set for your Redis?[y/N]: ""
Do you have any specific database for your Redis?[y/N]: ""
Do you want to setup dkim signing feature?[y/N]: "DKIM署名を使う場合はy。DKIM署名については次回に説明します。nにした場合は残りの設定はスキップされ設定内容が表示されます。"
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]: ""
Do you want to sign mail from authenticated users? [Y/n]: ""
Allow data mismatch, e.g. if mime from domain is not equal to authenticated user domain? [Y/n]: ""
Do you want to use effective domain (e.g. example.com instead of foo.example.com)? [Y/n]: "n(これをyにするとサブドメインを使ったメールアドレスでのDKIM署名に制限が出ます。"
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/メールアドレスのドメイン.dkim.key[Y/n]:""
To make dkim signing working, you need to place the following record in your DNS zone:
dkim._domainkey IN TXT ( "v=DKIM1; k=rsa; "
        "p=ここの文字列はコピーして保管しておくこと") ;

Do you wish to add another DKIM domain?[y/N]: "もし複数ドメインで送信する場合はy、それ以外はn"

設定内容が表示される。

Apply changes?[Y/n]: ""

これでRSPAMD側の設定はほぼ完了です。

4. Redisの設定

RSPAMDにはRedisのUNIXドメインソケットを教えましたが、RSPAMDはRedisのファイルにアクセスするための権限がないので、アクセスが出来ません。

このため、RSPAMDに redis グループを付与します。

先ほどインストールで挙げていたこの記事のnginxの代わりに_rspamdを入れてあげます。
[root@localhost ~]# groupmems --add _rspamd --group redis

これでRSPAMDがRedisにアクセス出来るようになります。

5. Postfixの設定

このままの状態ではPostfixからRSPAMDにメールを引き渡すことが出来ません。

このため、PostfixとRSPAMD間でメールをやりとりする窓口を設定します。

メールフィルタとPostfix間でやりとりする為のmilterという規格があるので、これをRSPAMDのmilterの場所をPostfixに教えてあげます。

/etc/postfix/main.cf の末尾に以下の設定を追加します。(milterに関する設定は初期値では存在しないので末尾に後付けで大丈夫です)

# milter settings
smtpd_milters = inet:localhost:11332
milter_default_action = accept

milter_default_action = accept はRSPAMDが機能していないときにとりあえずメールを受け取るという設定です。 reject にするとRSPAMDが機能していないときに拒否、 tempfail にすると一時エラーとする設定になります。

なお、RedisのようなUNIXドメインソケット形式の接続はサポートされていないようです。

5. WebUIの設定

WebUIに関してはRSPAMDの設定を少し触る必要があります。

WebUIの設定を行うファイルは /etc/rspamd/local.d/worker-controller.inc となります。

このファイルはユーザが決めた変更のみを書き込むようになっています。

デフォルト値は別のファイルにあります。( /etc/rspamd/worker-controller.inc

ファイルを開いた時点では以下のようになっているはずです。

password = "$1$cybjp37q4w63iogc4erncz1tgm1ce9i5$kxfx9xc1wk9uuakw7nittbt6dgf3qyqa394cnradg191iqgxr8kb";

これは先ほど初期設定で入れたパスワードを暗号化した物です。(当然 "" 内の部分は入れたパスワードによって変わります。)

これを以下のように変えます。

bind_socket = "/run/rspamd/worker-controller.socket mode=0660 owner=_rspamd group=nginx";
enable_password = "$1$cybjp37q4w63iogc4erncz1tgm1ce9i5$kxfx9xc1wk9uuakw7nittbt6dgf3qyqa394cnradg191iqgxr8kb";

bind_socket という行を追加します。これはRedisと同様にUNIXドメインソケットで接続するための設定です。最初にソケットのファイルパス、 mode はソケットのアクセス権設定、 ownergroup はそれぞれ所有者と所有グループです。

ファイル権限についてはこちらを参照してください。

また、 password の前に enable_ を加えます。これが無いとWebUIにアクセスしても閲覧権だけで設定変更が出来なくなります。

次に、 _rspamdnginx グループの権限を加えます。

[root@localhost ~]# groupmems --add _rspamd --group nginx

これは、先ほどのRSPAMDの設定で nginx グループでソケットを作るように設定していますが、自分が nginx グループに入っていないと nginx グループのファイルを作成できないためです。

なお、逆にRSPAMDの設定で _rspamd グループでソケットを生成するように設定して、 nginx_rspamd グループの権限を加えても問題ありません。お好みでどうぞ。

最後に、nginxの設定をします。

/etc/nginx/conf.d/ 内に拡張子が .conf の適当な名前のファイルを作って設定します。

以下は最低限の設定です。この設定の場合 https://ホスト名/rspamd/ でアクセスすることができます。

server {
    server_name  「ホスト名」;
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl_certificate /etc/letsencrypt/live/note.yuto-shin.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/note.yuto-shin.net/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location /rspamd/ {
        # アクセス制限をする場合追加
        allow 127.0.0.1; #アクセスを許可したいIPアドレス
            deny all;

        proxy_pass http://unix:/run/rspamd/worker-controller.socket:/; #bind_socketで設定したパス
        proxy_set_header Host      $host;
        proxy_set_header X-Forwarded-For "$proxy_add_x_forwarded_for";
    }
}

なお、既にある設定に location /rspamd/ の部分を加える形でも大丈夫です。(この時は {} の対応に気をつけてください)

コメントにあるとおり allow から deny all; の部分はIPアドレスによるアクセス制限を行う場合のみ記載してください。

7. RSPAMDの起動

起動は他のソフトと大差ありません。

[root@localhost ~]# systemctl enable rspamd --now

起動したら、WebUIでアクセス出来ることを確認してみてください。

まとめ

今回はスパムフィルタの設定を行いました。

とはいえ、最初のうちはスパムもそうそう来ないのであまり実感できないと思います。

WebUIのhistoryの項を確認すると、ちゃんとスパムか否か判定しているんだなということが分かると思います。

次回はRSPAMDを使ってDKIM署名の設定を行います。これは自分のメールがスパムと判定されないようにするために行う設定となります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です