0 Comments

自宅で自前のメールサーバーを動かしてメールを送信するのは、現在ではあまり推奨されていません。
よほどの対策をしないとスパムメールの餌食となってしまうからです。
しかし、転送はしないし内部からだけ送信するなら・・・という理由で簡単なメールサーバーを構築した方もいるでしょう。しかし、メールの本家とも言うべきGmailに送信してみると拒否されてしまう。
たとえ届いたとしても迷惑メール扱いされてしまっている。こんな状況が多いのではないでしょうか?

Gmailに正しく受け取ってもらうにはどうする??

正しく受け取ってもらうには、いくつかのことをしなければなりませんが、届いていないなら以下のことを実行する必要があると思われます。
前提としてPostfix Dovecotを使ったLinux環境下のメールサーバーの話としてのお話です。

1.DKIM認証を設定する

  DKIM(Domain Keys Identified Mail)とはメールの送信元が秘密鍵で電子署名を行って、受診側が
  DNSに登録された公開鍵の情報を使って正しい署名かどうかの確認をする方法。
  受信側は、送信元情報が成りすましされていないかどうかを判別することができます。

Opendkimのインストール
$ sudo apt update
$ sudo apt install opendkim opendkim-tools
鍵ペアの作成
  /etc/dkimkeysホルダにmailという鍵ペアを1024ビット長で作成します
   -d xxxx.xxxx.jp は自分のサイトのドメイン名です
$ sudo opendkim-genkey -b 1024 -D /etc/dkimkeys -d xxxx.xxxx.jp -s mail
出来た鍵のパーミッションと所有者情報を変更
$ sudo chown opendkim:opendkim /etc/dkimkeys/mail.private
$ sudo chown opendkim:opendkim /etc/dkimkeys/mail.txt
OpenDKIMの環境設定をする
  まずは環境ファイルのバックアップを取っておく
$ sudo cp -p /etc/opendkim.conf /etc/opendkim.conf_$(date +%Y%m%d-%H%M%S)
OpenDKIMの設定ファイルopendkim.confを編集する (nano等で開く)
$ sudo nano /etc/opendkim.conf
以下の様に修正し保存
			Mode		sv
			Domain		xxxx.xxx.jp
			Selector	mail
			KeyFile 	/etc/dkimkeys/mail.private
			Socket      inet:8891@localhost
OpenDKIMを再起動
$ sudo systemctl restart opendkim
作成した公開キー情報をDDNSのドメイン情報に追加する
$ sudo cat /etc/dkimkeys/mail.txt

以下の様に表示される
mail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
  "p=MIGfMA0GCSqGSIb3...ここは長い文字列続く...lLwSN8VCt7cO26uxDRJfrKANbTVC250GvSlYum9djE/hz" )  ; 
----- DKIM key mail for xxxx.xxx.jp
これらをDDNSのドメイン情報に追加設定する。(ご利用のDDNSサービスにて設定してください)

Hostname*		Type*	Content
mail._domainkey		TXT	v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSI・・・ ・・・lLwSN8VCt7cO26uxDRJfrKANbTVC250GvSlYum9djE/hz
DKIMの設定のテスト方法
  以下入力で opendkim-testkey: key OK と出れば設定は成功
$ sudo opendkim-testkey -d xxxx.xxx.jp -s mail -vvv
Postfixの設定を変更します
$ sudo nano /etc/postfix/main.cf

以下の設定を追加します。

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

閉じて再起動
$ sudo systemctl restart postfix
最終確認事項
①受信側のメールヘッダーを確認してDKIMの認証がpassしていることを確認する。
②メールログによる確認をする
  /var/log/mail.logを確認
 DKIM-Signature field addedがあれば署名が行われています。

2.SPFを設定

SPFとは、電子メールの送信元の偽装(なりすまし)を防ぐために、送信元のサーバが正しいかどうかを確認するための仕組みです。未設定の場合は迷惑メールと判定されやすくなります。

DNSにレコードを一行設定を追加するだけ
例
IN TXT "v=spf1 +ip4:メールサーバのIPアドレス -all"

MYDNS.JPではもう自動で設定されているので追加は不要です。ナイス!!

3.DMARCの設定

