Rspamdによるスパムメール対策、ウイルススキャン

Rspamdを使って、スパムメール対策やウイルススキャンなどのメールサーバのセキュリティ強化を実施する。

事前準備

リポジトリの追加を参考にして、EPELリポジトリを有効にしておくこと。
メールサーバの構築を参考にして、Postfixを導入しておくこと。
ウイルス対策を参考にして、clamavを導入しておくこと。
Sieveによるサーバ側でのメール振り分けを参考にして、Sieveを導入しておくこと。

redisインストール

RspamdはNoSQL系のDB「redis」を必須としているため、redisのインストールを行う。

dnf install redis

以下のコマンドでインストールできているかを確認する。

redis-sever --version
Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=8c0bf22bfba82c8f

redisを起動し、自動起動設定する。

systemctl start redis
systemctl enable redis

Rspamdインストール

RSpamdのリポジトリをインストールしてから、dnfコマンドでRspamdをインストールする。

curl https://rspamd.com/rpm-stable/centos-8/rspamd.repo > /etc/yum.repos.d/rspamd.repo
rpm --import https://rspamd.com/rpm-stable/gpg.key
dnf install rspamd

Rspamd 設定

一箇所だけN、それ以外はエンターキーで進める。

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

Welcome to the configuration tool
We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd
Modules enabled: hfilter, phishing, emails, asn, settings, chartable, arc, bayes_expiry, once_received, rbl, fuzzy_check, metadata_exporter, elastic, mid, multimap, spf, dkim_signing, dkim, mime_types, regexp, maillist, dmarc, forged_recipients, milter_headers, whitelist, force_actions, trie
Modules disabled (explicitly): p0f, spamtrap, rspamd_update, mx_check, dcc
Modules disabled (unconfigured): spamassassin, maps_stats, metric_exporter, dynamic_conf, clustering, reputation, antivirus, fuzzy_collect, external_services, ip_score, clickhouse
Modules disabled (no Redis): greylist, url_redirector, replies, neural, ratelimit, history_redis
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]: n (ここだけn)
Redis servers are not set:
The following modules will be enabled if you add Redis servers:
* greylist
* url_redirector
* replies
* neural
* ratelimit
* history_redis
Do you wish to set Redis servers?[Y/n]: 
Input read only servers separated by `,` [default: localhost]: 
Input write only servers separated by `,` [default: localhost]: 
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]: 
File: /etc/rspamd/local.d/redis.conf, changes list:
write_servers => localhost
read_servers => localhost

Apply changes?[Y/n]: 
Create file /etc/rspamd/local.d/redis.conf
1 changes applied, the wizard is finished now
*** Please reload the Rspamd configuration ***

rspamadmコマンドで、閲覧用と管理用のパスワードを入力して、それぞれエンコードされたパスワードを取得する。

rspamadm pw
Enter passphrase:(閲覧用パスワードを入力)
(エンコードされた文字列が表示される)
rspamadm pw
Enter passphrase:(管理用パスワードを入力)
(エンコードされた文字列が表示される

生成された文字列を設定ファイルに登録する。

vi /etc/rspamd/local.d/worker-controller.inc

password = "(出力された英数字文字 閲覧用)";
enable_password = "(出力された英数字文字 管理用)";

Redisサーバの情報を設定ファイルに登録する。

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

write_servers = "127.0.0.1:6379";
read_servers = "127.0.0.1:6379";

到着したメールのヘッダに「X-Spam-Level」などの情報を追加するための設定を行う。

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";
    }
  }
}

Sieve設定

DovecotでデフォルトのSieve設定ファイルの場所を設定する。

vi /etc/dovecot/conf.d/90-sieve.conf

sieve_default = /var/lib/dovecot/sieve/default.sieve

/var/lib/dovecot直下に「sieve」フォルダを作成する。

mkdir -p /var/lib/dovecot/sieve/

デフォルトの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;
}

スパム判定されたものをJunkフォルダへ移動するようにする設定である。

メールボックスの設定を行う。

vi /etc/dovecot/conf.d/15-mailboxes.conf

namespace inbox {
  (中略)
  mailbox Junk {
    special_use = \Junk
    auto = subscribe
  }
  (中略)
}

Rspamdサービス起動、自動起動設定

systemctl start rspamd
systemctl enable rspamd

Dovecotサービス再起動

systemctl restart dovecot

ポート開放

Rspamdの管理画面は、TCPの11334番のポートで受け付けるので、そのポートを開放するように設定する。

firewall-cmd --add-port=11334/tcp --permanent
firewall-cmd --reload

Rspamdの管理画面へのアクセス

ブラウザでhttp://[IPアドレス]:11334/へアクセスする。
閲覧用もしくは管理用のパスワードを入力してログインできればOK。

DKIMモジュールの設定

DKIM(DomainKeys Identified Mail)とは、電子メールにおける送信ドメイン認証技術の一つであり、メールを送信する際に送信元が電子署名を行い、受信者がそれを検証することで、送信者のなりすましやメールの改ざんを検知できるようにするものである。

dnf install opendkim
mkdir /etc/opendkim/keys/(ドメイン名)
opendkim-genkey -d (ドメイン名) -s (セレクタ名) -D /etc/opendkim/keys/(ドメイン名)/

セレクタを指定することで、1つのドメインで複数の公開鍵を利用することができる。セレクタ名には日付(YYYYMMDDなど)をつけることが多いようだ。

RspamdとOpenDKIMとの連携の設定を行う。

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

