【conoha VPS AlmaLinux9構築⑨】メールサーバー構築(迷惑メール対策)

AlmaLinux9

PostfixとDovecotが最低限送受信できる程度の設定は終わったので、迷惑メール対策の設定を実施していきます

rspamdとclamAVを使用して迷惑メール対策を実施します

Clam AVの設定

インストール

# dnf install clamav clamd clamav-freshclam

設定

# vi /etc/clamd.d/scan.conf

#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 ← コメントアウトする

サービスの起動と開始

ウイルスデータベースを自動更新するため、freshclamも起動する

# systemctl start clamav-freshclam
# systemctl enable clamav-freshclam

# systemctl start clamd@scan
# systemctl enable clamd@scan

Rspamdの設定

インストール

リポジトリをダウンロードし、その後インストールします

# curl https://rspamd.com/rpm-stable/centos-9/rspamd.repo > /etc/yum.repos.d/rspamd.repo
# dnf install rspamd

redisのアクセス権追加

redisグループにユーザー「_rspamd」を追加します
※ redisが入ってない場合は先にインストールしてください

# usermod -a -G redis _rspamd

初期設定

ウィザードに沿って設定を進めます
途中表示される公開鍵は次のDKIMの作業で使います

# rspamadm configwizard

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

Welcome to the configuration tool
We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd
Modules enabled: emails, spf, multimap, whitelist, elastic, dkim_signing, phishing, hfilter, asn, mime_types, chartable, regexp, maillist, metadata_exporter, bayes_expiry, mid, settings, rbl, fuzzy_check, force_actions, forged_recipients, milter_headers, arc, once_received, dkim, trie, dmarc
Modules disabled (explicitly): mx_check, p0f, aws_s3, rspamd_update, bimi, spamtrap, http_headers, known_senders, external_relay, dcc
Modules disabled (unconfigured): fuzzy_collect, dynamic_conf, external_services, clickhouse, spamassassin, ip_score, reputation, metric_exporter, maps_stats, antivirus, clustering
Modules disabled (no Redis): neural, url_redirector, greylist, replies, history_redis, ratelimit
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:[暗号化したパスワードが表示される]
Redis servers are not set:
The following modules will be enabled if you add Redis servers:
        * neural
        * url_redirector
        * greylist
        * replies
        * history_redis
        * ratelimit
Do you wish to set Redis servers?[Y/n]: ← 空エンター
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 ← nと入力
Do you have any password set for your Redis?[y/N]: n ← nと入力
Do you have any specific database for your Redis?[y/N]: n ← nと入力
Enter Redis database:
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]: ← 空エンター
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
Enter output directory for the keys [default: /var/lib/rspamd/dkim/]: ← 空エンター
Enter domain to sign: example.com ← ドメイン名を入力
Enter selector [default: dkim]: ← 空エンター
Do you want to create privkey /var/lib/rspamd/dkim/example.com.dkim.key[Y/n]: ← 空エンター
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 ← nと入力
File: /etc/rspamd/local.d/worker-controller.inc, changes list:
password => [暗号化されたパスワード]

File: /etc/rspamd/local.d/redis.conf, changes list:
read_servers => /run/redis/redis.sock  ← ソケットの場所指定
write_servers => /run/redis/redis.sock  ← ソケットの場所指定

File: /etc/rspamd/local.d/dkim_signing.conf, changes list:
domain => {[example.com] = {[selector] = dkim, [path] = /var/lib/rspamd/dkim/example.com.dkim.key}}
allow_hdrfrom_mismatch => true
allow_hdrfrom_mismatch_sign_networks => true
allow_username_mismatch => true
use_domain => header
sign_authenticated => true
use_esld => false

Apply changes?[Y/n]: ← 空エンター
Create file /etc/rspamd/local.d/worker-controller.inc
Create file /etc/rspamd/local.d/redis.conf
Create file /etc/rspamd/local.d/dkim_signing.conf
3 changes applied, the wizard is finished now
*** Please reload the Rspamd configuration ***

DKIM

メールの送信者と内容の改ざんがされてないかを検証するDKIMを設定します