DMARCとは、メールの送信元のなりすましをしていないかの確認するための方法のひとつ。
迷惑メール対策のSPFとDKIMの認証結果を使い、SPFおよびDKIMで認証されたドメインがメールのFromヘッダーと同じかどうかを確認し、同じ場合は認証成功となる。

①DMARCのレコードをDNSへ設定

基本は
ドメイン  TTL  クラス  タイプ  データ
_dmarc	3600  IN  TXT	"v=DMARC1; p=ポリシー; rua=mailto:メールアドレス"
 となってます。

MYDNS.JPの場合は
Hostname*	Type*	Content	Target ID
_dmarc		TXT	v=DMARC1; p=quarantine;rua=mailto:xxxx@xxxxx.mydns.jp
で登録OK

p= は none(何もしない)、quarantine(隔離)、reject(拒絶)の3つから指定
ただしp=noneは意味がないのでquarantine以上にします。

設定が必須ではないオプションのタグについての説明

タグ		設定値			説明
		
rua		メールアドレス	DMARCレポートメール送信先を設定
                  複数指定する場合は「,」で区切る
                  設定しない場合はレポートメールは送信されない
ruf		メールアドレス	DMARC認証失敗レポートの宛先メールアドレス
				複数指定する場合は「,」で区切る
				設定しない場合はレポートメールは送信されない
sp		none
         quarantine
		reject		サブドメインの動作ポリシー
			指定していな場合はpタグで設定した動作ポリシーが適用される
pct		1~100		DMARCのポリシー対象となるメールの割合を指定
			指定していない場合は100(全て適用)となる
adkim 		r,s	DKIM 認証識別子アライメントモード(DKIM署名チェックの厳格さ)
			         r(relaxed mode ドメイン部分一致) 
                  s(strict mode ドメイン完全一致)
				省略時はsが設定される
		aspf		r,s	SPF 認証識別子のアライメントモード
                                        (SPF署名チェックの厳格さ)
					r(relaxed mode ドメイン部分一致) 
                                        s(strict mode ドメイン完全一致)
					省略時はsが設定される
ri		秒単位指定		DMARCレポートを要求する間隔
					指定していない場合は86400(1日)が設定される
					1日1回はレポートを要求する必要がある
rf		afrf			DMARCの認証失敗レポートの形式を指定
					指定していない場合はafrfとなる
                      ※2024.01.29時点ではafrfのみ
fo		d,s,1,0			DMARCの認証失敗レポートの要求基準
				     d: DKIMの認証が失敗
					s: SPFの認証が失敗
					1: DKIM,SPFのどちらかが失敗
					0: すべての認証が失敗

DMARCレコードが登録されたかどうかの確認方法

$ dig _dmarc.ドメイン名 TXT

4.PostfixにSPFチェック機能(policyd-spf)を追加

postfix-policyd-spf-pythonをインストール

$ sudo apt update
$ sudo apt install postfix-policyd-spf-python

設定ファイルである/etc/postfix-policyd-spf-python/policyd-spf.confを編集

$ cd /etc/postfix-policyd-spf-python/
$ sudo cp -p policyd-spf.conf policyd-spf.conf_$(date +%Y%m%d-%H%M%S)
$ sudo nano policyd-spf.conf
		変更前
			HELO_reject = Fail
			Mail_From_reject = Fail
		変更後
			HELO_reject = False
			Mail_From_reject = False

Postfixに設定反映

$ sudo nano /etc/postfix/master.cf
master.cfの最後に下記の内容を追加します。

# Policyd-sfp Setting
policyd-spf  unix  -       n       n       -       0       spawn
  user=policyd-spf argv=/usr/bin/policyd-spf
$ sudo nano /etc/postfix/main.cf

smtpd_relay_restrictionsn=に
check_policy_service unix:private/policyd-spf を追加し
policyd-spf_time_limit を追加

smtpd_relay_restrictions =
		    permit_mynetworks
		    permit_sasl_authenticated
		    reject_unauth_destination
		    check_helo_access hash:/etc/postfix/helo_access
		    reject_unknown_helo_hostname
		    check_policy_service unix:private/policyd-spf
policyd-spf_time_limit = 3600

