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)
コメント