allow_hdrfrom_mismatch = true;
allow_hdrfrom_mismatch_sign_networks = true;
allow_username_mismatch = true;
use_domain = "header";
auth_only = true;
use_esld = true;
sign_local = true;
use_redis = false;

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

起動時に秘密鍵を生成しないようにする。

vi /etc/sysconfig/opendkim

AUTOCREATE_DKIM_KEYS=NO

OpenDKIMの設定ファイルを編集する。

vi /etc/opendkim.conf

#Mode v
↓
Mode sv

KeyFile /etc/opendkim/keys/default.private
↓
#KeyFile /etc/opendkim/keys/default.private

# KeyTable /etc/opendkim/KeyTable
↓
KeyTable /etc/opendkim/KeyTable

# SigningTable refile:/etc/opendkim/SigningTable
↓
SigningTable refile:/etc/opendkim/SigningTable

# ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
↓
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts

# InternalHosts refile:/etc/opendkim/TrustedHosts
↓
InternalHosts refile:/etc/opendkim/TrustedHosts

KeyTableに、ドメイン名とセレクタに対応する秘密鍵ファイルの場所を記載する。

vi /etc/opendkim/KeyTable

(セレクタ名)._domainkey.(ドメイン名) (ドメイン名):(セレクタ名):/etc/opendkim/keys/(ドメイン名)/(セレクタ名).private

SigningTableに、署名を適用するメールアドレスに対応するセレクタとドメイン名を記載する。

vi /etc/opendkim/SigningTable

*@(ドメイン名) (セレクタ)._domainkey.(ドメイン名)

DKIMのDNSへの登録

DNSに登録する内容を確認する。

cat /etc/opendkim/keys/(ドメイン名)/(セレクタ名).txt

(セレクタ)._domainkey IN TXT ( "v=DKIM1; k=rsa; "
  "p=長い文字列" )  ; ----- DKIM key (セレクタ) for (ドメイン名)

DNSの設定で、「v=DKIM1; k=rsa; p=長い文字列」を「(セレクタ)._domainkey」サブドメインのTXTレコードとして追加する。

パーミッション、所有者設定

chmod a+r /etc/opendkim/keys/(ドメイン名)/(セレクタ).*
chown -R _rspamd:_rspamd /etc/opendkim

SPFのDNSへの登録

SPF(Sender Policy Framework)とは、電子メールの送信元ドメインが詐称されていないかを検査するための仕組みである。

SPFモジュールは、すでにRspamdに組み込まれているが、DNSにSPFレコードを登録する必要がある。
ドメインのTXTレコードとして、以下の内容で登録する。

v=spf1 a:(送信メールサーバのホスト名) ~all

もし送信メールサーバのホスト名がmail.hogehoge.comであるならば、hogehoge.comのTXTレコードとして、以下の内容で登録することになる。

v=spf1 a:mail.hogehoge.com ~all

DMARC用のDNSへの登録

DMARC(Domain-based Message Authentication, Reporting and Conformance)とは、電子メールの「送信者なりすまし」や「メール内容の改ざん」といった不正を防ぐ事を目的とした、セキュリティ技術(送信ドメイン認証)の1つである。

DMARCに対応するには、まずSPFとDKIMの設定が行われていることが前提である。

DNSの設定で、_dmarcサブドメインに以下の内容でTXTレコードを登録する。

v=DMARC1; p=none; rua=mailto:(管理者メールアドレス); ruf=mailto:(管理者メールアドレス)

管理者メールアドレスには、レポートメールが送られる。

ドメイン名がhogehoge.comで、管理者メールアドレスがadmin@hogehoge.comであるならば、_dmarc.hogehoge.comのTXTレコードとして、以下の内容で登録することになる。

v=DMARC1; p=none; rua=mailto:admin@hogehoge.com; ruf=mailto:admin@hogehoge.com

PostfixとRspamdとの連携設定

Postfixの設定ファイルを編集し、PostfixとRspamdを連携させるようにする。

vi /etc/postfix/main.cf

# rspamd
smtpd_milters = inet:localhost:11332
milter_default_action = accept
milter_protocol = 6

ウイルスのスキャン設定

ClamAVのスキャン設定を編集する。

vi /etc/clamd.d/scan.conf

#TCPSocket 3310
↓
TCPSocket 3310
 
#TCPAddr 127.0.0.1
↓
TCPAddr 127.0.0.1

RspamdのClamAVとの連携設定

RspamdとClamAVを連携させるために、antivirus.confを以下の内容で新規で作成する。

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

clamav {
  action = "reject";
  scan_mime_parts = true;
  scan_text_mime = true;
  scan_image_mime = true;
  message = '${SCANNER}: virus found: "${VIRUS}"';
  symbol = "CLAM_VIRUS";
  type = "clamav";
  servers = "127.0.0.1:3310";
  log_clean = true;
  patterns {
    JUST_EICAR = '^Eicar-Test-Signature$';
  }
  whitelist = "/etc/rspamd/antivirus.wl";
}

action = “reject”と記載しているので、ウイルスに感染したメールが来た場合は受けないで送信者に返す。

/etc/rspamd/antivirus.wlは、IPアドレスのホワイトリストであり、そのファイルに記載されているIPアドレスから届いたメールはチェックしない。

サービス再起動

4つのサービスを再起動する。

systemctl restart clamd@scan
systemctl restart rspamd
systemctl restart postfix
systemctl restart dovecot
%d人のブロガーが「いいね」をつけました。