Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はてなにおけるメール基盤とDMARC対応
Search
Mitsuru Takigahira
April 19, 2024
10
5.5k
はてなにおけるメール基盤とDMARC対応
https://platformengineering.connpass.com/event/310994/
で発表させて頂いた内容になります。
Mitsuru Takigahira
April 19, 2024
Tweet
Share
More Decks by Mitsuru Takigahira
See All by Mitsuru Takigahira
入門WebAssemblyBinaryFormat.pdf
mysticdoll
6
630
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
31
6.2k
The Cult of Friendly URLs
andyhume
77
6k
Art, The Web, and Tiny UX
lynnandtonic
296
20k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
7
570
Into the Great Unknown - MozCon
thekraken
30
1.4k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
22k
Why You Should Never Use an ORM
jnunemaker
PRO
53
9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.3k
Code Review Best Practice
trishagee
62
16k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
228
52k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
We Have a Design System, Now What?
morganepeng
49
7.1k
Transcript
はてなにおける メール基盤とDMARC対応 id:MysticDoll / @MysticDoll 2024/04/18 Platform Engineering Meetup 1
自己紹介 • id: MysticDoll / 瀧ヶ平 充 • 株式会社はてな (2023/4~)
◦ システムプラットフォームチーム所属 Platform SRE • 社内基盤の運用とかやり続けて7年目 ◦ 前職ではGHE運用やCI/CDツールの開発・運用とか ◦ Screwdriver.cd Most Valuable Contributer (2021 CD Foundation Project Awards) 2
システムプラットフォームチームの仕事 • メール基盤 ◦ 今日はこれの話 • 入退職時のアカウント管理・運用 • GitHub/GitHub Enterprise管理
• AWSアカウントのControl Towerを使った管理 • etc… 3
今回話す内容 • DMARC基礎知識 • はてなのメール送信基盤の構成 • DMARCで対応すべきこと ◦ 主にDKIMの話 •
DMARCレポート可視化 • Postfixエラーログの監視 4
GMailの新送信者ガイドライン GMailに対して5000mail/day超を送るメール送信者に対し 2024/2/1から以下の制約などが課された • DMARCによってメールを認証すること ◦ ドメインにSPF・DKIMを設定すること • 簡単にsubscribeを解除できること •
Gmailへの送信時にTLSを利用すること • 迷惑メール率を一定以下に維持すること 5
基礎知識 6
DMARCとは メールに関する認証結果により信頼性を判断する仕組み 管理するドメインのメールに対し以下を定義できる • 認証失敗した際のメールの扱い • 認証状況のレポートの送信先 DMARC自体は認証の仕組みではない 7
DMARCで利用している認証方法 SPF • 送信元IPアドレスを認証する仕組み • 送信元ドメインに対してTXTレコードを設定する DKIM • メール本文・ヘッダを元にデジタル署名を作成する •
<selector>._domainkey.<domain>にTXTレコードを設定する 8
SPF(RFC 7208) 受信者は以下の手順で送信元を認証する • 送信元となるドメインを決める ◦ メールのヘッダやSMTPの情報から決める • 決定したドメインからSPFレコードを参照する ◦
対象となるドメインのTXTレコードを参照する • 実際の接続元IPと参照したIPアドレス範囲を比較する 9
DKIM(RFC 6376) DKIMでは以下の方法でメールの送信者を認証する 送信者はメール本文・ヘッダの内容を元に • 電子署名を作成 • DKIM-Signatureヘッダに記録 ◦ 署名に使用した秘密鍵に対応するセレクタ、署名に利用したヘッダなどを記録
受信者はメールのDKIM-Signatureヘッダの内容から • 対応する公開鍵をDNSレコードから取得 ◦ <selector>._domainkey.<domain> のTXTレコードを参照する • 署名を検証 10
DMARCで必要な対応 11
DMARCの対応でやるべきこと 自社ドメインで送信しているメール送信元を把握する • はてなの場合は以下で送信している ◦ 独自システム ◦ SendGrid ◦ HubSpot
◦ Salesforce ◦ Zendesk ◦ Gmail(Google Workspace)など 12
DMARCの対応でやるべきこと SPF: • 把握した送信元IPをSPFレコードに全て追加する ◦ SaaSの場合は各社のサポートページ等に設定内容がある ◦ 独自システムの場合はシステムの利用しているIGWを追加する DKIM: •
把握した送信元でに対応するDKIMレコードを追加する ◦ SaaSの場合、設定ページなどから設定項目を取得する ◦ 独自システムの場合はMTA毎に設定方法が異なる 13
DMARCの対応でやるべきこと SPF/DKIMの設定を確認するために以下を実施する • ポリシーとレポート先をDMARCレコードに登録 • レポートを確認し、未知の送信元を把握する 14
DMARCの対応でやるべきこと まとめると • 送信元を把握 • SPFを設定 • DKIMを設定 • DMARCレコードを設定して、漏れを潰していく
15
はてなのメール送信基盤 16
はてなのメール送信システム • ECS Anywhereで管理・運用 ◦ さくらのクラウド上のコンテナ実行基盤を利用 • サービスからはNLBを経由してSMTPでアクセス ◦ さくらのクラウドとAWS
VPCはTGWで疎通可能となっている ◦ コンテナからNLBのtarget groupへの登録の話は今回は割愛 • ECS TaskとしてPostfixが稼動 17
はてなのメール送信システム 18
はてなのメール送信システム ECS Anywhereを利用する理由は主にIPレピュテーション • AWSから払い出されるIPアドレスの信用問題 ◦ 一部のサービスはAWSのIPアドレスをbot判定している ◦ 割り当てられたIPが過去に悪用されていた可能性がある •
送信数の規模的にSaaSに置き換えが難しい 19
DKIMの対応 20
OpenDKIM PostfixでのDKIM対応にはOpenDKIMを利用する • Postfixとはmilter APIを利用して連携する • milter APIでの通信は以下どちらかで行う ◦ Unix
Domain Socket ◦ TCP Socket • 今回はsidecarとしてOpenDKIMコンテナを起動した ◦ 以下の点を考慮しsidecarとして起動することにした ▪ Postfixと同居させる場合コンテナ起動スクリプトが煩雑化する ▪ 個別のタスクとLBを立てる場合アクセス制御を考える必要がある 21
OpenDKIM sidecarの構成 22
OpenDKIM sidecar ECS Anywhereでは以下の点に注意が必要 • プロセス間でTCP通信する際はlinksの設定が必要 ◦ Fargateならこの問題はない ◦ 厳密にはポートマッピングをすれば通信可能ではある
▪ 外部のMTAから署名されたくないため今回はlinks設定を使用 ◦ linksを使う場合ネットワークモードがbridgeである必要がある 23
OpenDKIMの設定 • 送信ドメインのDNSにDKIMのレコードを追加しておく • opendkim.confに以下を設定する ◦ 署名すべきドメイン (Domain) ◦ 使う鍵ファイルのパス
(KeyFile) ◦ ListenするSocketの設定 (Socket) ◦ Postfixへの送信元IPレンジ (InternalHosts) • Postfixの main.cf で non_smtpd_milters にopendkimのSocketを指定 これらの設定はdocker-compose等でメール送受信環境を作って検証できる • 仮にDNSを設定していなくてもDKIM署名ができていることは確認できる ◦ その場合意味の無い署名ではあるが、DKIM署名の設定の確認には便利 24
バウンスメールのDKIM署名 バウンスメールはデフォルトではmilterが適用されない → main.cf で internal_mail_filter_classes を設定 • bounceを指定する •
迷惑メール率を下げるために考慮する必要がある ◦ 不特定多数に送るシステムではバウンスメールが大量発生しうる ▪ 受信側からレポートが送信されないことが保証できれば必要ない ◦ はてなではバウンスメールをAmazon SESに送っている ▪ Amazon SESからのDMARCレポートで発覚した 25
DMARCレポートの可視化 26
レポート可視化の構成 parsedmarc + OpenSearch + Grafanaで構築 dmarc-visualizer (https://github.com/debricked/dmarc-visualizer) として公開されているdocker-composeなどを参考に構築 parsedmarc:
• DMARCレポートの統計情報を取るためのツール • imapやS3などでレポート取得し、OpenSearchに送る 27
レポート可視化の様子 28
Postfixエラーログ監視 29
ログからのエラー判別 Postfixのログには以下が含まれている、これらでエラーが判別可能 • SMTP Reply Code ◦ 3桁の数値 210とか ◦
RFC5321で定義 • Delivery Status Notification(以下DSN) ◦ RFC3464で定義 ◦ 判別に使うのは status field で 「.」 区切りの3つの数値の組 ▪ 5.7.26 みたいなやつ ▪ RFC3463で定義 ▪ RFC3463で書かれているコード以外は IANA.org に一覧がある (RFC 5248) • https://www.iana.org/assignments/smtp-enhanced-status-codes/smtp-enhanced-status-codes.xhtml 30
Postfixのログ形式 CloudWatch Logs Insightsで調べてみると • SMTP Reply Codeは接続先MTAからのメッセージ中 ◦ said:
550 ….のような形 • DSNは以下2パターン、どちらかしかないこともある ◦ dsn=2.0.0 のような形式のパラメータ ◦ 接続先MTAが返すメッセージ中の 「said: 550-4.7.1 …」など 31
実際のログ形式 Feb 05 04:54:08 mailoutbound-fb postfix/smtp[1285887]: 38E2AC2616: to=<****@gmail.com>, relay=alt1.gmail-smtp-in.l.google.com[142.250.141.26]:25, delay=974719,
delays=974661/55/2.3/0.22, dsn=4.2.2, status=deferred (host alt1.gmail-smtp-in.l.google.com[142.250.141.26] said: 452-4.2.2 …(省略)) 赤字の部分がエラー判別に必要 32
ログ監視実装当時の記録 つらそう 33
Postfixのログメトリクス監視 cloudwatch-logs-aggregatorを使って監視 • CloudWatch Logsのログをメトリック化し、 Mackerelに送信するツール (引用元: https://mackerel.io/ja/blog/entry/cloudwatch-logs-aggregator) 34
cloudwatch-logs-aggregatorの設定 ログ集計用のクエリを作成 注意点としては以下 • DSNはパラメータ・メッセージのどちらかにしかないことがある ◦ →coalesce でどちらかを取る • メッセージ中のDSNの区切りは「-」「
」(空白)のいずれか ◦ →正規表現で頑張る… • SMTP Reply Codeとの組で監視する ◦ Reply CodeとDSNをconcatしてハイフンで繋ぐ • メトリクス名の「.」は別の字に置換したほうが良い ◦ → replace関数で「.」を「_」に置換 ◦ そのままだとメトリクスが同じグラフに入ってくれなくて見辛い 35
完成したグラフ 36
アラート設定 37
Gmailから来るメールエラー DMARC/DKIM/SPFの検査に失敗した場合 以下のSMTPエラーを返す • 550-5.7.26 ◦ このエラーには3パターンある ◦ メッセージからDMARC/DKIM/SPFのどのエラーか判別できる 38
アラート設定 ひとまず今回のGmailのポリシー対応では • 550-5.7.26 の数をアラート対象とした ◦ 現状ではとりあえず1件でも起きたら発火させている ▪ →今後の状況を見て調整していく •
アラートが発生したらとりあえずログを見に行く ◦ DMARC/DKIM/SPFのいずれのエラーなのかを把握するため 39
アラート設定の今後 • Gmail以外のDMARC関連エラーに対応したい ◦ 米Yahoo!等も厳しくなるので対応したい • アラート対応方法を固めたい ◦ DNSと設定と秘密鍵を確認するくらいしかやることがない ◦
設定が正しければ起こらないはずだが… • DMARC以外のエラーへの対応 ◦ 5xx系で致命的なものがあるなら検知したい 40
まとめ 41
まとめ • DMARC対応には以下が必要 ◦ メール送信元の把握 ◦ SPF/DKIM 認証の設定など ▪ 独自システムでDKIMを設定するためにはOpenDKIMを使う
◦ DMARCのレコード設定・レポート送信先の作成 • レポートから設定漏れを潰していく必要がある ◦ 可視化はparsedmarc + OpenSearch + grafana での構築が簡単 ◦ DMARCを可視化してくれるSaaSに頼るのも良い 42
まとめ • メールのログ監視は難しい ◦ 独自基盤でやる場合は避けられない ◦ 完璧にやるなら各メールサービス毎にエラーの対応の把握が必要 • DMARC対応はちゃんとやろう! ◦
Gmailを使っている顧客に重要なメールが届かないと大変 ◦ 今後ガイドライン適用範囲が変更される可能性もあるため… 43