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.7k
はてなにおけるメール基盤と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
640
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
167
49k
Designing for Performance
lara
604
68k
Six Lessons from altMBA
skipperchong
26
3.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
37
1.8k
Unsuck your backbone
ammeep
668
57k
Imperfection Machines: The Place of Print at Facebook
scottboms
264
13k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
GraphQLの誤解/rethinking-graphql
sonatard
66
9.9k
Scaling GitHub
holman
458
140k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.6k
Code Reviewing Like a Champion
maltzj
519
39k
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