メールサーバーにDMARC認証とDMARCレポート機能を実装する!

この記事は約23分で読めます。

こんにちは、RSPインターネットグループ ネットワークチームの陸ステです。
弊組織グループのインフラエンジニア兼代表者をしております。
※この記事は「ConoHa Advent Calendar 2023」の2023年12月17日の枠です。
(大変お待たせいたしましたー!公開まで遅くなり申し訳ありませんでしたっ!)

早速何度も言いますが、おめでたいことなのと大事なことなのでいいます!
ConoHa&美雲このはさんの10周年おめでとうございますっ!!
2018年か2019年頃にVPSを契約し始めたときは、5年~6年目辺りだったので5年間が
短く感じますね()

最初はマイクラのサーバ用途で使っていてほとんどコピペで動かしてたのが懐かしいです。
今は完全にいろいろなものをサーバで動かしていてCLIも操作してるの当時は考えられませんでしたね。()
ConoHaさん、GMOさんがなければサーバーインフラに触れてなかったと思うと楽しいことに気づかせてくれたConoHaさん、GMOさん、そして今では推しの美雲このはさんには感謝しかないですね。(取り消し線つけるなって?ナンのことかな^^)

おっと、本題から逸れてしまいましたねー(いや、おまえのせいやろ)。
それでは、本題に入りますね()
今回は、メールサーバーにDMARC認証とレポート送付機能を追加していきます!
DKIM署名も本当は記事にしようか迷いましたが、OpenDKIMの記事はよくありますが
DMARC認証からレポートまで完全に対応する記事が中々なかったので書いてみました。

メールサーバーの構築も書こうかなと思ったのですが、メールサーバー構築まで書いちゃうとタイトルがメールサーバー構築方法からになっちゃうので今回は省略します。
代わりになるかはわかりませんが、このはブログで公開されている「ConoHaの薄い本電子版Vol.2 VPSで自分専用のメールサーバーを立てよう!」を参考に今回は構築しています。

DMARCとはなにか

その前にDMARCとはなにか、解説いたします。もう知ってるでって方は飛ばしていただいてかまいません。

DMARCとは、Domain-based Message Authentication, Reporting, and Confirmanceの略で
メールアドレスのドメイン部分「例:rikusutep@o.rspnet.jp」は完全に発信者の自己申告制で
安易になりすましを行うことができます。

最近、クレジットカード会社のフィッシング詐欺や各社サービスのフィッシング詐欺等でも
よくメールアドレスが正しくてもなりすましの可能性と記載されるケースが増えていますが
それがなりすましメールの代表例です。

特にお金に関係するものは、メールアドレスだけで判断しないようにご注意ください。

DMARCは、SPF/DKIMの認証に失敗した場合の受信者側への取り扱いを制御することができ、
なりすましメールを完全にシャットアウトすることが可能になる技術の一つです。

サーバを契約する

毎度恒例ですね、VPSがないと始まらないので契約していきます。
ちなみにConoHaさんが提供されているメールサーバーもありますが、
これはレンタルサーバーみたいにConoHaさんが管理するものになります。
美雲このはちゃんがエンジニアさんとして管理してるのかな?

今回は自分で1から構築するのでVPSになります。

※今回のVPSは、2023年11月15日にリリースされた新バージョン(以下、Ver3.0)を利用します。
 リリース前のバージョン(以下、Ver2.0)でも共通して動くとは思いますが、これから使う方は、
 Ver3.0で構築されることをおすすめします!
 ニュースリリース:【リリース】[VPS]サービスリニューアルのお知らせ
※今回使用するOSは、AlmaLinuxです。インストール方法やディレクトリなど、異なる可能性があります。
 お困りなことがあれば、コメントでもお受けしますのでお気軽に書いてください~

今年はめっちゃ進化しましたね、このはぴば2023も無事に開催され今回はオフライン
イベントも同時に行われたり、ConoHaとこのはちゃんが10周年目になったライブを
生配信に渋谷区までは行けなかったのでおうちでYouTube Liveから参加しましたが、
このはぴば!2020から見続けていますが、いろいろ進化していて時代の流れが早い
って感じました(は?)
改めて、本当に10周年おめでとう!!!