DNSに公開鍵を登録します
セレクタ名は、先ほどのウィザードでデフォルト値で作成しているので「dkim」がセレクタ名となります


TXTレコードには下記のように登録します
タイプ:TXT
名称:[セレクタ名]._domainkey ← 今回は「dkim._domainkey」です
TTL:空欄(デフォルト値の3600で登録されます)
値:v=DKIM1; k=rsa; p=[公開鍵]

SPF

SPFはDNSに事前に登録されたドメインの使用を許可しているメールサーバーのIPアドレスと、メール送信元サーバーのIPアドレスを比較し、メールアドレスがなりすましされていないかを確認します

DKIM同様、DNSへ登録することで設定できます

タイプ:TXT
名称:@
TTL:空欄(デフォルト値の3600で登録されます)
値:v=spf1 ip4:[IPアドレス] -all ← v=spf1 ip4:xxx.xxx.xxx.xxx -all といった感じ

failである「-all」をセキュリティの観点から使用しますが、受信者の設定によっては正常なメールでもfailとなり、破棄されてしまうことがあります
その場合はsoft failである「~all」へ変更してください

DMARC

DMARCは先ほど設定したSPFやDKIMの結果をもとに正常なメールかどうかを判断し、正常ではないメールの場合、取り扱いをどうするか送信者側で設定することができます

dmarc.confの設定

dmarc.confをrspamdに設定します

report_settingsのorg_nameは大文字、domainは小文字なので注意しましょう

# vi /etc/rspamd/local.d/dmarc.conf
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レコードを登録します

タイプ:TXT
名称:_dmarc
TTL:空欄(デフォルト値の3600で登録されます)
値:v=DMARC1; p=quarantine; rua=mailto:xxx@example.com; ruf=mailto:xxx@example.com

p=には正常でないメールはどう扱うかを設定します
「何もしない(none)」、「隔離をする(quarantine)」「受信拒否をする(reject)」がありますが
セキュリティを高めたいものの、rejectだと正規のメールが破棄されてしまう可能性があるため「quarantine」を指定します

ruaは統計情報、rufは認証失敗メールの通知です
不要な場合は「v=DMARC1; p=quarantine」のみ設定します

ARC

上記までの対策だと、メールが再配送された際になりすまし扱いになってしまうことが課題でした
ARCでは再配送時に経路上の送信ドメイン認証の検査結果をたどります

中間サーバーでDKIMがpassした際に、その結果をARCのヘッダに保存したうえで、ARCとして再署名して再配送されます
これにより正規のメールかどうか判断することができます


rspamdにARCの設定をします
DKIMの設定ファイルをARC用にコピーします

# cp /etc/rspamd/local.d/dkim_signing.conf /etc/rspamd/local.d/arc.conf

domainの箇所のみ残し、後は削除します

# vi /etc/rspamd/local.d/arc.conf
domain {
    example.com {
        path = "/var/lib/rspamd/dkim/example.com.dkim.key";
        selector = "dkim";
    }
}

DNSへの登録については、DKIMで登録したレコードを使用するため追加で登録する必要はありません

ウイルスチェック

メール受信時にウイルスチェックを実施するよう設定します

ソケットにアクセスできるよう、ClamAV のグループにRspamd のグループを追加します

# usermod -a -G virusgroup _rspamd

rspamdにantivirus.confを作成します

# vi /etc/rspamd/local.d/antivirus.conf
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";
}

フィッシングメール対策

本文中に記載されているURLについて、フィッシングサイトのブラックリストに載っているものかどうか判定するようにします

rspamdにphishing.confを作成します
openphishとphishtankのリストを判定に使用します

# vi /etc/rspamd/local.d/phishing.conf
openphish_enabled = true;
phishtank_enabled = true;

ブラックリストとホワイトリストの設定

ブラックリストとホワイトリストの設定をします
運用しながらドメインやアドレスを追加していくことになりますので、今回はリストを使用するための設定のみ実施します

# vi /ets/rspamd/local.d/multimap.conf

# 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ファイルを作成します

# 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

管理画面から操作できるよう、所有者変更を実施します