保存したらpostfix再起動

$ sudo systemctl restart postfix

5.OpenDMARCを連携させて、メール受信でDMARCの認証を行えるようにする

これは、Gmailに対する対策ではないが、せっかくDMARCを扱えるようになったので、自分のメールサーバーでの受信でも同様に使えるようにするための設定です。

opendmarcをインストール

$ sudo apt install opendmarc

インストールしている最中にデータベースを設定するかの問い合わせがあった場合はnoを入力

OpenDMARCの設定ファイルである/etc/opendmarc.confを編集

$ sudo cp -p /etc/opendmarc.conf /etc/opendmarc.conf_$(date +%Y%m%d-%H%M%S)
$ sudo nano /etc/opendmarc.conf
# 認証結果をメールヘッダーに記述する際に使用する名前
# AuthservID name (変更前)
AuthservID OpenDMARC

# DMARC検証で認証失敗したメールを拒否しない。レポートのみ生成する。
RejectFailures false (変更前 そのまま)
# ポリシーがreject(p=reject)の場合、リジェクトするするようにするには
RejectFailures true

# ソケットをinetへ変更 (DKIMでもinetを使用しているのであわせています)
# Socket local:/run/opendmarc/opendmarc.sock (変更前)
Socket inet:8893@127.0.0.1
			
# 信頼できるAuthservIDsとしてメールサーバのホスト名を設定
# Postfixのmain.cfで設定してあるmyhostnameと一致させる必要がある
# TrustedAuthservIDs HOSTNAME(変更前)
TrustedAuthservIDs メールサーバ名
		
		
## 追加で新規作成した設定
		
# DMARCの認証を行わないホストの設定
IgnoreHosts /etc/opendmarc/ignore.hosts

# 認証されたクライアントからのメールはDMARC検証をスキップする。
IgnoreAuthenticatedClients true
		
# メールヘッダのSPF検証結果を無視します(後述の自前のSPF検証をするため)
SPFIgnoreResults true
		
# SPFの結果がヘッダーにない場合SPFチェックを行う
SPFSelfValidate true
		
# SMTP AUTHで認証済みのクライアントからのメールはDMARCのチェックを無視する
IgnoreAuthenticatedClients true
		
# RFC5322に準拠していないメールヘッダーのを拒否
RequiredHeaders    true

ignore.hostsファイルを作成

/etc/opendmarcディレクトリを作成し所有者をopendmarcに設定してから、ignore.hostsファイルを作成していきます。
$ sudo mkdir /etc/opendmarc/
$ sudo chown -R opendmarc:opendmarc /etc/opendmarc
$ sudo nano /etc/opendmarc/ignore.hosts
DMARCの認証を行わないホストとして、ローカルホスト(自分自身)を記述しておきます。

localhost
127.0.0.1
::1

opendmarcを再起動

$ sudo systemctl restart opendmarc

PostfixとOpemDMARCを連携させる
  /etc/postfix/main.cfに設定追加

sudo nano /etc/postfix/main.cf
DKIMの設定としてinet:127.0.0.1:8891がすでに記述されてるので、その後に設定を追記

smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:8893

Postfixを再起動

<参考>
たとえばPostfix 設定のcheckがしたくて
$ sudo postfix check
とやってエラーが出ても、一度リスタートしましょう
$ sudo systemctl restart postfix
とするとエラーは消えますので、さっさとリスタートしましょう。

動作テスト

実際にGmailからのメールで確認
受信したメールのヘッダーを見てみると

Authentication-Results:OpenDMARC; dmarc=pass (p=none dis=none) header.from=gmail.com

この様にpassになっていればOKです。

あとがき

以上、たくさんの設定を追加してやっとGmailがメールを受け取ってくれるようになるのですから大変です。でもやらなければ届かないので頑張って設定しましょう。
きっとまた時間が経てば他にも必要な設定が必要になってくるのでしょうね。
今はLineなどの使用が増え、メール自体があまり使われなくなって来ています。
ジャンクメール、詐欺メール、成りすましが多すぎることが原因でしょうけれど、そろそろメールに代わる新しい安全な連絡方法が出てきて欲しいと思いませんか?

Related Posts