また、話が脱線しましたね。ごめんなさい(だからおまえのせいやろ)

今回はメールサーバー用途なので、メモリは柔軟に変更できる1GBとします(追加画面)。
(スクショは追加したときのものを撮り忘れました。)

©GMO Internet Group, Inc. | 再利用は禁止です。

追加が完了しますと、自動的に画面が変わりサーバーリストに移り先ほど追加したサーバーが稼働していると思います。

もし構築中となっていたら、ConoHaさんの設備状況によりますが数分程度したら起動中になると思います!

Ver3からは、接続許可ポートセキュリティグループに変わり、SSH等を行うには
接続環境からの接続を許可する設定が必要です。基本的にサーバー側でポート制御
を行いますので、セキュリティグループではすべてを開放する設定にしていきます。

セキュリティグループとは:仮想ファイヤウォールとして動作するもので、
ConoHaさん曰くレイヤー4層(トランスポート層)に相当するそうです。
おそらく、OpenStackのセキュリティグループ機能ですかね。
※1:OSI参照モデルなどのネットワークに関する階層

レイヤー構成については、GMOクラウドアカデミーさんの記事が参考になるのではと思います。
ロードバランサとは?わかりやすく解説!#ーロードバランサの種類L4,L7ってどう違うの?

※SSH側での操作は不安であれば、「IPv4v6-ICMP」「IPv4v6-Mail」「IPv4v6-SSH」を
セキュリティグループとして適用し、サーバー側でfirewalld等を停止されることをオススメします。
 設定方法:セキュリティグループ機能を使う#セキュリティグループの設定方法

IPv4v6-ICMP:必須ではありませんが、サーバが応答する際の速度がわかるようになります。
IPv4v6-Mail:必須の設定になりますので、設定を外さないようにご注意ください。
IPv4v6-SSH:コンソール機能を使う場合は、必要ありませんがSSHで操作する場合必須です。

セキュリティグループを設定する

コンパネの「セキュリティ」→「セキュリティグループ」の順番で進んでいきます。

ちなみにVPSを追加したときに1台未満であれば、このようにお知らせしてくれますが
通常はこの「default」が適用され、外部との通信は一切できません。

画像内のこちらのリンクはコチラ

セキュリティグループのページに移りましたら、+ セキュリティグループをクリックします。
そうしますと、セキュリティグループの名称と説明を入力する項目が出てきますので、
お好みで入れていただき、保存とクリックするとセキュリティグループが作成できます。

保存しますと、「成功しました。」と表示されセキュリティグループが一覧に出ると思います。
出てきましたら、先ほどのセキュリティグループをクリックし、「+」ボタンをクリックします。

各項目を以下のように追加してください。
Out方向は、すでに初期状態で設定が入りますのでIPv4のIN方向から追加します。
+をクリックしたあとにIP/CIDRには特に入力せず、そのまま決定します。

次にIPv6側の設定も入れて、IPv6の環境でも通信できるようにします。
IPv6はイーサタイプでIPv6にできますので、こちらだけ変更しそれ以外は
入力せずにこちらも決定します。

完了したら、InとOutの両方がIPv4とIPv6で2つあると思います。
あればセキュリティグループの設定は完了です!

次にVPSにこのセキュリティグループを適用させる必要がありますので、
左側の「サーバー」を選択し、サーバーリストに移ります。

画面が変わりましたら、追加されたVPSのネームタグを選択します。
※ネームタグの場所は、追加時に決められた名前かvps-日付と時間になっている場合があります。

そうしましたら、「ネットワーク情報」の「セキュリティグループ」の右側にある鉛筆マークを
クリックし、編集できるようにします。

そうしましたら、選択できる項目になりますので、先ほど作成したセキュリティグループにします。

そうしましたら、保存をクリックして反映させます。

正常に変更できれば、左下に「成功しました」という文言と共にセキュリティグループが
通信を許可したセキュリティグループ名になっていると思います。

これで外部からVPS宛の通信は全て許可されるようになりました。