# chown _rspamd. /etc/rspamd/local.d/*.map

管理画面へのアクセスは後程実施します

Spamスコアのアクション設定

spamスコアが高いとメールがrejectされてしまい、判定によっては正規のメールが見れないトラブルが発生します
それを防ぐため、スコアによるreject設定は無効にします

override.d下にactions.confを作成し、設定をオーバーライドするようにします
add_headerの数値は一定スコア以上の時にspamメールであることをヘッダに追記します
greylistの数値は一定スコア以上の時にgreylistとして処理する(一時的に配送拒否し、再送させる機能。迷惑メールは一時拒否すると再送しないか即座に再送することが多いそうでこの仕組みが対策になるとのこと)

# vi /etc/rspamd/override.d/actions.conf
reject = null;
add_header = 10;
greylist = 20;

ヘッダー情報の設定

rspamdにmilter_headers.confを作成し、受信したメールのヘッダに追加する項目を編集します

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

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のWebGUIですが、現状だと閲覧権限のみとなっています
編集などの権限もできるようにしたいので、enagle_passwordを設定します

# rspamadm pw
Enter passphrase: ← パスワードを入力
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ← ハッシュ化されたパスワードが表示されるのでコピーする

ハッシュ化したパスワードをenagle_passwordに登録します

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

password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
enable_password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ← 追加

Rspamdの起動と自動起動

# systemctl start rspamd
# systemctl enable rspamd

Postfixと連携

Postfixとrspamd間でメールをやり取りするために、milterという規格が必要になりますので、その設定をPostfixのmain.cfの最終行に追記します

# vi /etc/postfix/main.cf

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

Postfixを再起動します

# systemctl restart postfix

OpenLiteSpeedの設定

rspamdのGUIを使用したいので設定します
webサーバーはOpenLiteSpeedを使用していますので、OpenLiteSpeedの設定変更を実施します

[サーバー設定]-[外部アプリ]を開き、新しい外部アプリケーションを追加する

タイプ:Webサーバーにして次へ

下記の通り入力して保存する

名前:Rspamd
アドレス:127.0.0.1:11334
最大接続数:60
初期リクエストタイムアウト(秒):60
リトライタイムアウト(秒):60

[(バーチャルホスト名)]-[Rewrite]に下記を追加したうえで保存します

RewriteCond %{REMOTE_ADDR} ^xxx\.xxx\.xxx\.xxx$ ← アクセス制限する場合の許可するIP
RewriteRule ^/rspamd/(.*) http://Rspamd/$1 [P,L]

OpenLiteSpeedの再起動をします

下記にアクセスします
※ 後ろのスラッシュつけ忘れるとアクセスできないので注意してください
https://[バーチャルホスト名]/rspamd/

パスワードは、編集権限があることを確認したいので、enable_passwordで登録したパスワードでログインします

ログイン後下記のように表示されます
Configurationが編集できたので、編集権限ありでログインできていました

試しにメールを送ってみるとscan数が増えました
正常なメールだったのでnoactionに2通とも分類されています

参考

https://psychoco.net/linux/mail-server-with-rspamd-on-rhel9
インターネット用語1分解説~SPFとは~ – JPNIC
https://www.nri-secure.co.jp/glossary/dmarc#:~:text=DMARC(Domain%2Dbased%20Message%20Authentication,%E9%80%81%E4%BF%A1%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%AA%8D%E8%A8%BC%E6%8A%80%E8%A1%93%E3%81%A7%E3%81%99%E3%80%82
送信ドメイン認証技術「DMARC」によるなりすましメール対策とDMARCレポートの活用 (dekyo.or.jp)
ARC について | なりすまし対策ポータル ナリタイ (naritai.jp)
Gentoo Linuxのpostfixにrspamdを導入 – OnePassの備忘録 (goo.ne.jp)
Greylisting方式による迷惑メール対策|電子メール | 岐阜大学情報館 (gifu-u.ac.jp)
CentOS8でメールサーバ構築 – 迷惑メール対策の導入(RSPAMD) – ユウてき (yuto-shin.net)

コメント

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