ちなみにVPS側でのソフトウェアファイヤウォールは使わず、仮想ファイヤウォールに任せる方はこのような設定になります。
正直VPS側で制限するよりこっちのほうが管理が楽ですしリソース負担もないので、こちらで設定してもいいと思います。

メールサーバーを構築する

こちらは、最初にも記載した通りですが、今回はメールサーバーを構築がすでに済みであることが前提になるので今回は省略します。

メールサーバーの構築方法としてはこのはぴば!202320:03~49:35~)でも話に上がっていたのでご存じの方もいるかもしれませんが、
このはブログで公開されている「ConoHaの薄い本電子版Vol.2 VPSで自分専用のメールサーバーを立てよう!」を
元に今回はメールサーバー部分は構築していますので、参考にしてみてください!

ソフトウェアをインストールする

今回は、rspamdというソフトウェアを使って認証とレポート送付を追加していきます。
憶測ですが、ConoHaさんのメールサーバーやWINGのメールサーバでも使われていると思います。

しかしながら、標準ではrspamdが配信されていませんので、インストールできません。
そこでパッケージを追加していきます。

OSによって、インストールするパッケージが異なりますので以下のリンクからご確認ください。
Rspamd packages

ここでは、AlmaLinux 8系でのインストール方法を記載していきます。

source /etc/os-release
export EL_VERSION=`echo -n $PLATFORM_ID | sed "s/.*el//"`
curl -x https://proxy1.d1.rspsrv.jp:26024/ https://rspa
md.com/rpm-stable/centos-${EL_VERSION}/rspamd-experimental.repo > /etc/yum.repos.d/rspamd.repo
yum install -y rspamd

上記でrspamdがインストールが完了しましたら「rspamd -v」でコマンドが実行できるか確認します。
実行できれば、「Rspamd daemon version 3.8.0」等のようにバージョンが出力されます。

次にDMARC系の機能を使うにはredisが必要になりますので、事前にインストールしておきます。
appstreamで配信されておりますので、このまま「yum install -y redis」等でインストールできます。
完了後にこちらも「redis-server --version」を実行し、「Redis server~」が出力されればOKです。
ただ、redisは先に起動しておいてください。

systemctl enable --now redis
sudo systemctl restart redis

rspamdとredisのインストールが終わりましたら、ここから先が本題設定方法になります。

DMARC認証とレポート機能を設定する

※ここから先のドメインやメールアドレス等は、ご自身のドメインやメールアドレスなどに置き換えて運用してください。※

まず先にrspamdの初期設定を行います。
※因みにrspamdにはWebGUIもありますが、今回はメールサーバー内で構築するため
 必要のないリソース消費を防ぐ為、省略しますがリソースに余裕があれば設定すると
 色々な情報が見れるようになります。英語のサイトにはなりますがこちらをご参考に
 してみてください。

# rspamadm configwizard

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

Welcome to the configuration tool
We use /etc/rspamd/rspamd.conf configuration file, writing results to /etc/rspamd
Modules enabled: fuzzy_check, dmarc, milter_headers, mime_types, phishing, once_received, spf, asn, regexp, elastic, bayes_expiry, dkim_signing, arc, settings, dkim, hfilter, emails, forged_recipients, rbl, whitelist, trie, maillist, metadata_exporter, chartable, multimap, mid, force_actions
Modules disabled (explicitly): aws_s3, dcc, http_headers, known_senders, bimi, mx_check, p0f, spamtrap, rspamd_update, external_relay
Modules disabled (unconfigured): clickhouse, clustering, maps_stats, spamassassin, reputation, fuzzy_collect, metric_exporter, dynamic_conf, antivirus, external_services, ip_score
Modules disabled (no Redis): url_redirector, greylist, neural, ratelimit, history_redis, replies
Modules disabled (experimental):
Modules disabled (failed):
Do you wish to continue?[Y/n]:※このままEnterかYでEnter
Setup WebUI and controller worker:
Controller password is not set, do you want to set one?[Y/n]: ※nでEnter
Redis servers are not set:
The following modules will be enabled if you add Redis servers:
        * url_redirector
        * greylist
        * neural
        * ratelimit
        * history_redis
        * replies
Do you wish to set Redis servers?[Y/n]:※Enter
Input read only servers separated by `,` [default: localhost]: localhost.risupu.jp※通常はEnterだけでOKです。
Input write only servers separated by `,` [default: localhost.risupu.jp]: localhost.risupu.jp※通常はEnterだけでOKです。
Do you have any username set for your Redis (ACL SETUSER and Redis 6.0+)[y/N]:※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:
write_servers => localhost.risupu.jp
read_servers => localhost.risupu.jp

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 ***

次にredisとの接続設定を行います。

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

write_servers = "localhost.risupu.jp:6379";
read_servers = "localhost.risupu.jp:6379";

※redisサーバーが別のホストにある等の場合は、別途置き換えてください。
次にmilter_headersの設定を行います。

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

use = ["spam-header", "X-Spam-Score", "X-Spam-Status", "X-Virus-Status", "authentication-results"];
skip_local = true;
skip_authenticated = true;
extended_spam_headers = false;
routines {
  spam-header {
    header = "X-Spam-Flag";
    remove = 1;
    value = "YES";
  }
  X-Spam-Score {
    header = "X-Spam-Score";
    remove = 1;
    char = "*";
  }
  X-Spam-Status {
    header = "X-Spam-Status";
    remove = 1;
  }
  X-Virus-Status {
    header = "X-Virus-Status";
    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";
    }
  }
}

上記の設定が一通り終わりましたら、DMARC認証に失敗したときの動作とレポート送付にも対応します。
レポート送付はしなくても良いのであれば、reportingのenabledをfalseにすることでできると思います。
弊組織グループでの設定例は、機密情報で公開すると私が組織員の方に怒られますので伏せさせていただきますね。

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

actions = {
    quarantine = "add_header";
    reject = "reject";
}
send_reports = true;
reporting {
    enabled = true;
    email = "※送付元のメールアドレス";
    domain = "※送付元のメールドメイン等";
    org_name = "※DMARCレポート生成した組織名等";
    helo = '※SMTP HELO値';
    smtp = 'localhost.risupu.jp';
    smtp_port = 25;
    from_name = '※送付元のメールアドレスなど',
    msgid_from = '※メールサーバーのホスト名';
}

ちなみにDMARCがquarantineとなった場合、ヘッダーが追加されます。
そのヘッダーを元にDovecotでスパムに振り分けを行う設定が必要です。
※振り分けに「dovecot-pigeonhole」をインストールする必要があります。
 また、dovecotですでに迷惑メールフォルダ等が作成される状態が必要です。

# yum install -y dovecot-pigeonhole

インストールが終わりましたら、次に設定を加えていきます。

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

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

require ["fileinto"];
# rule:[SPAM]
if header :contains ["X-Spam"] "Yes" {
    fileinto "Junk";
    stop;
}

これでDMARCレコードでDMARC認証に失敗したメールは、迷惑メールフォルダへ正常に振り分けることができるようになったと思います。
次にrspamdとpostfixを連携する必要がありますので、postfix側の設定を加えていきます。

# vi /etc/postfix/main.cf

# 以下を最後でも良いので追加してください。
dovecot_destination_recipient_limit = 1

# Postfixとrspamdを接続します。(DKIM署名のmiltersを使っている場合は、DKIM署名のあとにポート番号11332を記述してください。)
smtpd_milters = inet:localhost.risupu.jp:10027,inet:localhost.risupu.jp:11332


実はメールがDMARC認証に失敗した場合、送信元にバウンスメールが送られます。

バウンスメールではSpam判定と記載はされますが、仮に悪用された送信元が第三者のものだった場合、
バウンスメールがそのメールアドレスに送られてしまいます。スパムとして検知される確立も上昇する
こともありますし、なりすましメール発信者の支配下にあるメールアドレスだとしたらメールの送信が
できなかったという内容が来たことによって、DDoSの標的になる可能性もありますので、
メールを拒否ではなく破棄という設定に変更します。

# vi /etc/rspamd/worker-proxy.inc

discard_on_reject = false; # Discard message instead of rejection
   ↓
discard_on_reject = true; # Discard message instead of rejection

次にDMARCレポート送付を自動化する必要がありますので、cronを使って毎日深夜4時頃に送付する形にします。
送付される時間帯は、変えても問題ないと思います。
※事前に動作確認を行ってから自動化の設定を推奨します。

# crontab -e

0 4 * * * sudo rspamadm dmarc_report -v

ちなみにちゃんと動作するか確認したい方は、ログを保存することができます。
設定例としては、こんな感じになると思います。

0 4 * * * sudo rspamadm dmarc_report -v >> /path/to/dmarc-report.log 2>&1

一応ここまでの設定でDMARC認証もレポートも送られるのですが、実は特定条件に該当する場合
DMARCレポートが送られない不具合が発生していたバージョンがありました。

現在のバージョンでは修正されていると思いますが、もし不具合に当てはまるバージョン
だった場合は、以下をご参考に修正してみてください。

本当は、これらの条件の不具合がないか確認しようとしていたのですが、
色々あって、失念しており記事を書いてるときに思い出しました。

これらの不具合修正方法については、お力になれますので
お困りな点は、コメント等でお知らせください!

・DMARCレコード「;」の前にスペースが含まれている場合
 [Fix] dmarc gramar - allow spaces before ";" #4547
・サブドメインのDMARCレポートが送られない事象
 Fix DMARC reporting to subdomains #4223

DMARCレコードを追加しよう!

せっかくDMARC認証等に対応したのとGmail等がDMARCにも対応を推奨してきたりしているので、
DMARCレコードを追加していきましょう。

ちなみにConoHa WINGさんを利用している場合は、簡単にDMARCレコード追加ができちゃいます。
以下、公式の解説が乗っていますのでこちらがご参考になると思います。
メールセキュリティを設定する#DMARCの設定方法

※ConoHaさんのサポート対象外にはなりますが、外部メールアドレスを設定することも可能です。
 DNSレコード上で「rua=mailto:」以降を置き換えて頂くのと、
 [dmarc設置ドメイン名]._report._dmarc.[mailto:のメールFQDN]に「v=DMARC1 ;」が
 必須です。

お使いのDNSプロバイダーさんに以下のようなレコードを追加します。
ConoHaさんのDNSを使われている場合も同様に追加できます。

#_dmarc.rspnet.jp
v=DMARC1; p=reject; rua=mailto:dmarc[at]rspeml.jp;
※ドメイン:rspnet.jpのDMARCレコード例です。
※実際DMARCレコードでは、[at]ではなく@ですがスパム対策で変換しています。

#*._report._dmarc.rspeml.jp
v=DMARC1 ;

それぞれの解説:_dmarc.rspnet.jpの例
v=DMARC1;は、DMARCレコードである旨をメールサーバーに通知します。
p=reject;は、DKIM/SPF認証に失敗した場合は破棄してください。という要請になります。
rua=mailto:dmarc[at]rspeml.jp;は、DMARCレポートはdmarc[at]rspeml.jpに送付してください。というものになります。

*._report._dmarc.rspeml.jpの例
v=DMARC1 ;は、DMARCレコードである旨をメールサーバーに通知します。
これは、外部メールアドレスが宛先ですが受信を許可していますよというものになります。
メールサーバーがDNSサーバに問い合わせて、認証しているドメインであれば受信できます。

RFC7489 7.1で定める項目で外部のメールアドレス宛の場合は、このDNSレコードは必須です。
ただRFCに準拠している場合なので、準拠していないメールプロバイダの場合はなくても受信が
行えるかもしれません。(OpenDMARCは、このRFCに準拠していません。)

さいごに

久しぶりにお知らせとかとは違う記事を書いたので書き方を忘れてしまいましたので、
前回と違ったりしたらすいません!(?)

この記事に需要があって、参考になれば嬉しいです。
もし記事内にわからない点や改善点があればコメントにて教えてくださいー!

次回の記事を何にしようかなと迷っているのですが、弊組織グループでEdgeRouter(ER)を導入したので、
ERもVyOSもVyattaがベースの元なのでConoHaからネットができるみたいなネットワーク構成とかに関係する記事とか書いてみたいなと思っています。

※『ConoHa』はGMOインターネットグループ株式会社の登録商標です。

©GMO Internet Group, Inc.

コメント

トップへ戻る